2023年7月29日土曜日

unity UIを非表示にする

 unityでUIを非表示にする方法

  1. シーンのUIの親をキャンパスにする
  2. 以下のコードを実行する

Canvas cv;

cv = GameObject.Find("CanvasYSC").GetComponent<Canvas>();

cv.enabled=false;

Canvasとenabledを利用することで高速に非表示にできます

2023年7月3日月曜日

Unity TextMeshProをGetComponentできない

 Unity TextMeshProをGetComponentできない問題。

新しいUnityはUIからボタンを作成するとTextMeshProがセットで子に入る

このTextMeshProはTextの進化版です。

古いUIと混同しているためかゲットコンポーネントで取得できません。

解決方法

シーンのゲームオブジェクトからTextMeshProを削除しTextを追加する。

所感

新しい機能をデフォにされると既知のコードが使えなくて不便です。

2023年7月1日土曜日

C#Dictionaryを文字配列型に変換してシリアライズ可能にする

unityC#のハッシュテーブルのDictionaryは直接シリアライズできません。

Dictionaryをゲームで保存したい場合は以下の方法があります。

  1. 手間大 Dictionaryクラスをシリアライズ可能に書き換える
  2. 手間中 DictionaryをXMLに変換して保存する
  3. 手間小 Dictionaryを文字配列に変換する

3番の文字配列に変換のサンプルです

 //using System.Collections.Generic;

            //Dictionaryを二つの文字型一次配列に変換する

            Dictionary<string, string> dic = new Dictionary<string, string>

            {

                { "1", "いち" },

                { "2", "に" },

                { "3", "さん" }

            };

          

            //変換する配列を作成する

            string[] keys = new string[dic.Keys.Count];

string[] vals = new string[dic.Values.Count];

//二つの配列に変換する

dic.Values.CopyTo(vals, 0);

dic.Keys.CopyTo(keys, 0);

Dictionary<string, string> newDic = new Dictionary<string, string>();

toDictiotnary(keys, vals, newDic);

Debug.Log(newDic["2"]);

public void toDictiotnary(string[] keys, string[] vals, Dictionary<string, string>  dic)

    {

if (keys.GetLength(0) == vals.GetLength(0))

        {

for(int i = 0; i < keys.GetLength(0); i++)

            {

dic[keys[i]] = vals[i];

}

        }

    }

結果

所感

ディグショナリは便利ですがC#の仕様が固いです。

ハッシュテーブルはディグショナリと互換がありますが推奨されていません。

public Dictionary<string, string> d1,d2;

ディグショナリはハッシュテーブルと互換性があるので簡単に置き換えられます。