为了账号安全,请及时绑定邮箱和手机立即绑定

当其他协程已经在运行时,如何让协程启动并继续工作?

当其他协程已经在运行时,如何让协程启动并继续工作?

C#
隔江千里 2023-09-24 15:50:11
该脚本附着在 3 个立方体上。每个立方体都有另一个标签。using System.Collections;using System.Collections.Generic;using UnityEngine;public class raytest : MonoBehaviour{    public float duration;    public string tag;    private Vector3 originalpos;    private void Start()    {        originalpos = transform.position;    }    private void Update()    {        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);        RaycastHit hit;        if (Physics.Raycast(ray, out hit, 100))        {            if (hit.transform.tag == tag)            {                 if (transform.position.z != originalpos.z - 1)                   StartCoroutine(moveToX(transform, new Vector3(transform.position.x, transform.position.y, transform.position.z - 1), duration));            }            else            {                 StartCoroutine(moveToX(transform, originalpos, duration));            }        }        else        {             //reset             StartCoroutine(moveToX(transform, originalpos, duration));        }    }    bool isMoving = false;    IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)    {        //Make sure there is only one instance of this function running        if (isMoving)        {            yield break; ///exit if this is still running        }        isMoving = true;        float counter = 0;        //Get the current position of the object to be moved        Vector3 startPos = fromPosition.position;        while (counter < duration)        {            counter += Time.deltaTime;            fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);            yield return null;        }        isMoving = false;    }}当鼠标悬停在游戏对象上并发射光线时,该对象开始移动。当光线没有击中物体时,物体就会移回到原来的位置。但有时,当我将鼠标快速移动到两个甚至三个对象上时,下一个对象不会移动,直到第一个对象完成移动。有时,物体同时移动,第一个物体向前移动,而其余物体仍移回原始位置。我不知道为什么有时当击中另一个物体时,它首先等待另一个物体回到原来的位置,然后才开始移动击中的物体?并且不要同时将它们一前一后移动。这个想法是,如果我击中一个物体并开始向前移动,一旦我击中另一个物体,第一个物体应该开始向后移动,而击中的物体应该开始平行地向前移动。
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

抱歉,如果我没有正确理解这个问题,但这就是我收集到的:

如果光线投射击中物体,则其向单向移动,如果光线投射未击中物体,则其移回其原始位置。

如果这就是您所需要的——协程不是让问题变得过于复杂了吗?例如,您可以将CheckIfRaycast.cs脚本附加到每个盒子上。在该脚本Update()方法中,您可以检查它是否被光线投射击中,然后进行所需的移动。

多个协程可能会导致一些奇怪的行为,因此请确保使用StopCoroutine(coroutine name);或停止它们StopAllCoroutines();

查看完整回答
反对 回复 2023-09-24
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

你应该这样识别你的协程:


你必须在不同的对象上使用不同的协程


Coroutine c1;

Coroutine c2;


void runCourotines()

{

    c1 = StartCoroutine(MoveToX());

    c2 = StartCoroutine(MoveToX());

}


void StopCoroutines()

{

    StopCoroutine(c1);

}


查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信