Androidビルドで「Android SDK is missing required platform API」エラー出た時の対処法

起きた事象

普段使っているPCではないPCで、
androidでビルドしようとしたら以下のエラ―出てビルドできなかったのでメモ。

一番左の「Update Android SDK」を押す!これで解決する人はおしまい。


対処法

「Update Android SDK」おしたら、以下のエラーがUnityのコンソールに吐き出された。
AndroidSDKのUpdateもうまく行かなかったらしい。
その理由が「JAVA_HOMEがなく、javaのPathが通ってないよ 」とエラーが出てる。

Exception: Unable to install additional SDK platform. Please run the SDK Manager manually to make sure you have the latest set of tools and the required platforms installed. 
C:\Program Files\Unity\Hub\Editor\2020.3.35f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\bin\sdkmanager.bat "platforms;android-33", exit code 1
Powershell non elevated output:

Arguments are "C:\Program Files\Unity\Hub\Editor\2020.3.35f1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\tools\bin\sdkmanager.bat" "platforms;android-33" 
�x��: WARNING: Administrative privileges required
Command finished with exit code: 1

Powershell elevated output:
<psElevated-null>
Batch output:


ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

①JDKのインストールをしているか確認

Unity Hub を起動します。
Installs から 使っているUnityの歯車をクリックして「Add modules」を開きます。

「Android Build Support」の「Android SDK & NDK Tool」、「OpenJDK」がインストールされているかを確認します。
されてなかったらしよう。

②Unity で SDK の設定がされているか確認

Edit -> External Tools の Android の設定項目の各パスが設定されていることを確認。

されていない場合は、設定します。(普通は自動でされている)
既にJDKがインストールされているので、windowsなら以下あたりにインストールされているはず。

【Unit Hub のインストールパス】\Unity\Hub\Editor\【使っているUnityのバージョン】\Editor\Data\PlaybackEngines\AndroidPlayer\

③JAVA_HOME,Path の設定をする

環境変数の設定をします。

win10なら以下を参照。 qiita.com

JAVA_HOME・・・上述した②で設定した「JDK Installs with Unity」に設定したパスを設定
・Path・・・%JAVA_HOME%\bin を追加

コマンドプロンプト等で、set JAVA_HOME で設定したパスが表示されれば、正常に設定されてます。


ここまでやったらandroidビルドできるようになると思われる。
ちなみにAndroid Studio を別途インストールしたりする必要は今現在はないです。
(一時そういう時代があった気がする)

【Live2D入門②】Live2Dで作られたモーションをUnityで再生する

▼前回の続き。引き続きサンプルデータとしてマークくん「mark_free_jp」を使います。 www.snoopopo.com


Live2D Cudisum エディタ をDL

今回からLive2D Cudisum エディタ側も使っていくので、以下からダウンロードしておく。

www.live2d.com


モーションファイルを追加

サンプルの「mark_free_jp」の中(mark_free_jp\runtime\motion)にモーションファイル(json)があるので、Unityにインポートしておきます。
無事インポートが終わると自動でアニメーションClipのファイルが作成されます。

サンプルでは「mark_m01.motion3」~「mark_m06.motion3」まで6つのモーションがあるようです。
このjsonファイルを出力したLive2dのプロジェクトファイルを Live2D Cudisum エディタで見てみるとどういったモーションなのかがわかります。

とりあえずAnimatorでモーションの再生する

モーションの再生方法は色々あるが、とりあえず手っ取り早くAnimatorで再生してみる。

モーションを、前回の記事で作ったゲームオブジェクトにドラックアンドドロップする

Animatorが自動で作られる。

とりあえずこのままなにもせずゲームを再生すればモーションが再生されます。

【Live2D入門①】Live2Dのモデルをunityで表示する

サンプルをダウンロード

www.live2d.com

サンプルデータは上記からダウンロードすることができる。

今回は、一番難易度が低い「マークくん」をダウンロードしてみた。→「mark_free_jp」というファイル

Unityで2Dプロジェクトを作成

unity hub で new Project

今回は普通の(URPじゃない)2D テンプレートを選び、任意のプロジェクト名を付けて Create Project をする

使う用途によりますが、今回はプラットフォームをandroidに変えておきます。

Live2D Cubism SDK for Unity を導入

www.live2d.com

CubismSdkForUnity-4-r.5.unitypackage がDLされる(数字はバージョンで変わると思われます)

Assets -> import Package -> Custom Package からDLしたパッケージを選んでインポートする

インポートされるとこのようになります。

モデルのインポート

最初にサンプルとしてDLしておいたマークくんのモデルを取り込みます。
DLしたファイル「mark_free_jp」をそのままProjectビューのAssets配下の任意の場所へドラックアンドドロップします。

今回はとりあえずモデルの取り込みのみ行いたいため
以下のファイルだけインポートしました。

※今回はAssets直下に置いてます

読み込み時にプレハブが自動で作られます。

プレハブをシーンに配置して、ゲームを起動するとモデルが表示されます。
※初回はゲームを起動するまでは表示されないらしい。

マークくんの目が表示されない時


↑こんな風に表示されてしまった場合、おそらく最初のプロジェクト再生で2Dではなく、3Dを選んでしまっている可能性が高い。

そんなときは、カメラの設定のProjectionを「Orthographic」に変更すれば表示される。

【Unity】アセットがどこで使われているか確認する方法

・この画像どこで使ってたっけ?
・この画像使ってない気がするから消したいけど、本当に使ってないけ?
 (てきとーに消して動かなくなる機能とか出てきたらやばいな…)

っていう場面はよくあると思うんだけど、そんな時に私がやっていること。

アセットのGUIDを grep する

grep -r [GUID] [Assetsとか指定したいフォルダを指定]

GUIDはどこでわかる?→metaに書いてあるよ!

調べたいアセットと同じフォルダ内にあるmetaをテキストエディタで開いて確認できる


実行例
「batsu.png」という画像は、common.spriteatlas で使われていることがわかる。

$ grep -r 619c2c1970fdcf7418b5ca361000652b ./Assets/
./Assets/Resources/SpriteAtlas/common.spriteatlas:  - {fileID: 21300000, guid: 619c2c1970fdcf7418b5ca361000652b, type: 3}
./Assets/Sprite/batsu.png.meta:guid: 619c2c1970fdcf7418b5ca361000652b

文字列検索

ファイル名の文字列検索もする。

Resouces フォルダにいれているものはソース上で以下のようにファイル名を指定しているはずなのでこれに対応するため。

Resources.Load<TextAsset>("Text/jsonFile01");

ちなみに、アセバンだったりでファイル名を文字列で指定して使っているところがあるので、Resouces 配下にあるファイルではなくてもした方がいい。

【自動化】JenkinsでFirebase App Distributionにアプリをデプロイする(Windows10)

Firebaseのサービスの一つに「App Distribution」というものがある。

DeployGate や TestFlight 等使ったことがある人ならわかるが、それらと同じような機能だ。
apkやipaをビルド→「App Distribution」にデプロイ→テスターや開発者に届くメール内のURLにアクセスすることで即インストールできる。 というもの。

そして今回は、「App Distribution」にデプロイ の部分を自動化するために、jenkinsを使う。
最終目標は、jenkinsで定期的にビルドをし、自動で「App Distribution」にデプロイする 環境を作ること。
毎朝、最新のビルドをPCを操作しなくても確認できる、そんな環境を作って開発を効率よくさせること。

今回の記事は、jenkinsで「App Distribution」に自動デプロイ する部分についてのみ記載しています。

  • 公式リファレンス
  • firebaseコマンドを使える環境を作ろう
  • アプリIDを確認しよう
  • jenkinsでログインするために認証トークンの発行しよう
  • firebaseコマンドでアプリをデプロイしてみよう
  • jenkinsからアプリをデプロイしてみよう
  • 引っかかったところ
    • スタンドアロン バイナリ(exe)だとjenkinsで実行できない
    • 既にデプロイされているアプリと同じものはデプロイされない
続きを読む

【C#】C#のenumでメソッドやフィールドを定義する方法

自分はjava出身のなので、C#のenumがメソッドやフィールドが定義できないのが不便だったのですが、
拡張メソッド使ってjavaのenumに近いことができる。
現場でもこれを使っている人が多いので割とスタンダードな方法っぽいです。


まずはこんなenumを例にして説明を書いていくぞ。

public enum SHOP_TYPE
{
    DECO, //デコ
    GROUND, //床
    FOOD, //ごはん
    GOOD, //備品
}

基本的な方法

まずは一番シンプルな方法。このenumの拡張メソッドを作ります。

public static class EnumExtension
{
    //ショップ商品タイプ名
    public static string GetShopTitle(this SHOP_TYPE shopType)
    {
        switch (shopType)
        {
            case SHOP_TYPE.DECO: return "デコ";
            case SHOP_TYPE.GROUND: return "床";
            case SHOP_TYPE.FOOD: return "ごはん";
            case SHOP_TYPE.GOOD: return "備品";
        }
        return "";
    }

    //ショップ商品タイプごとの説明
    public static string GetShopInfo(this SHOP_TYPE shopType)
    {
        switch (shopType)
        {
            case SHOP_TYPE.DECO: return "デコを購入して庭を飾り付けよう";
            case SHOP_TYPE.GROUND: return "庭の地面を変更するよ";
            case SHOP_TYPE.FOOD: return "キャラクター達の食料";
            case SHOP_TYPE.GOOD: return "いろいろなものが売っているよ";
        }
        return "";
    }
}

▼使う側はこんな形で使える

//unityなら「デコ-デコを購入して庭を飾り付けよう」とコンソールに表示されます
Debug.Log(SHOP_TYPE.DECO.GetShopTitle() + "-" + SHOP_TYPE.DECO.GetShopInfo());

この実装方法の良くないところ

ただこの実装方法には、懸念がある。
enumの定義を追加したら、拡張メソッドのcase文も追加する必要があるが、追加し忘れる可能性がある。
javaなら必ず各メソッド内の内容を定義しなおさないとコンパイルが通らない状態が作れるが、上述した方法だと、
case文に追加しなくてもコンパイルは通ってしまうので、実行するまでバグに気づくことができないのである。

とはいえ、これを解決しようとするとこのくらいの実装が必要になってくる↓

bleis-tift.hatenablog.com

【Unity】スクショとるエディタスクリプト

スクショとるエディタスクリプト

プロジェクトのルートディレクトリの直下(Assetsとかと同じ階層)に「ScreenShot」フォルダが作られ、そこに配置される。

using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Runtime.CompilerServices;

public class ScreenShotCapturer : MonoBehaviour
{
    private const string Path = "ScreenShot/";
    [MenuItem("MyTools/Caputure ScreenShot")]
    private static void Capture()
    {
        var assetPath = string.Format(System.IO.Path.Combine(Path, "ScreenShot_{0}.png"),
            DateTime.Now.ToString("yyyyMMddHHmmss"));
        SafeCreateDirectory(Path);
        ScreenCapture.CaptureScreenshot(string.Format(assetPath));
        Debug.Log($"スクリーンショットを保存しました: {(Application.dataPath).Replace("Assets", "") + assetPath}");
    }

    private static DirectoryInfo SafeCreateDirectory(string path)
    {
        var fullPath = (Application.dataPath).Replace("Assets", "") + path;
        return Directory.Exists(fullPath) ? null : Directory.CreateDirectory(fullPath);
    }
}

git ignore に追加を忘れないように

git管理しているプロジェクトなら、「ScreenShot」フォルダはignoreしておこう:)