【C#】プロパティの誤植で再帰の無限ループが発生してクラッシュ
テストプレイ中にUnityエディタが特定のタイミングでクラッシュする。
位置を特定すると、あるゲームオブジェクトをInstantiate()、AddComponent<>()して、
そのコンポーネントのプロパティにアクセスしたところでクラッシュするらしい。
コードをよく見るとこんなことになっていた。
public class DropItem : MonoBehaviour { private ItemData itemData; public ItemData ItemData => ItemData; }
ItemData => itemData
と書くべき右片を間違えて大文字にしていた。
これが自分自身を無限に呼び出すgetterになってしまったのがクラッシュの原因だった。
もう少し変数名を工夫したほうがいいが、接頭辞はきもちがわるいから使いたくない。
_itemDataみたいなアンダーバーを活用してみようか?
接頭辞でpとか付ける記法とどう違うかというと気分の問題だが。
あるいは単にdataとか。
これぐらいはコンパイルエラーにしてくれくれたら助かるんだけど、世知辛い。
それにUnityって無限ループに入ったらヒントもスタックトレースの出力もなく落ちるんですね。困る。
Editor.log以外に何かログはあるのかな?
【Unity】キーボードからカーソル選択するセレクトリストを作る(1)
やり方を調べたいこと
カーソルを移動させて選択できるインベントリ ウインドウを作りたい。ポケモンのリュックみたいなやつ。画像はElonaのウィンドウだが、要するにこの通りのものが作りたい。
uGUIのレイアウトについてはちょっと調べたが、コントロールの方法が全く分からないので1からやっていく。
サンプルのUIを組む
動作を確認したいので新しいシーンに最小限のを作った。
Canvasの下に、コンテナとしてImageオブジェクトを置く。
ImageにはVertical Layout Groupを追加でアタッチ。
その下にButtonを幾つか配置。
Navigationを試す
次に、「unity ui キーボード 選択」あたりでググって、
- uGUIでUI要素へのフォーカスを遷移させることは、Navigationという概念らしい。
- ほとんど自動的とすらといえる簡単な実装で、矢印キーに反応して選択中要素が変わるボタンのリストを作れる。
- ただし、初期状態で選択している要素を1つ指定する必要がある。
- UIへの入力は、ヒエラルキーでUI要素を作ると勝手に生えてくるEventSystemオブジェクトが、入力の検知からハンドリングまで勝手にいい感じにやってくれている。いい感じにやってくれる程度では早晩困るので、いじらないといけないだろうが。
あたりの情報が得られた。
具体的な操作としては、各ブログ師と公式のガイドから得られた操作は、まずButtonコンポーネントが持っているNavigationという変数を設定する。ボタンの色分けは分かりやすいように変えておく。
そうするとSceneに黄色い矢印が出てきてUI要素同士の遷移関係をいい感じに構築して表示してくれる。すごい。出ないなと思ったらVerticalLayoutなのに間違ってHorizontalを選択していた。
ボタンを最初の要素として選択するには、インスペクターでEventSystemのFirstSelectedを設定するとか、プレイ中にボタンをクリックするだけでよかったが、コードで書いてから気づいた。
コードからButtonのinteractableプロパティをfalseにすると、このようにその要素をトーンダウンして遷移はすっ飛ばすようになった。合理的な動きだが、トーンダウンしたものも飛ばさず選択を乗せられるようにもしたいところだ。
次はドキュメントを見つつこれらの仕組みを掘り下げていく。