かさたな日記

主にUnityを使った制作記録。書いてる人は初心者です。一緒に頑張ろう。

自分用Unityメモ:Androidビルドテスト中に発生したエラーのまとめ

そもそも、Package Nameがちゃんと正しいか、(com.CampanyName.ProductName)
Preference > External Tool に SDKJDK のアドレスがちゃんと正しく入ってるかとか
keystore設定してるかとか、そのパスワードは正しいかとかは先にチェックしました。



その1。
UnityException: Unable to install APK! Installation failed. See the Console for details.
↑みたいなメッセージが出てて来て build and Run で実機に転送できない。


ボクの場合は、
PlayerSetting > OtherSetting > Install Location を
AutoMatic に変えたら通るようになりました。


ただ、Android studioと実機のバージョンによっては
SDKに起因するケースがあるのでその場合は、
SDKのtools差し替えで対処することになりそうです。

...もう修正されたかも。
UnityだとSDK23、SDK24間の互換性がどうとか...(曖昧ですみません





その2。
Could not extract GUID in text file projectsettings/projectsettings.asset at line 44.
なるエラーが出てビルドが成功しない。
(最後の行数はプロジェクトの設定によって変動します)


プロジェクトのフォルダ/Projectsettings/projectsettings.asset を
テキストエディタかなんかで開いて、
該当の行のこれ↓を、

m_SplashScreenBackgroundLandscape: {fileID: 1, guid: 00000000000000000000000000000000,
type: 0}


m_SplashScreenBackgroundLandscape: {fileID: 0}
こう直したら通るようになりました。


横画面のスプラッシュスクリーン背景画像がないとこうなるのかな...
ちょっと不具合っぽいぞ。
場合によってはこの下の行の縦画面用のところがおかしくなる場合もあったり...。
(m_SplashScreenBackgroundPortrait ってトコね)



引っかかった大きめのエラーはこのくらいでした。
雑多な細かいやつは再起動したら直ってたりして原因がよくわかんないのも多いです...。

自分用Unityメモ:タップした場所がuGUI上か調べる

タップやスワイプ、ドラッグをした時に何か動作をさせたい、
でも押した場所にボタンとかがあったら反応して欲しくない、
そんな感じの時に使うメソッド。

 ※ちょっと修正。
そもそもEventSystemが置かれてないときの処理を追加しました。

using UnityEngine.EventSystems;
//↑この名前空間を使うよ、と言っておく。


    //タップした先にあるものを入れるリスト。
    // 今回はコストが気になるのでフィールドにするよ
    // あんまり頻繁に判定しないならメソッドの中に入れてもいいよ
    private List<RaycastResult> raycastResults = new List<RaycastResult>();

    public bool IsPointerOnUGUI(Vector2 screenPosition)
    {
        // EventSystemがない = uGUIがないときは遮るものがないので処理そのものをさせないよ
    if (EventSystem.current == null) { return false; }

        // EventSystemにタップした座標を設定するよ
        PointerEventData eventDataCurrent = new PointerEventData(EventSystem.current);
        eventDataCurrent.position = screenPosition;

        // タップ地点の先にあるものを調べるためにRayCastするよ
        EventSystem.current.RaycastAll(eventDataCurrent, raycastResults);
        bool result = raycastResults.Count > 0;

        raycastResults.Clear(); //リセットしておくよ
        return result;
    }

引数には タップの時はInput.GetTouch(0).position、
マウスの操作の時は Input.mousePosition を入れればOK...のハズ。

Textなど、タップを遮らなくていいUIは Raycast Targetのチェックを外しておけば大丈夫。


シングルトンやstaticなメソッドにしておいてどこからでも呼べると便利かもしれません。

自分用Unityメモ:クラスをシリアライズしてインスペクタから編集

クラスをシリアライズすることで
インスペクタから内容を直接編集することが出来るみたい。

やり方はシリアライズしたいクラスの前に

[System.Serializable]

を付けるだけ。

public class Test : MonoBehaviour


       public List<hoge> hogeList = new List<hoge>();

        [System.Serializable]
        public class hoge
        {
            public string key;
            public int value;
        }

}


上の例ではListになったhogeクラスの内容を
インスペクタから設定することが出来るようになります。

現在unityではDictionaryはインスペクタに対応してないみたいですが、
これを使えば疑似的にDictionaryっぽい使い方もできそうです。
ちょっと回りくどいケド...

public int GetHogeValue(string key)
{
    return hogeList.Find(x => x.key == key).value;
}

こんな感じで中身を持って来れます。
ただ、クラスの中に要素が多い場合はクラスそのものを取得した方が良さそうです。


パフォーマンスは...どうだろうか...