2016-05-10 7 views
0

私のプロジェクトで私のGameObject(The Player)を運転しようとしています。別のGameObjectにあるスクリプトのvarにナビゲートするスクリプトを作成します。それは、親と子供があるので、ここでは...簡単ではありません、私の木である:ツリーユニティ3Dでの運転C#

>PlayerEntity 
    >Canvas 
     Gun_Name_Text 
     Gun_Ammo_Text 
    >Player 
     Sprite 

私は「Gun_Name_Text」に取り付けたスクリプトは「プレーヤー」に付属のスクリプトでVARを取得したいので、私は管理のdidnt

var ammo1 = GetComponentInParent<GameObject>().GetComponent<weapon>().weaponOn.Ammo1; 

PS:でそれを行うために、私はGameObject.Findを(使用しない)事前に おかげ

+2

なぜインスペクタでそれを割り当てないのですか? –

+0

aaaaaah smart one;)didntはそれについて考えます – Ay0m3

+0

私はあなたが望むなら、あなたがコードでそれをどうやってやることができるか答えました。 'weapon'スクリプトへの参照を取得し、その参照で' Ammo1'値を変更する方が良いと思います。 :) –

答えて

1

私がコメントで言ったように、これを行う最も簡単な方法は、ちょうどインスペクタに変数を割り当てることであることをでしょう。あなたがこれを行うことができない場合は、あなたは、単に使用できます。

OtherScript otherScript = null; 

void Start() 
{ 
    otherScript = transform.root.GetComponentInChildren<OtherScript>(); 
} 

注:これは、子供ががオブジェクトで、見つかっOtherScriptの最初のインスタンスに等しいotherScriptを設定しますが。子に複数のOtherScriptオブジェクトがある場合は、GetComponentsInChildrenを使用する必要があります。あなたが使用することができ、あなたの具体的な例

var ammo1 = transform.root.GetComponentInChildren<weapon>().Ammo1; 

あなたはこれを呼び出している場合は、多くの場合、しかしweaponスクリプトへのrefrenceをキャッシュするのが賢明だろう。 weaponクラスのメンバーであるAmmo1変数を、参照ではなく値でvar ammo1に渡すときに変更する場合は、これも行う必要があります。

+0

ありがとう、私はそれを表示したい – Ay0m3

+0

エース、すべてクール。これが答えであれば覚えておいてください! –

+1

hi @ Ay0m3あなたは答えを尋ねる必要があります、これはあなたが新しいユーザーであるので重要です。そうでなければ、あなたはモデレートされ、ここで何も簡単に行うことはできません – Fattie

0

私のゲームオブジェクトがそれと対話するすべてのものを知らないケースがあります。一例は破壊可能なオブジェクトです。私が知っていることを知りたいのであれば、それは破壊的であり、私はすべての破壊可能なオブジェクトを基底型またはインタフェースから継承し、その型で検索します。次に例を示します。

private void CheckForDestructables(Collider2D c) 
{ 
    this.Print("CheckForDestructables Called"); 
    string attackName = GetCurrentAttackName(); 
    AttackParams currentAttack = GetCurrentAttack(attackName); 
    D.assert(currentAttack != null); 
    this.Print("CheckForDestructables Called"); 

    if (currentAttack.IsAttacking && c.gameObject.tag == "Destructable") 
    { 
    List<BaseDestructibleScript> s = c.GetComponents<BaseDestructibleScript>().ToList(); 

    D.assert(s.Any(), "Could Not find child of type BaseDestructibleScript"); 

    for (int i = 0; i < s.Count(); i++) 
    { 
     s[i].onCollision(Movement.gameObject); 
    } 
    } 
}