预制脚本中的变量在我自己的方法中没有变化

时间:2017-10-23 09:25:58

标签: c# unity3d process.start

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

我将解释一个非常简单的例子。 我有一个预装 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);
    }
}

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

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

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

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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