【问题标题】:Changing prefab's fields from script (Unity)从脚本更改预制件的字段(Unity)
【发布时间】:2019-03-06 08:54:00
【问题描述】:

我有一个附有 Cube 脚本的立方体预制件。该脚本具有公共整数变量,默认为 3。

public class Cube : MonoBehaviour
{
   public int A = 3;
}

在另一个脚本中,我引用(通过在检查器中拖动)这个预制件。然后我将它的变量更改为 10:

public class GameManager : MonoBehaviour
{
    public Cube cube;

    void Start()
    {
        cube.A = 10;
    }
}

所以问题是:我刚刚改变了什么对象?它不是预制件,因为正如我在 Assets 文件夹中看到的那样,预制件的变量保持不变。

【问题讨论】:

  • 有趣的问题,我需要先研究一下才能回答

标签: c# unity3d


【解决方案1】:

在这种情况下,您实际上是在运行时修改预制件。我设置了一个快速测试来展示这一点。我将Cube 预制件拖到GameManager1cubePrefabcubeComponent 字段的检查器中,并将相同的Cube 预制件拖到GameManager2cubePrefab 字段的检查器中。

在开始游戏时,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);
    }
}

输出

注意:对预制件的修改仅在运行时持续存在。之后它将恢复为默认值。

【讨论】:

  • 谢谢。需要说明的是,预制件的字段只会在运行时保持更改,并且会在我们停止游戏后恢复为默认值。
  • @AnyaBarsukova 是的,这是正确的。我将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2023-03-03
  • 2016-03-10
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多