c# - Unity 3D:协程武器动画不会多次执行
问题描述
我有一个用于我正在开发的游戏的伸缩尖刺武器,它曾经非常好用,但之后不会再次开火:
public void ExpandSequence()
{
if (!mExpanding)
{
StartCoroutine(mExpand);
}
}
private IEnumerator _ExpandSequence()
{
mExpanding = true;
mBaseGoal = transform.localPosition + mBaseDistance * Vector3.up;
mConeGoal = mSpikeSections[5].localPosition + mConeDistance * Vector3.up;
while (transform.localPosition.y > mBaseSpikeEnd || mSpikeSections[1].localPosition.y > mCylinderEnd
|| mSpikeSections[5].localPosition.y > mConeEnd)
{ //only using the first cylinder section in the condition since they all move the same distance
transform.localPosition = Vector3.MoveTowards(transform.localPosition, mBaseGoal, mSpeed);
mSpikeSections[1].localPosition = mSpikeSections[2].localPosition = mSpikeSections[3].localPosition =
mSpikeSections[4].localPosition = Vector3.MoveTowards(mSpikeSections[1].localPosition, Vector3.up * mCylinderDistance, mSpeed);
mSpikeSections[5].localPosition = Vector3.MoveTowards(mSpikeSections[5].localPosition, mConeGoal, mSpeed);
if (Mathf.Approximately(transform.localPosition.y, mBaseSpikeEnd) &&
Mathf.Approximately(mSpikeSections[1].localPosition.y, mCylinderEnd) &&
Mathf.Approximately(mSpikeSections[5].localPosition.y, mConeEnd))
{
mExpanding = false; //probably unnecessary
transform.localPosition = mBaseGoal;
mSpikeSections[5].localPosition = mConeGoal;
yield break; //putting this here stops it from looping, but it still won't fire a second time
}
yield return null;
}
mExpanding = false;
}
public void CollapseSequence()
{
if (!mCollapsing)
{
StartCoroutine(mCollapse);
}
}
private IEnumerator _CollapseSequence()
{
mCollapsing = true;
mBaseGoal = transform.localPosition - mBaseDistance * Vector3.up;
mConeGoal = mSpikeSections[5].localPosition - mConeDistance * Vector3.up;
while (transform.localPosition.y < mBaseSpikeStart || mSpikeSections[1].localPosition.y < mCylinderStart
|| mSpikeSections[5].localPosition.y < mConeStart)
{ //only using the first cylinder section in the condition since they all move the same distance
transform.localPosition = Vector3.MoveTowards(transform.localPosition, mBaseGoal, mSpeed);
mSpikeSections[1].localPosition = mSpikeSections[2].localPosition = mSpikeSections[3].localPosition =
mSpikeSections[4].localPosition = Vector3.MoveTowards(mSpikeSections[1].localPosition, Vector3.zero, mSpeed);
mSpikeSections[5].localPosition = Vector3.MoveTowards(mSpikeSections[5].localPosition, mConeGoal, mSpeed);
if (Mathf.Approximately(transform.localPosition.y, mBaseSpikeStart) &&
Mathf.Approximately(mSpikeSections[1].localPosition.y, mCylinderStart) &&
Mathf.Approximately(mSpikeSections[5].localPosition.y, mConeStart))
{
transform.localPosition = mBaseGoal;
mSpikeSections[5].localPosition = mConeGoal;
mCollapsing = false; //probably unnecessary
yield break; //putting this here stops it from looping, but it still won't fire a second time
}
yield return null;
}
mCollapsing = false;
}
我最后添加的 if 语句用于“损害控制”,但似乎并没有改变总体结果。展开辅助函数“Expand()”似乎每次都执行,但实际函数以及折叠辅助函数只运行一次。如果有人可以帮助我解决这个问题,将不胜感激。
解决方案
我看不到您分配的位置mExpand
和mCollapse
.
但我猜你只做了一次,例如在Start
. 然后它只发生一次,因为分配的例程在第一次运行后已经完成。
它可能应该是例如
public void ExpandSequence()
{
if (!mExpanding)
{
mExpand = StartCoroutine(_ExpandSequence());
}
}
并因此也用于折叠例程,以便运行一个新 IEnumerator
的/Coroutine
而不是已经运行到最后的一个。
推荐阅读
- angular - angular 11 和 php api 的 CORS 策略错误
- java - 如何将 .xls、.xlsx 文件转换为 .pdf 文件
- async-await - 量角器等待异步请求
- elasticsearch - 如何使用 Elasticsearch 中的摄取管道在无痛脚本中插入摄取节点 IP?
- python - 使用 Pyspark 从单词列表的行条目创建元组并使用 RDD 计数
- python - 来自字符串的 Python 时区
- tensorflow - TensorFlow 混合精度训练:Conv2DBackpropFilter 不使用 TensorCore
- android - 如何在深色模式下隐藏 Android 标题栏?
- svm - 图像数据集是线性可分的吗?
- python - 如何在python 2.7的for循环中从文件中导入函数