概述
考虑一个简单的硬币收集游戏。有两个脚本:CollectableItem和ItemVault。CollectableItem具有value属性,告诉物品的价值,并添加到coin预设中。ItemVault具有CurrentAmount属性,存储收集到的硬币的总价值,并添加到player预设中。
问题
在Unity Editor内重新启动游戏时,ItemVault对象的CurrentAmount属性值不会重置。
代码
CollectableItem.cs
public class CollectableItem : MonoBehaviour
{
public float value = 1f;
public ItemVault vault;
private ItemVault m_vault;
void Start()
{
m_vault = vault.GetComponent<ItemVault>();
Debug.Log(m_vault.CurrentAmount); //Does not reset
}
//isTrigger
private void OnTriggerEnter2D(Collider2D collision)
{
if(vault != null)
{
m_vault.ChangeAmountBy(this.value);
}
Destroy(gameObject);
}
}
ItemVault.cs
public class ItemVault : MonoBehaviour
{
public float startingAmount; // 0
public float CurrentAmount { get; private set; }
void Start()
{
CurrentAmount = startingAmount;
Debug.Log(CurrentAmount); // 0
}
public void ChangeAmountBy(float amount)
{
CurrentAmount += amount;
Debug.Log(CurrentAmount); // CurrentAmount does not reset
}
}
注意:
- 在
prefabs
中添加了CollectableItem
和ItemVault
。 ItemVault
的Start
函数确实将CurrentAmount
的值记录为0
,但CollectableItem
的Start
函数会记录上一次运行时CurrentAmount
的最后一个值。- 重新启动编辑器本身会重置该值。
- 我已经尝试将
Script Execution Order
更改为先调用ItemVault
再调用CollectableItem
,但结果相同。 - 在
Awake()
中实例化属性而不是在Start()
中也会得到同样的结果。
vault
和m_vault
是多余的...您已经有一个ItemVault
引用,因此不需要/使用再次调用GetComponent<ItemVault>()
。 - derHugo