該腳本附著在 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();
。

慕蓋茨4494581
TA貢獻1850條經驗 獲得超11個贊
你應該這樣識別你的協程:
你必須在不同的對象上使用不同的協程
Coroutine c1;
Coroutine c2;
void runCourotines()
{
c1 = StartCoroutine(MoveToX());
c2 = StartCoroutine(MoveToX());
}
void StopCoroutines()
{
StopCoroutine(c1);
}
- 2 回答
- 0 關注
- 138 瀏覽
添加回答
舉報
0/150
提交
取消