2016-03-18 12 views
0

私はMonoBehaviourとしてスクリプトコンポーネントを持つプレハブを持っています。このスクリプトは3つのパブリックフィールドをテキストとして持っています。ゲームオブジェクトを保存してシーンから取り除く前に、インスペクタで割り当てられています。実行時にインスタンス化されたプレハブのUI要素への参照を保持する方法

パネルのようなUI要素がある場合は、これでうまく動作します。プレハブが実行時にインスタンス化されると、プレハブで定義されたパネル上のすべてのテキストフィールドが割り当てられます。

これは悲しいことに、私が作った別のプレハブでは機能しません。これはUI要素ではありません。私の場合は、様々なコンポーネント(navmeshエージェント、カプセルコライダー、リジッドボディー、アニメーターなど)を持つメッシュゲームオブジェクトです

これは、UIパネルでは、要素が既にゲームオブジェクト参照が異なるゲームオブジェクト上にあるときは、 Unityはそれらを追跡しません。

これは、ゲームオブジェクト自体の一部でない場合、私は各プレハブで参照したい要素をコードで実行時に追加する必要があることを意味します。この場合、インスペクタを使用しないので(このタイプのすべてのゲームオブジェクトは実行時にインスタンス化されます)、私は自分の参照をパブリックにしないでください。

これを回避する他の解決策がないかどうかを確認するだけです。

+0

あなたはいつでもあなたのUI要素を見つけることができます。FindObjectWithName' – LibertyLocked

+0

はい、それはフィールドをパブリックにする目的を無視し、エディタを使って参照を追加します。私の考えでは、プレハブを作成するときにエディタで行われたすべてのことは大変です。代わりに、ほとんどの場合そのようには機能しません。 –

答えて

0

使用List生成オブジェクトに対して参照を保存します。 オブジェクトを追加して、の参照を保存するとします。meshgameobjectとします。

List<meshgameobject> meshGOB; 

スタート機能

void Start(){ 
meshGOB = new List <meshgameobject>(); 
} 

内部initiaizeその後

meshGOB.Add((meshgameobject)Instantiate(prefab, Pos, Quaternion.Identity); 
のように、実行時に 参照を追加する list.add()を作成して使用

OR

meshgameobject tempGOB= (meshgameobject)Instantiate(prefab, Pos, Quaternion.Identity); 

//その後、どのperfabをしないでください

meshGOB.Add(tempGOB); 
+0

ありがとうございます。私は公共の財産を使用しない他のオブジェクトのリストを使用します(私はエディタで使用しないので)。私はこの特定の場合にも同じことをやろうと思います。レッスンで学んだ:) –

0

リストへの参照を追加しmeshgameobject

tempGOB.someAction...... 

で何かを参照するシーン内の他のgameobjectsには向いていますが、perfabI自体の階層にはありません。 AFAIK、Unityはこの種の参照を追跡できません。 ユニティがこの種のプレハブをサポートしていても、この種のプレハブは他のシーンでは使用できませんでした。具体的な参考資料なので、そのようなperfabを作るのはあまり意味がありません。場面とゲームオブジェクトが別の人によって管理されているためにpefabにする必要がある場合は、Find()を使用して実行時に参照を設定することができます。

+0

"意味がない"というのは、使い方に基づいた相対的な概念です。ゲームオブジェクトが必要な場合は、同じシーンの別のゲームオブジェクトにアクセスします。それは完全に意味をなさない。プログラマが何をしているのかを知ることが前提です。他のゲームオブジェクトも参照していなければ、そのようなプレハブはうまくいかないという事実のように、同じ場面で、それは純粋に論理です。しかし、私はそのようなアプローチをすることは人々を混乱させることを知る。私はちょうどユニティで人々からトピックに関するいくつかのドキュメントを期待していた:) –

関連する問題