我的脚本附加在预制对象上并附加到按钮上,这有一个奇怪的问题。我试图搜索这个问题,但没有成功。
我将解释一个非常简单的例子。 我有一个预装 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"变量
我知道这是由于预制对象,但我不知道变量()和自己创建的方法中变量的行为方式如何。
提前感谢您的帮助。
答案 0 :(得分:1)
现在,您正在预设的Push
实例上调用ShipClass
。你想要的是附加到实例化对象的ShipClass
实例。
GameObject player = Instantiate(playerPrefab, transform.position, Quaternion.identity);
ShipClass shipClass = player.GetComponent<ShipClass>();
button.onClick.AddListener(shipClass.Push);
还要确保在检查器中从按钮的OnClick()列表中删除预制件。