如何解决如何在Unity的协程中使用本地参照人?
我有一些函数可以接收一个Enemy实例并更改其字段之一。敌人职业有一些基本领域,例如速度,伤害,攻击范围。每个功能仅存储敌人的正常值之一,然后在一段时间内将当前字段更改为某个值,然后将其更改回正常状态(我在Unity中编写代码并为此使用协程)。区别在于要存储哪个字段(速度,损坏或攻击范围等)。因此,我想制作一个包含委托的函数,该委托返回要更改的字段:
delegate ref float Stat();
private IEnumerator EnemyStatModify(Enemies enemy,float duration,float percent,Stat stat)
{
ref float enemyStat = ref stat();
float normalStat = enemyStat;
enemyStat *= (1 - percent);
yield return new WaitForSeconds(duration);
enemyStat = normalStat;
}
然后像这样使用它
EnemyStatModify(enemy,state.duration,state.timeBtwHits,() => ref enemy.speed);
EnemyStatModify(enemy,() => ref enemy.damage);
但是迭代器不能具有按引用的本地变量。如何绕过这个?
解决方法
您实际上不需要委托的返回值。您也不需要Enemies
,因为无论如何您都不会在例程中使用它。
这当然仍然不如ref
参数那么漂亮,但是您可以简单地使用像这样的回调
delegate void Stat(float newValue);
private IEnumerator EnemyStatModify(float duration,float percent,float currentValue,Stat onUpdated)
//or
//private IEnumerator EnemyStatModify(float duration,float stat,Action<float> onUpdated)
{
onUpdated?.Invoke(currentValue * (1 - percent));
yield return new WaitForSeconds(duration);
onUpdated?.Invoke(currentValue);
}
并称呼它
StartCoroutine(EnemyStatModify(state.duration,state.timeBtwHits,enemy.speed,(newValue) =>
{
enemy.speed = newValue;
}));
StartCoroutine(EnemyStatModify(state.duration,enemy.damage,(newValue) =>
{
enemy.damage = newValue;
});
您也可以只使用Stat
代替Action<float>
一个简单的解决方法是为协程getter和setter委托。这样一来,您就可以随时获得统计信息,而不仅仅是开始:
delegate float GetStat();
delegate void SetStat(float x);
private IEnumerator DelayedEnemyStatModify(Enemies enemy,float duration,GetStat getStat,SetStat setStat)
{
yield return new WaitForSeconds(duration/2f);
float enemyStat = getStat();
float normalStat = enemyStat;
enemyStat *= (1 - percent);
setStat(enemyStat);
yield return new WaitForSeconds(duration/2f);
setStat(normalStat);
}
或者在始终总是/仅在开始时获得统计信息的情况下,只需按值传递统计信息即可:
delegate void SetStat(float x);
private IEnumerator EnemyStatModify(Enemies enemy,float enemyStat,SetStat setStat)
{
float normalStat = enemyStat;
enemyStat *= (1 - percent);
setStat(enemyStat);
yield return new WaitForSeconds(duration);
setStat(normalStat);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。