2017-05-31 12 views
0

を持って、それを必要とするプレハブをインスタンス化第5章で本「アクションの中の統一」ではUnityは、特定のスクリプト

a.GetComponent<MyScript>().SomeMethod();

著者は異なるアプローチを使用しています:

[SerializeField] private MyScript myScript; 
[...] 
var a = Instantiate(myScript) as MyScript; 
a.SomeMethod(); 
このような変数

私の知る限り理解し、このように私は、スクリプトの変数やメソッドにアクセスするための短いsintaxを持っているが、私は含むゲームオブジェクトにアクセスするための長いsintaxを必要としています。 (私はこれのようなものだと思う:a.GetComponentInParent())

私はオブジェクトのインスタンス化のこの方法についてのこの本以外のドキュメントは見つかりませんでした。

答えて

3

読んでおくべきことこの回答:シーンで

  • 各プレハブまたはオブジェクトがGameObjectTransformを持っています。
  • 各スクリプト/コンポーネントまたはGameObjectはObjectから継承されます。 このため、任意のスクリプト/コンポーネントまたは GameObjectをインスタンス化できます。この数時間前にちょうど答えたので、詳しい説明はthis投稿 を参照してください。

は、あなたの質問に答えるために、それらの両方は、同じことをやっています。コンポーネント/スクリプトをInstantiate関数に渡すと、Unityはすべてのスクリプト/コンポーネントとゲームオブジェクトをそのスクリプトに添付してインスタンス化します。使用するかを決定する方法の

例:

のは、あなたがGameObjectプレハブと呼ばれる「弾丸」を持っており、その弾丸はそれに接続Rigidbodyを持っているとしましょう。そのようにGetComponentでそれからRigidbodyを得る

.Instantiateゲームオブジェクトとして弾丸:あなたは2つの選択肢があり

....その後、AddForce弾丸にキー押下で弾丸をインスタンス化したいですあなたはそれに力を加えることができること:

public GameObject myPrefab; 

void Update() 
{ 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     GameObject obj = Instantiate(myPrefab) as GameObject; 
     obj.GetComponent<Rigidbody>().AddForce(new Vector3(0, 500, 0)); 
    } 
} 

。弾丸をRigidbody、次にAddForceというようにインスタンス化します。

public Rigidbody myPrefab; 

void Update() 
{ 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     Rigidbody rb = Instantiate(myPrefab) as Rigidbody; 
     rb.AddForce(new Vector3(0, 500, 0)); 
    } 
} 

それはGetComponentのない使用がないので、このバージョンを使用することは理にかなっています。コンポーネントにアクセスする必要がある場合は、このメソッドを使用してください。

Unityの最新バージョンでは、Instantiate関数のジェネリックバージョンを追加することで、これを簡略化しています。そのため、スクリプトやオブジェクトタイプにキャストする必要がなくなり、コードの行:

public Rigidbody myPrefab; 

void Update() 
{ 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     //Instantiate and Addforce on one line 
     Instantiate(myPrefab).AddForce(new Vector3(0, 500, 0)); 
    } 
} 

が、私は含むゲームオブジェクトにアクセスするための長いsintaxを必要としています。 (I は次のように考える:a.GetComponentInParent())

私の2番目のコメントと同様に、各スクリプトにはGameObjectがあります。そのスクリプトのGameObjectを取得する場合はscriptName.gameObject、そのGameObjectのTransformを取得する場合はscriptName.transformが必要です。例えば

:あなたはプレハブをインスタンス化した後にアクセスしなければならない多くのスクリプトを持っている場合

void Update() 
{ 
    if (Input.GetKeyDown(KeyCode.Space)) 
    { 
     Rigidbody rb = Instantiate(myPrefab) as Rigidbody; 
     rb.AddForce(new Vector3(0, 500, 0)); 

     GameObject obj = rb.gameObject; 
     UnityEngine.Debug.Log("Attached Object: " + obj.name); 
    } 
} 

最後に、その後、var a = Instantiate(myPrefab) as GameObject;を使用しています。

上記の「Bullet」の例としてプレハブをインスタンス化した後にスクリプトを1つだけ変更したい場合は、#2のショートカットを使用してください。

0

あなたは、彼はスクリプト自体をインスタンス化していないすべてのゲームオブジェクト、彼はそれらをexcutesスクリプトを参照する必要がなくても、メソッドをexcuteことができる方法のだとあなたの例で見ることができました。言い換えれば、特定の理由でGameObject自体をインスタンス化する必要がない場合は、常にゲームオブジェクト自体への参照を保持し、それを操作するスクリプトをインスタンス化する必要があります。

関連する問題