2023年10月5日木曜日

Unity if StartsWith("")が動作しない

 StartsWithに空文字は使えません。

使用例

if (str.StartsWith(""))すべての文字をイフブロックに入れてしまう。

if (str.Equals(""))空文字だけをイフブロックに入れる。

解決方法

 StartsWithは文字列の先頭を判別してくれる関数です。

空文字の判断はEqualsを使います。

2023年9月26日火曜日

UTF-8-Macの濁点半濁点ユニコードの注意

 Macのファイル管理に使われているUTF-8-Macですが。

 UTF-8-Macは濁点自体が一つの文字として扱われています。

文字数の例

  • バイオリン  UTF-8-Macでは6文字。通常のユニコードでは5文字
  • パパイヤ  UTF-8-Macでは6文字。通常のユニコードでは4文字

注意点

 UTF-8-Macは通常のUTF-8と濁点以外互換性があります。

 UTF-8でMacのファイル名を検索すると濁点半濁点のファイルが除外されてしまいます。

検索自体は働くのでエラーが発見しにくいです。

所感

中途半端な互換性があるためバグを見落としやすいです。

Appleの独自規格は開発者の天敵です。

2023年9月11日月曜日

配列にAddListenerを使う際の注意

間違った使い方

  for (i=1:i<5:i++)

    {

        buttons[i].onClick.AddListener(() => buttonClick(i)); 

    }

五つのボタンはクリック時に引数(4)でbuttonClickが実行される

正しい使い方

for (i=1:i<5:i++)

    {

        int count = i;  //ローカル変数にいれる

        buttons[i].onClick.AddListener(() => buttonClick(count));  //引数にローカル変数使う

    }

5つのボタンは異なる引数(0〜4)で実行される

2023年9月8日金曜日

同名のオブジェクトがシーンに存在する場合のNullReferenceException:

 同名のオブジェクトがシーンに存在する場合に

複数の個所でFindからインスタンスを得ると競合してしまう


メニュー画面とセーブ画面に使われている同名のボタン(閉じるボタン)に対してクリックリスナーを設定した場合。後から設定されるクリックリスナーが適応される。

>NullReferenceException: Object reference not set to an instance of an object

YSSave.MyOnClick (System.Int32 index) (at Assets/YSSave.cs:34)

YSSave.<Start>b__4_1 () (at Assets/YSSave.cs:19)

UnityEngine.Events.InvokableCall.Invoke () (at <f1212ad1dec44ce7b7147976b91869c3>:0)

UnityEngine.Events.UnityEvent.Invoke () (at <f1212ad1dec44ce7b7147976b91869c3>:0)

UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:70)

UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:114)

UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:57)

UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:272)

UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)

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;

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