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

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

Unityで貼り付けたボタンをスクリプトからクリックする方法

Unityで貼り付けたボタンをスクリプトからクリックしたい場合はExecuteEvents.Executeを使って次のような感じで実装できるみたいです。

使い方

import UnityEngine.UI;
import UnityEngine.EventSystems;

public Button button; // クリックしたいボタン
void Example()
{
  // ボタンをクリック
  ExecuteEvents.Execute(
    button.gameObject,
    new PointerEventData(EventSystem.current),
    ExecuteEvents.pointerClickHandler);
}

ちなみに、ボタンにフォーカス(Enterキーでクリックできる状態)したい場合は
SetSelectedGameObjectが使えます。(過去記事

リンク

Unity – Scripting API: EventSystems.ExecuteEvents.Execute
https://docs.unity3d.com/2018.3/Documentation/ScriptReference/EventSystems.ExecuteEvents.Execute.html

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