original | 您想要复制的现有对象。 |
position | 新对象的 position。 |
rotation | 新对象的 orientation。 |
parent | 将分配给新对象的父对象。 |
instantiateInWorldSpace | 当您分配父对象时,传递 true 以将新对象直接放置在世界空间中。传递 false 以相对于其新父对象设置对象的 position。 |
Object 实例化的克隆。
克隆对象 original
并返回克隆。
此函数以类似于编辑器中“复制”命令的方式复制对象。如果您正在克隆 GameObject,您可以指定其 position 和 rotation(否则这些默认为原始 GameObject 的 position 和 rotation)。如果您正在克隆 Component,则其所附加的 GameObject 也将被克隆,同样可以选择 position 和 rotation。
克隆 GameObject 或 Component 时,所有子对象和组件也将被克隆,其属性设置为与原始对象相同。
注意:当此方法克隆子对象时,它也会克隆子对象自己的子对象。为了防止堆栈溢出,Unity 限制了此嵌套克隆。如果您超过堆栈大小的一半,Unity 将抛出 InsufficientExecutionStackException
。
默认情况下,新对象的 parent 为 null;它不是原始对象的“同级”。但是,您仍然可以使用重载方法设置 parent。如果指定了 parent 但未指定 position 和 rotation,则原始对象的 position 和 rotation 将用于克隆对象的本地 position 和 rotation,或者如果 instantiateInWorldSpace
参数为 true,则使用其世界 position 和 rotation。如果指定了 position 和 rotation,则它们将用作对象在世界空间中的 position 和 rotation。
克隆时 GameObject 的活动状态将保持不变,因此如果原始对象处于非活动状态,则克隆也将在非活动状态下创建。此外,对于层次结构中的对象和所有子对象,只有当它们在调用此方法时处于层次结构的活动状态时,它们的 Monobehaviours 和 Components 才会分别调用其 Awake 和 OnEnable 方法。
这些方法不会为新实例化的对象创建预制件连接。可以使用 PrefabUtility.InstantiatePrefab 创建具有预制件连接的对象。
其他资源
在运行时实例化预制件
PrefabUtility.InstantiatePrefab.
// Instantiates 10 copies of Prefab each 2 units apart from each other
using UnityEngine;
public class Example : MonoBehaviour { public GameObject prefab; void Start() { for (var i = 0; i < 10; i++) { Instantiate(prefab, new Vector3(i * 2.0f, 0, 0), Quaternion.identity); } } }
Instantiate 可用于在运行时创建新对象。例如,用于弹丸的对象或用于爆炸效果的粒子系统。
using UnityEngine;
// Instantiate a rigidbody then set the velocity
public class Example : MonoBehaviour { // Assign a Rigidbody component in the inspector to instantiate
public Rigidbody projectile;
void Update() { // Ctrl was pressed, launch a projectile if (Input.GetButtonDown("Fire1")) { // Instantiate the projectile at the position and rotation of this transform Rigidbody clone; clone = Instantiate(projectile, transform.position, transform.rotation);
// Give the cloned object an initial velocity along the current // object's Z axis clone.velocity = transform.TransformDirection(Vector3.forward * 10); } } }
Instantiate 还可以直接克隆脚本实例。整个游戏对象层次结构将被克隆,并且将返回克隆的脚本实例。
using UnityEngine; using System.Collections;
public class Missile : MonoBehaviour { public int timeoutDestructor;
// ...other code... }
public class ExampleClass : MonoBehaviour { // Instantiate a Prefab with an attached Missile script public Missile projectile;
void Update() { // Ctrl was pressed, launch a projectile if (Input.GetButtonDown("Fire1")) { // Instantiate the projectile at the position and rotation of this transform Missile clone = Instantiate(projectile, transform.position, transform.rotation);
// Set the missiles timeout destructor to 5 clone.timeoutDestructor = 5; } } }
克隆对象后,您还可以使用 GetComponent 来设置附加到克隆对象的特定组件上的属性。
original | 您想要克隆的类型为 T 的对象。 |
T 类型为 T 的对象。
您还可以使用泛型来实例化对象。有关更多详细信息,请参阅 泛型函数 页面。
通过使用泛型,我们无需将结果强制转换为特定类型。
using UnityEngine;
public class Missile : MonoBehaviour { // ...other code... }
public class InstantiateGenericsExample : MonoBehaviour { public Missile missile;
void Start() { Missile missileCopy = Instantiate<Missile>(missile); } }