FF6の買い物画面を再現したいと思っております。
それで、このような古いゲームに特徴的な、「選択されているアイテムの横にカーソルを出す」機能を実装しようとしましたが、
そのカーソル位置がずれてしまう問題を解決できませんでした。
方法は以下のようにしています。
「各アイテムのボタンの子に、Canvas>カーソルImageを作って
(Canvasを挟んでいるのはSortOrderで何よりも前面に表示するためです。)
EventSystemのeventSystem.currentSelectedGameObjectを取得して、
そのボタン(アイテム)を選択していたら、
そのカーソルImageを子に持つCanvasを表示して、それ以外は非表示にする」そのアイテムボタンはプレハブ化して、GameManager内Start関数で
リストとしてインスタンス化しています。
元々Scene上に置いてあるボタン(アイテム)プレハブだと、
カーソルは正しい位置に表示されるのですが、(画像1)
Startで生成すると、カーソルだけがずれてしまいます。(画像2)
※画像2では一番上のポーションを選択している状態です。こちらボタンのインスタンス作成の際に何か問題があると思うのですが、何が問題なのでしょうか?
itemPrefabは親になっているCanvasとセットになってリサイズされているので、
itemオブジェクトだけをプレハブ化して生成し、それの親をCanvasに設定するだけでは
初期に配置してあったitemオブジェクトとprefabのitemではアンカーなどの設定が違ってしまいます。(画像二枚を参考にしてください)
それを避けるためには、Hierarchy内のitemオブジェクトをGameManagerに取得してもらって生成を繰り返す形がいいでしょう。
「Hierarchy内のitemオブジェクトをGameManagerに取得してもらって生成を繰り返す」についてですが、
「元となるオブジェクトをプレハブ化せず、Hierarchy内にゲームオブジェクトとして、
残存させておき、さらに非Active(inspectorの左上のチェックを外した状態)にしておき、それをGameManagerから取得し、インスタンスを必要な数生成する」
という理解であっておりますでしょうか?
となるとHierarch上にゲーム中ずっと非Activeのままのゲームオブジェクトが存在する
状態になると思い、初心者の私からは少し気持ち悪い感じがするのですが、これはよく使う手法としてこれからも普通にガンガン使ってよい手法なのでしょうか?
それとも、今回の「各アイテムのボタンの子に、Canvas>カーソルImageを作った」
ことそもそもその設計自体が、まずいのでしょうか?
確かに、そう言われるとあまり現場では使われない方法ですね。
もし私が実装するのであれば、itemオブジェクトをCanvasの子にしたタイミングで、アンカーやRectTransformをスクリプト上で調整して綺麗に整頓します。
あくまでも「今の状態のまま問題なく実装する場合」という制限のもと提案したので、もし気持ち悪い感じがしたらスクリプト上でしっかり調整しましょう。