質問: 元未経験かけだしエンジニアです。 勉強をかねて、パズルゲームのようなものを作っているのですが、実装方法がわからない点があり、 お知恵をお借りしたいです。 前提:プロトタイプとして、コントローラースクリプトをつけた親オブジェクト1つ、 毎回起動時に色がランダムに変化する16枚のパネルをシーン上に配置しました。 パネルにはそれぞれ1から16の番号を振りました。 パネルにはドラッグを検知させるためEventTriggerのDragをアタッチしました。 質問:ゲームを制御するコントローラーオブジェクトに、 ドラッグされたパネルの"番号"、"色"、"何枚目にドラッグしたか"を知らせるには どうすればよいでしょうか? "何枚目にドラッグしたか"は、Listを宣言しておいてなぞった分だけ配列に加えるので 行けそうな気がしています。 "番号"、"色"はSendMessageUpwardsを使って親オブジェクトにメッセージを送ろう、 と試したのですがSendMessage系は引数をひとつしか取れないですね。。。すっかり失念していました http://tsubakit1.hateblo.jp/entry/20140308/1394213883 ↑上記の記事に目を通したのですが、恥ずかしながら内容が難しくてピンときませんでした。 似たような実装をされたことがある方や、スマートな書き方を知っていらっしゃる方おりましたら、 解決法をご指南いただきたいです。
回答: EventTriggerのDragをアタッチしたら、OnDragのイベントを設定できたと思います。 イベントに、以下のインターフェースを実装して呼び出してください。 UnityEngine.EventSystems.IDragHandler.OnDrag インターフェースはeventDataとして受け取ることができ、 eventData.gameObject.GetComponentのようにしてコンポーネントを取得できます。 そこからコントローラのメソッドに自身を渡せばいいのではないでしょうか。 同じようにdropも実装する必要があると思います。 もし、インターフェースについて理解が少ないのでしたら、 C#を先に一通り勉強した方がいいと思いますよ。 また、コントローラーはシーン上に1つしか存在しないと思うので、 以下のようなシングルトン(1つのインスタンス)方式をおすすめします。 ``` public static GameController{ private static Controller self; public static instance { get{ if(self == null)self = GameObject.Find("Controller"); return self; } } } ``` まとめるとやることは以下です。 コントローラの参照を保持する(シングルトン 単純にGameObject.Findでもよい) パネルコンポーネントにdrag dropを実装し呼び出し設定(EventTrigger OnDrag) コントローラにパネルコンポーネントを渡す