在这种情况下,您实际上是在运行时修改预制件。我设置了一个快速测试来展示这一点。我将Cube 预制件拖到GameManager1 的cubePrefab 和cubeComponent 字段的检查器中,并将相同的Cube 预制件拖到GameManager2 的cubePrefab 字段的检查器中。
在开始游戏时,GameManager1 将预制件的 Cube 组件修改为 10 而不是 3。然后生成预制件实例并打印其 A 值,显示为 10。
一秒钟后,GameManager2 生成 Cube 预制件的一个实例并打印其 A 值,最终也为 10。
Cube.cs
public class Cube : MonoBehaviour
{
public int A = 3;
}
GameManager1.cs
public class GameManager1 : MonoBehaviour
{
public GameObject cubePrefab;
public Cube cubeComponent;
void Start()
{
cubeComponent.A = 10;
GameObject spawnedCube = Instantiate(cubePrefab, Vector3.zero, Quaternion.identity);
Debug.Log("A = " + spawnedCube.GetComponent<Cube>().A); //Prints 10
}
}
GameManager2.cs
public class GameManager2 : MonoBehaviour
{
public GameObject cubePrefab;
private void Start()
{
Invoke("SpawnCube", 1);
}
void SpawnCube()
{
GameObject spawnedCube2 = Instantiate(cubePrefab, Vector3.zero, Quaternion.identity);
Debug.Log("Cube2 A = " + spawnedCube2.GetComponent<Cube>().A);
}
}
输出
注意:对预制件的修改仅在运行时持续存在。之后它将恢复为默认值。