gpt4 book ai didi

c# - GameObject 属性值不会在游戏重启时重置

转载 作者:行者123 更新时间:2023-12-04 15:23:49 27 4
gpt4 key购买 nike

概览
考虑一个简单的硬币收集游戏。有两个脚本,CollectableItemItemVaultCollectableItem 有一个 value 属性,它告诉项目的值(value),它被添加到 coin 预制件中。 ItemVault 有一个 CurrentAmount 属性,它存储收集硬币的总值(value),它被添加到 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
}
}

注意事项

  1. CollectableItemItemVault 都添加到 prefabs
  2. ItemVaultStart 函数确实将 CurrentAmount 的值记录为 0Start CollectableItem 函数记录上次运行中 CurrentAmount 的最后一个值。
  3. 重新启动编辑器本身会重置该值。
  4. 我已经尝试更改 Script Execution Order 以在 CollectableItem 之前调用 ItemVault
  5. Awake() 而不是 Start() 中实例化属性会给出相同的结果

最佳答案

首先:

确保在 _vault 中您实际上引用的是场景中 的现有对象引用,而不是预制 Assets - 否则,是的,您将在预制件上执行该方法相反,它不会在场景加载/退出播放模式时重置。

您可以通过启动 PlayMode 然后在层次结构中单击检查器中的 vault 插槽来确认。这将在层次结构(预期)或 Assets (不应该发生!)中突出显示引用的对象。


如果这没有帮助,那么您的问题可能是时间问题。

如果您的 CollectableItem.Start ItemVault.Start 有机会执行之前执行,您可能会看到不同的值。

我通常遵循经验法则

  • Awake:初始化自己,所以任何不依赖他人的东西
  • 开始:现在访问已经在Awake中初始化的其他组件的值

所以在你的情况下我会做

public class CollectableItem : MonoBehaviour
{
public float value = 1f;

// In general rather already reference this via the Inspector
[SerializeField] private ItemVault _vault;

private void Awake()
{
// Ass fallback get it on runtime
if(!_vault) _vault = vault.GetComponent<ItemVault>();
}

private void Start()
{
Debug.Log(_vault.CurrentAmount);
}

private void OnTriggerEnter2D(Collider2D collision)
{
if(_vault)
{
_vault.ChangeAmountBy(this.value);
}
Destroy(gameObject);
}
}

public class ItemVault : MonoBehaviour
{
[SerializeField] private float startingAmount; // 0

public float CurrentAmount { get; private set; }

private void Awake()
{
CurrentAmount = startingAmount;
Debug.Log(CurrentAmount);
}

public void ChangeAmountBy(float amount)
{
CurrentAmount += amount;
Debug.Log(CurrentAmount);
}
}

关于c# - GameObject 属性值不会在游戏重启时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62710123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com