2018年6月11日あるゲームのUIを作っている間にボタンに関する問題に遭遇しました。選択されたエンティティによって、表示されているボタンが変わるようにしたいと思いました。一つずつのエンティティのGameObjectを準備して場合によってSetActive()trueかfalseにしてもいいですが、スケーラビリティは?エンティティを追加しようとする毎に新しいGameObjectを準備しますか?そんな面倒なことは勘弁してほしいですよね。いうことでスケーラビリティのため、エンティティを選択する時にボタンが編集され、ちょっとしたアルゴリズムを書きました。いうシステムが入っているUIを作る人がいて参考になればと思い、分かりやすいバージョンを準備して下記にそのケースを紹介します。1.エンティティによる、ボタンの数が異なる場合でもOK。2.ボタンの見た目を編集可能にする。3.ボタンのアクションがstringの引数を受け取れる。4.簡単にするため、ボタンの最大数は10にします。ボタンの情報をまとめるクラス“ActivityButton“をつくります。UIマネージャーにはButton、Image、GameObjectの配列を必要です。パブリックなGameObjectの配列を作ってシーンからボタンをドラッグして、Start()でButtonとImageの配列を作りました。2018年6月8日まず、特定のUI要素が特定されているかどうかを調べる必要があります。UI要素がマウスでクリックされているかどうかを判断する方法は複数ありますが、最も一般的な方法はUnityのPointerEventSystemを使用することです。UnityEngine.EventSystems;”というNamespaceを実装する必要があり、SceneのHierarchyにEventSystemを追加することも必要です。スクリプトはトリガーされたオブジェクト上にある必要があります。別の方法はUnityのBoundsを使用します。イメージのようなUIオブジェクトでそれを使用できるようにするには、コライダーを置いてオブジェクトと同じサイズにする必要があります。次に、Boundsを見つかるために、このコライダーコンポーネントをスクリプトで取得します。これにより、マウスの位置がこれらの範囲内にあるかどうかを確認することができます。オブジェクトをHoveringしていることがわかったので、次のステップは、マウスの位置を世界に相対的ではなく、そのオブジェクトに関連させて見つけることです。そのために、UnityのRectTransformUtilityを使用することができます。ローカルのRectTransformを新しいスクリーン位置として設定することができます。二つの実装例を次に示します、1つはBoundsシステムを使用し、もう1つはEventSystemを使用します。Overlayに設定されているため、カメラパラメータはnullに設定されています。positionはいろいろな使い方ができます。カンバスにある、レンダーテクスチャを使用してミニーマップ上でクリック位置を取得することができます。社のMyoというアームバンド型のコントローラーを使って、ジェスチャーを使って操作するアプリのデモを作成しました。手のグー、パーによって操作するシンプルなゲームです。ジェスチャーによるメニュー選択を実装してみました。