如何解决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,mSpeed);
mSpikeSections[1].localPosition = mSpikeSections[2].localPosition = mSpikeSections[3].localPosition =
mSpikeSections[4].localPosition = Vector3.MoveTowards(mSpikeSections[1].localPosition,Vector3.zero,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
而不是已经运行到最后的程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。