C# 如何循环移动?

C# 如何循环移动?,c#,unity3d,C#,Unity3d,在迷你游戏中,我在Unity中的工作是我想要循环前进的方向。我想移动对象并返回到第一个位置,但不只是一次。现在我有了这个代码,可以让我工作,移动到定位和返回系统。如何更改此代码以在移动中生成循环 public class TestMovement : MonoBehaviour { public float speed = 3; public Vector3 target = Vector3.zero; private Vector3 origin; void

在迷你游戏中,我在Unity中的工作是我想要循环前进的方向。我想移动对象并返回到第一个位置,但不只是一次。现在我有了这个代码,可以让我工作,移动到定位和返回系统。如何更改此代码以在移动中生成循环

public class TestMovement : MonoBehaviour
{
    public float speed = 3;
    public Vector3 target = Vector3.zero;
    private Vector3 origin;

    void Start(){
        origin = transform.position;
    }

    void Update(){
        TestTransform ();
    }


    void TestTransform (){
        transform.position = Vector3.MoveTowards (transform.position, target, speed * Time.deltaTime);
        if (transform.position == target) target = origin;
    }
}

TestTransform是从Update调用的,这意味着它每帧调用一次。所以,只要你的游戏还在运行,你基本上已经处于一个无止境的循环中。让我们看看您现有的代码和期望的结果: 现有代码立即开始向目标移动。到达目标后,它将目标切换回原点,并开始向新目标返回

您的代码在第一次通过时将目标更改为原点。之后,一旦它返回到现在是原点的新目标,它就只是坐在那里,测试transform.position==target,并在每一帧上反复设置target=origin

如果希望对象在原点和目标之间来回反弹,则需要进行以下几项更改:

你需要第三个向量,我们称之为currentTarget。 启动时,设置currentTarget=target。 在TestTransform中,更改测试的位置,并将target改为在currentTarget上操作。当你改变它时,你需要考虑CurrnTrar是否设置为目标或原点,并选择另一个作为下一个目标。 最终结果应该是currentTarget在目标和原点之间来回更改


旁注:正如其他人在评论中提到的那样,测试向量的精确相等性并不总是有效的-你应该检查向量之间的距离,并等待它小于某个非常小的值。

这样你就可以移动任意多个位置,只需为每个目标创建空的游戏对象,并将它们添加到inspector中的列表中。您的变换将在循环中移动,当然,如果您只需要2个位置,请在列表中添加2个元素。另外,我在脚本中添加了所有内容只是为了让它更容易理解,我建议使用管理目标的逻辑进行另一个方法CheckNextPosition

   public class TestMovement : MonoBehaviour
    {
        public float speed = 3;
        public List<Transform> targets= new List<Transform();
        public Transform target;
        protected int currentTargetIndex=0;


        void Start(){
            origin = transform.position;
            target= targets[currentTargetIndex];
        }

        void Update(){
            TestTransform ();
        }


        void TestTransform (){
            transform.position = Vector3.MoveTowards (transform.position, target.position, speed * Time.deltaTime);
        if (transform.position == target.position)//check if you reached the target
        {            
            if(currentTargetIndex >= targets.Count)//check if you reached the last position in your targets list
            {
               currentTargetIndex=0;//go to first target in your target list
            }
            else
            {
               currentTargetIndex++;// go to next target in your target list
            }
            target=targets[currentTargetIndex];// set the next target
        }
     }
}

用乒乓球轻松地做摆动

float distanceBetweenPosts = Vector3.Distance(origin, target);

float distanceTowardTarget = Mathf.PingPong(Time.time * speed, distanceBetweenPosts);

float percentageDistance = distanceTowardTarget / distanceBetweenPosts;

Vector3 currentOffset = (target-origin ) * percentageDistance;

Vector3 currentPosition = origin + currentOffset;

transform.position = currentPosition;
如果要为从原点开始的目标设置特定的时间开始时间,则可以使用:

float distanceTowardTarget = Mathf.PingPong((Time.time-startTime) * speed, 
                                            distanceBetweenPosts);

当转换到达目标时,只需检查目标是否为原点。如果是,请将其设置为您的目的地,否则请将其设置为原点。p、 你不应该这样比较两个向量,因为浮点值可能不完全相同。你可以使用一个更有效的数组,用模符号计算下一个索引:currentTargetIndex=currentTargetIndex+1%targets.count;它工作正常,但我有一个小问题。当对象在两个位置之间移动时,我创建了两个空目标对象,它给我的参数超出范围。参数名称:索引列表。计数==2?检查一下。对于2个位置,currentIndex应仅等于0或1。