我的布尔值有一个我不明白的问题。我有一个源自 MonoBehavior 的动作脚本。在该脚本中,我有一个布尔变量“IsCompleted”,它将指示攻击是否完成。在 Awake 中,我将此 bool 设置为 true,表示没有攻击正在运行。在另一个从 ScriptableObject 派生的脚本 - ScriptableAttack 中,我有一个函数,它是攻击的主要部分。在那里我编辑这个值并将其设置为 false。然后,如果条件好,我想在 bool 再次设置为 false 之后运行一个计时器。现在,由于我不能在 ScriptableObject 上使用典型的 Update 方法,我想在我拥有的第三个脚本中检查这个值是否为 false - CharacterSettings - 它派生自 MonoBehavior。现在的问题是,当我在 CharacterSettings 脚本中的 Update 上检查该值时,它总是返回 true,而我发现它在 ScriptableAttack 中确实为 false。我还检查了我是否在某处覆盖了这个值但找不到任何东西。我在这里写下的用法是我的应用程序中唯一的用法。也许有人可以帮助或至少向我解释这种行为。
这是 ScriptableObjects 函数的基础:
public void Attack()
{
if (!_actions.IsCompleted)
{
return;
}
_actions.IsCompleted = false;
if (Vector3.Distance(GeneralGameManager.Characters[0].transform.position,
GeneralGameManager.Characters[1].transform.position) > _attackDistance)
{
_actions.IsCompleted = true;
return;
}
}
进一步说明:Actions 是一个脚本,它基本上包含 SO 和 IsCompleted 布尔值。它看起来像这样:
[SerializeField] private ScriptableAttack _frontPunch;
[SerializeField] private ScriptableAttack _backPunch;
[SerializeField] private ScriptableAttack _frontKick;
[SerializeField] private ScriptableAttack _backKick;
[HideInInspector] public ScriptableAttack[] AttackCollection;
[HideInInspector] public bool IsCompleted;
private void Awake()
{
IsCompleted = true;
AttackCollection = new[] {FrontPunch, BackPunch, FrontKick, BackKick};
}
CharacterSettings 脚本是每个战斗机(其中有两个)附加的脚本。在那里我想做这样的事情:
private void Update()
{
if (_actions.IsCompleted)
{
return;
}
timer += Time.deltaTime;
if (timer >= attackExecutionTimer)
{
//Do damage and stuff
_actions.IsCompleted = true;
timer = 0;
}
}
其中 timer 是 0 的浮点值,attackExecutionTimer 是 SO 中设置的浮点参数。
来自 SO 的 Attack() 在 Input.GetKeyDown 上调用。