UnityNovelProj Unity で VisualNovel を作成する

url: https://github.com/ganyariya/gnovel/pull/17
title: "InputPanel を実装してユーザ入力を取れるようにする by ganyariya · Pull Request #17 · ganyariya/gnovel"
host: github.com
favicon: https://github.githubassets.com/favicons/favicon.svg
image: https://opengraph.githubassets.com/653f3c379b011770d70844a551073e3ba3a9ca19ee15e7eee59359d7dad1c948/ganyariya/gnovel/pull/17

この動画でおこなうこと

ユーザが文字を入力できる InputPanel を実装します。

UI としての InputPanel は 6-Controls 配下に作成します。 TextMeshPro を利用して、下記の UI を実装します。

  • 6-Controls
    • Button (次に進める)
    • InputPanel
      • Title
      • Text
      • AcceptButton

それとは別にスクリプトとしての MonoBehaviour InputPanel を実装します。 この InputPanel.cs では SerializedField として 上記 UI の参照をもち、それらについて作用を行います。

Logical Line

Logical Line というものを導入しています。

これは

  1. ダイアログファイルの処理を一時的に停止し、Logical Line の処理が終わったら次に進む
    1. InputPanel はユーザの入力を待つ
  2. インタラクション機能

を指すようです。

TextMeshPro によるユーザ入力

TMP_Text など、 TextMeshPro や Button コンポーネントにはイベントハンドラが受け取れる UnityEvent が定義されています。 たとえば、 onClick, onValueChanged です。

これにユーザメソッドを登録することによって、そのイベントが発火したいときに実行しないものを設定できるようです。

        [SerializeField] private CanvasGroup _canvasGroup;
        [SerializeField] private TMP_Text _titleText;
        [SerializeField] private TMP_InputField _inputField;
        [SerializeField] private Button _acceptButton;
 
        private CanvasGroupController _canvasGroupController;
 
        public void Start()
        {
            _canvasGroupController = new CanvasGroupController(this, _canvasGroup);
            _canvasGroup.alpha = 0;
            _acceptButton.gameObject.SetActive(false);
 
            _acceptButton.onClick.AddListener(OnAccept);
            _inputField.onValueChanged.AddListener(OnInputChanged);
 
            Hide();
        }
 

UnityEvent を継承した専用のイベントクラスを定義しています。 Button.cs だと下記のように ButtonClickedEvent が設定されています。

        public ButtonClickedEvent onClick
        {
            get { return m_OnClick; }
            set { m_OnClick = value; }
        }
 
        [Serializable]
        /// <summary>
        /// Function definition for a button click event.
        /// </summary>
        public class ButtonClickedEvent : UnityEvent {}
 

AddListener(OnAccept) を実行すると、 OnAccept メソッドが UnityAction として渡されて登録されています。 UnityAction, UnityEventBase などを見ないと詳しい中身はわからなそう…><

  /// <summary>
  ///   <para>Add a non persistent listener to the UnityEvent.</para>
  /// </summary>
  /// <param name="call">Callback function.</param>
  public void AddListener(UnityAction call) => this.AddCall(UnityEvent.GetDelegate(call));