C# 改变预制件';脚本中的s字段(Unity)
我有一个立方体预制与立方体脚本附加。脚本的公共整数变量默认为3C# 改变预制件';脚本中的s字段(Unity),c#,unity3d,C#,Unity3d,我有一个立方体预制与立方体脚本附加。脚本的公共整数变量默认为3 public class Cube : MonoBehaviour { public int A = 3; } 在另一个脚本中,我引用(通过在inspector中拖动)这个预置。然后我把它的变量改为10: public class GameManager : MonoBehaviour { public Cube cube; void Start() { cube.A = 10;
public class Cube : MonoBehaviour
{
public int A = 3;
}
在另一个脚本中,我引用(通过在inspector中拖动)这个预置。然后我把它的变量改为10:
public class GameManager : MonoBehaviour
{
public Cube cube;
void Start()
{
cube.A = 10;
}
}
所以问题是:我刚刚改变了什么?它不是预置,因为正如我在Assets文件夹中看到的,预置的变量保持不变。在这个场景中,您实际上是在运行时修改预置。我设置了一个快速测试来显示这一点。我将
cubePrefab
的cubePrefab
和cubeComponent
字段的cubemanager1
的cubePrefab
预置拖入检查器,并将相同的cubePrefab
字段拖入GameManager2
的cubePrefab
字段的检查器
开始游戏时,GameManager1
将预置的Cube
组件修改为10,而不是3。然后它生成预置的实例并打印其A
值,显示为10
一秒钟后,GameManager2
生成一个Cube
预置的实例,并打印其A
值,该值最终也是10
Cube.cs
public class Cube : MonoBehaviour
{
public int A = 3;
}
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
}
}
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);
}
}
GameManager1.cs
public class Cube : MonoBehaviour
{
public int A = 3;
}
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
}
}
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);
}
}
公共类GameManager 1:MonoBehavior
{
公共游戏对象cubePrefab;
公共立方体立方体组件;
void Start()
{
立方组分A=10;
GameObject sprownedCube=实例化(cubePrefab,Vector3.zero,Quaternion.identity);
Debug.Log(“A=“+spawnedCube.GetComponent().A);//打印10
}
}
GameManager2.cs
public class Cube : MonoBehaviour
{
public int A = 3;
}
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
}
}
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);
}
}
公共类GameManager 2:单一行为
{
公共游戏对象cubePrefab;
私有void Start()
{
调用(“生成多维数据集”,1);
}
void-cube()
{
GameObject sprownedcube2=实例化(cubePrefab,Vector3.zero,Quaternion.identity);
Log(“Cube2 A=“+spawnedCube2.GetComponent().A”);
}
}
输出
注意:对预置的修改仅在运行时持续。之后它将恢复为默认值。有趣的问题我需要研究一下,然后才能回答谢谢。需要指出的是,预置的字段仅在运行时保持更改,并在我们停止游戏后恢复为默认值。@AnyaBarsukova是的,这是正确的。我把它加到了答案上。