読んでおくべきことこの回答:シーンで
- 各プレハブまたはオブジェクトが
GameObject
と Transform
を持っています。
- 各スクリプト/コンポーネントまたは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のショートカットを使用してください。