【发布时间】:2020-07-03 16:01:45
【问题描述】:
概述
考虑一个简单的硬币收集游戏。有两个脚本,CollectableItem 和 ItemVault。 CollectableItem 有一个 value 属性,它告诉项目的价值,它被添加到 coin 预制件中。 ItemVault 有一个 CurrentAmount 属性,用于存储收集到的硬币的总价值,并将其添加到 player 预制件中。
问题
ItemVault 对象的 CurrentAmount 属性的值不会在 Unity 编辑器内重新启动游戏时重置。
代码
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
}
}
注意
-
CollectableItem和ItemVault都添加到prefabs。 -
ItemVault的Start函数确实将CurrentAmount的值记录为0,但CollectableItem的Start函数记录了上次运行中CurrentAmount的最后一个值。 - 重新启动编辑器本身会重置该值。
- 我尝试将
Script Execution Order更改为在CollectableItem之前调用ItemVault - 在
Awake()而不是Start()中实例化属性会得到相同的结果
【问题讨论】:
-
您所说的预制件是指实际的预制件(=资产)或这些在场景中的实例? game restart 是指退出和进入 PlayMode 还是你的场景中有一些重启功能?
-
还要注意
vault和m_vault是多余的......你已经有一个ItemVault引用,所以不需要/使用再次调用GetComponent<ItemVault>() -
@derHugo 是的预制件我的意思是
Assets游戏重启我的意思是退出和进入播放模式
标签: c# unity3d properties