【问题标题】:Variable in prefab's script doesn't change in my own method预制脚本中的变量在我自己的方法中没有改变
【发布时间】:2017-10-23 20:56:59
【问题描述】:

我的脚本附加在预制对象上并附加到按钮上有一个奇怪的问题。我试图搜索这个问题,但没有成功。

我将解释一个非常简单的例子。 我有一个预制件 PlayerPrefab,它是由脚本 PlayerSpawn 通过指令创建的:

Instantiate (playerPrefab, transform.position, Quaternion.identity);

因此,当游戏开始时,会创建一个新的 PlayerPrefab 实例。

附加到预制件有一个带有一些私有变量的脚本(为简单起见,我编写了一个简单的脚本代码):

public class ShipClass : MonoBehaviour {
    float speed;
    int count;

    void Start () {
        speed = 0;
        count = 0;
        Debug.Log ("Start executed, speed = " + speed);
    }   
    void Update () {
        Debug.Log("speed in Update = " + speed);
    }
    public void Push ()
    {
        speed = 50;
        count++;
        Debug.Log("speed in Push = " + speed);
        Debug.Log("count = " + count);
    }
}

然后我创建了一个带有 OnClick 事件的 UI 按钮,附加预制对象并调用方法 Push()

行为很奇怪: 第一次启动游戏时,Update() 和 Push() 方法的打印速度为 0。但是当我开始单击 UI 中的按钮时,Push() 方法中的速度变为 50,但 Update( ) 仍然打印 0,就好像我们有两个不同的变量 speed。

第二件事是按下按钮,计数变量增加。当我停止游戏并重新启动它时,计数变量不会在 Start 方法中重置(即使执行 Start(),查看打印日志),而是从上次运行的最后一个值开始。 此外,我们有与 speed 变量相同的行为:在 Update() 中,count 保持为 0,在 Push() 中,count 继续增加,就像我们有两个不同的“count”变量一样。

我知道这是由于预制对象,但我不知道变量在 Update() 和自己创建的方法中的行为有何不同。

提前感谢您的帮助。

【问题讨论】:

  • 快照可以提供帮助。请附上。关于你的变量,你需要将你的浮点数设置为浮点数:速度 = 50.0f;速度 = 0.0f.

标签: c# unity3d process.start


【解决方案1】:

现在您正在调用附加到预制件的ShipClass 实例上的Push。您想要的是附加到实例化对象的ShipClass 实例。

GameObject player = Instantiate(playerPrefab, transform.position, Quaternion.identity);
ShipClass shipClass = player.GetComponent<ShipClass>();
button.onClick.AddListener(shipClass.Push);

还要确保在检查器中从按钮的 OnClick() 列表中删除预制件。

【讨论】:

  • 是的,如果 OP 包括附件部分,那么问题出在哪里就很明显了。在他的例子中,他只在实例化对象时创建了两个 ShipClass 实例(其组件 ShipClass 也将被创建,他正在通过按钮访问它),第二个是当他创建新的 ShipClass 时。 Pluto 是对的,他只需要使用 GetComponent 方法来获取在实例化 prefab 时已经创建的 ShipClass 实例的引用。
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多