lime雑記

ゲーム開発、その他雑記。

【Unity】LimeLibraryでUIを実装する : 紹介編

概要

先日、自分用に作成したライブラリにUI関連のモジュールを追加しました。
github.com
このモジュールを使用したUIを実装例を少しずつ解説していきたいと思います。
今回はどのようなことができるかの紹介です。

Unityバージョン

Unity 2021.3 以降

使用ライブラリについて

このライブラリはコード内で以下のライブラリを使用させていただいています。
同時に導入が必要になりますのでご注意ください。

できること

UIApp・UIViewの定義

UIApp

1つのUI機能を定義します。
(インベントリ、スタートメニュー、HUDなど)

左上のヘッダー、左側の一覧、右側の詳細全て含めて1つのUIApp

UIViewを1つ以上持っています。

また、UIAppを生成するときのモードとして

  • 既存のUIAppと並行して生成する
  • 既存のUIAppは非表示にして生成する(スタック方式)
  • 常に存在する独立したものとして生成する

上記を選択できます。
スタック方式にすることで、メニュー画面→オプション画面→メニュー画面という遷移が簡単に実装できたりします。

UIView

1つの画面やウィンドウを定義します。
(インベントリ内のアイテム一覧ウィンドウ、アイテムに対するアクション選択ウィンドウなど)

赤線で囲っている部分がそれぞれViewとして定義されている

また、UISingleViewというUIAppを必要としない独立したViewも定義されており、1つの画面で実装可能なシンプルなものはこちらでも実装可能です。

イベントの取得

UIApp、UIViewともに以下のイベントを簡単に取得可能です。

  • StartShow
  • EndShow
  • StartHide
  • EndHide
  • Focus(UIViewのみ)
  • Unfocus(UIViewのみ)
  • Destroy

UIApp、UIView内部で表示、非表示の概念が実装されているため、継承することでこれらのイベントが簡単に取得可能になります。

表示時開始時にメッセージウィンドウの画像を切り替える処理

表示非表示アニメーションの挿入

先ほど、表示、非表示の概念が実装されているという話をしましたが、この時のアニメーションの挿入も可能です。
また、シンプルなフェードアニメーションであれば1行でセットアップできます。

protected UniTask OnInitialize() {
  // 0.1秒でCanvasGroupをフェードさせる
  Animator.RegisterShowHideFadeAnimation(CanvasGroup, 0.1f);
}

フローの実装

1画面に関する処理はUIViewの中に書けば問題ないですが、複数のViewにまたがる処理もあるかと思います。
そのような場合にUIAppFlowというステートマシンに近い概念を用意しており、UIAppに紐づく形でどのステートでどのViewを表示するかというフローを定義することができます。

ダイアログの実装

UIViewをダイアログとして表示することが可能です。
(ダイアログを重ねることも可能)
他のUIViewはUnfocusになり、ダイアログ外をクリックしたときにダイアログを閉じるか、背景を暗くするかを選択することもできます。

入力とその反応の実装

UIInputReceiverというクラスを用意しており、入力に対する動作を簡単に定義できます。
入力のバインディングは、InputSystemのInputAction、以下のInputBindingType、またはパスから指定可能です。
github.com

また、Buttonのトリガーとして上記の入力を紐づけることも可能です。

カーソルの実装

主にSelectableに追従するカーソルが実装可能です。
これにより、ゲームパッド操作時のUI挙動も比較的簡単に作れるかと思います。

Selectable関連

Selectableの状態による処理を定義可能

docs.unity.cn
上記のSelectableの状態による処理をスクリプトから定義可能です。
デフォルトでは、色の変更、カーソルの移動、カスタムアクションが指定可能です。

SelectableGroupという概念があり、こちらにSelectableを追加していくことでNavigationの設定を自動で行ってくれます。
また、ゲームパッド操作でViewのフォーカス時に自動で選択してくれたり、操作変更時に選択したり外したりを自動で行ってくれる機能もあります。

各パーツのラッパークラス

Buttonのラッパークラスで、先述の入力のバインディング機能を持ったUIButton、キー画像が一緒になったUIButtonKey、UIKeyImage、UIText、UIInputText、UIToggle、UISlider、など、少し便利なパーツクラスが使用可能です。

最後に

今回はできることについてざっと紹介していきました。
このライブラリは自分がPCゲームを1本実装した上で、必要になった機能をまとめたものになります。
なのでまだまだ足りない機能、不具合などが多数あるかと思いますので、要望や質問などありましたらGitHubのIssuesやメール(limegame1004@gmail.com)の方まで気軽にご連絡いただければと思います!