「Unity」カテゴリーアーカイブ

【Unity】プレハブのボタンタッチ処理

タッチする事自体は問題無いのですが、

一番ハマったのは画像の差し替えでした。

二つの画像を重ねるように配置し、レイヤーの切り替えで表示を切り替えようと思ったのですが、

どうも上手くいかないみたいで。

レイヤグループとか美味く使えていれば良かったのかもしれないですけど。

こちらのサイトにスプライトを差し替える方法が書いてありました。

https://qiita.com/motsat/items/927a4d2682765555b80d

    public void TouchCare()
    {
        farmData.care = true;
        var r = CareButton.GetComponent<SpriteRenderer>();
        r.sprite = ClickSprite;
    }

見た目全く問題なし。

これで行きましょう。

【Unity】プレハブのスクリプトにパラメータを渡す。

プレハブにこんな感じのスクリプトを作成して、プレハブのオブジェクトにアタッチ。

    public void Create(Farm farm)
    {
        farmData = farm;
    }

プレハブの使用元ではこんな感じでパラメータを渡せる。

            GameObject farm = Instantiate(prefabObj, new Vector3(xPosition, yStartPosition - yPositionInterval * count , 0), Quaternion.identity);
            var c = farm.GetComponentInChildren<FarmTouchController>();
            c.Create(f);

GetComponentInChildren<>を使用するのがポイントだと思う。

この動作が決まったときはガッツポーズしてしまったよ。

【Unity】初期化シーケンスの実装。

シーンを一つ、タイトルシーンを追加し、

その処理の中で初期化シーケンスを行うようにしました。

    void Update()
    {
        if(!gameManager.Initialized)
        {
            switch(sequence)
            {
                case Sequence.Start:
                    sequenceStart();
                    break;
                case Sequence.MasterInitialize:
                    masterInitialize();
                    break;
                case Sequence.UserdataInitialize:
                    userInitialize();
                    break;
                case Sequence.Complete:
                    FadeManager.Instance.LoadScene("HomeScene", 0.3f);
                    sequence = Sequence.End;
                    break;
                case Sequence.End:
                    gameManager.Initialized = true;
                    DontDestroyOnLoad(gameManager);
                    break;
            }
        }
    }

Updateのループの中で初期化処理を行い、動作が完了してから次の動作を行う、という感じです。

なぜこうする必要があるかというと、

        var request1 = UnityWebRequest.Get(Application.streamingAssetsPath + "/item.csv");
        request1.SendWebRequest().completed += (AsyncOperation operation) => {
            Items = ItemLoad(request1.downloadHandler.text);
            endflg[0] = true;
        };

UnityWebRequest.Get()の処理が非同期で行われるため、Update()の処理を抜けないと実行されません。

で、初期化が完了すると、ホーム画面に遷移。

【Unity】Androidで外部ファイルを取り込む処理。

PCではファイルストリームで読み込むことが出来たのですが、

Androidでは使用できないことが判明。

なので、ファイル読み込み処理を変える必要があります。

https://teratail.com/questions/284587

UnityWebRequestを使用して、HTTPリクエストのようにして読み込ませる必要があるとのこと。

これを使用した場合、読み込み処理は非同期で行われるので、初期化のタイミングを美味く取らないと、正しく動作しないわけで、

なかなかめんどくさい。

たぶん、ここらへんもうちょっとひねらないとダメなんだろうな。

パラメータ表示できたよ。

【Unity】画像をクリッピングする。

こちらの記事を参考にしました。

https://miyagame.net/sprite/

対象の画像をアセットの中から選択し、スプライトモードを複数に設定。

スプライトエディターのボタンを押す。

スライスを選択し、今回は32×32ピクセルの画像が並んでいるので、この設定でスライス。

この状態で適用。

この分割されたパーツを配置すればOK。

【Unity】シーン間でもデータを共有させたい。

こちらでシングルトンの実装を行ったのですが、

これだけだとシーンの中では共有できるけど、

シーンが切り替わるとデータを共有出来ないっぽい。

なので、DontDestroyOnLoadを使いました。

DontDestroyOnLoadを使用すると、シーンが切り替わってもデータは保持されるらしい。

しかし、使い方を間違えると、DontDestroyOnLoadに同じデータが溜まっていくらしいけど、それはそのとき考える。

今のところ問題ないっぽい。

【Unity】Jsonでマスターデータを読み込ませる。

Unityでマスターデータを読み込ませるのに、前のプロジェクトで作成していたcsv、jsonを読み込ませます。

データはアセットの中に格納しておきます。

csvの場合は前のプロジェクトと全く同じ。

いろんなサンプルコード公開されているけど、なんでファイルストリームを扱うのにusingを使わないんだろう?

Jsonは元々UnityにはJsonUtilityという、それはそれは高速なJsonライブラリがあるのですが、

どうも気難しい性格みたいで、どんなに頑張っても作成済みのJsonファイルをオブジェクトに展開できない。

なので、結局、前と同じJson.Netを使用しました。

組み込み方法は、アセットストアにJson.Net for Unityのアセットが公開されているので、これをダウンロードする。

https://assetstore.unity.com/packages/tools/input-management/json-net-for-unity-11347?locale=ja-JP

ZIPファイルからdllをPluginsにコピーして~

とか、いろんなサイトに書いてありますが、そんな手順は不要です。

一度このアセットをダウンロードしてしまえば、前と同じコードでJsonを展開できます。

初めからこうすれば良かった。