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



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

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

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

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

附在序言中的是一个带有一些私有变量的脚本(为了简单起见,我写了一个简单的脚本代码):

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一样。

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

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

提前感谢您的帮助。

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

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

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

最新更新