Programming」カテゴリーアーカイブ

プログラミング全般に関するカテゴリーです。

UnityでキーボードによるUIのフォーカス移動方法

Unityでキーボードを使ってUIのフォーカスを移動したい場合はNavigationが使えるみたいです。

Inspectorから設定することもできますが、スクリプトから設定したい場合は次のような感じで実装できます。

Navigation navigation = new Navigation();

navigation.mode = Navigation.Mode.Explicit;
navigation.selectOnUp = button1; // 上キーでフォーカスを移したいところ
navigation.selectOnDown = button2; // 下キーでフォーカスを移したいところ
navigation.selectOnLeft = button3; // 左キーでフォーカスを移したいところ
navigation.selectOnRight = button4; // 右キーでフォーカスを移したいところ

button.navigation = navigation;

こんな感じで設定すれば、buttonにフォーカスがある時に上キーを入力するとbutton1にフォーカスが移動し、左キーを入力するとbutton3にフォーカスが移動します。

SetSelectedGameObject

ちなみに、最初起動したばかりの段階ではどこにもフォーカスがありません。

初期値としてどこかにフォーカスを設定したい場合はSetSelectedGameObjectを使って設定できます。

参考: UnityのUIでフォーカスを移したい場合はSetSelectedGameObject

Unityでセーブデータを保存したい場合はJsonUtilityが便利

Unityでセーブデータを保存したい場合はJsonUtilityを使うと便利です。

使い方は次のような感じです。

public class ExampleData
{
  public string Name;
  public int Value;
}
public class Example : MonoBehaviour
{ 
  void Start()
  { 
    var data1 = new ExampleData { Name = "abc", Value = 123 };

    var json = Save(data1);
    Debug.Log(json);

    var data2 = Load(json);
    Debug.Log($"Name={data2.Name} Value={data2.Value}");
  }

  ExampleData Load(string json)
  {
    return JsonUtility.FromJson<ExampleData>(json);
  }

  string Save(ExampleData data)
  {
    return JsonUtility.ToJson(data);
  }
}

実行結果

{"Name":"abc","Value":123}
Name=abc Value=123

ArgumentException

MonoBehaviourを継承したクラスでJsonUtility.FromJsonを使うとArgumentExceptionという例外が発生します。久し振りに使うと忘れて悩むことがあるので気を付けてください。

public class ExampleData : MonoBehaviour
{
  public string Name;
  public int Value;
}

リンク

Unity – Scripting API: JsonUtility
https://docs.unity3d.com/ScriptReference/JsonUtility.html

C#で配列のサイズを調べる方法

配列のサイズを調べる方法

Lengthを使って配列のサイズを調べることができます。

int[] array1 = new int[]{ 1, 2, 3, 4, 5 };

Debug.Log($"Length = {array1.Length}");

実行結果

Length = 5

ジャグ配列の場合

int[][] array2 = new int[][]{
  new int[] { 1, 2, 3 },
  new int[] { 4, 5, 6, 7 }
};

Debug.Log($"Length = {array2.Length}");
Debug.Log($"Length = {array2[0].Length}");
Debug.Log($"Length = {array2[1].Length}");

実行結果

Length = 2
Length = 3
Length = 4

多次元配列の場合

多次元配列の場合はGetLengthを使って調べられます。

int[,] array3 = new int[,]{
  { 1, 2, 3 },
  { 4, 5, 6 }
};

Debug.Log($"Length = {array3.GetLength(0)}");
Debug.Log($"Length = {array3.GetLength(1)}");

実行結果

Length = 2
Length = 3