Unity 物体运动 之 物体按规定路线运动的优化

2025-09-29 12:37:53

1、Vector3.MoveTowards:

1)功能简述

public static Vector3 MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);

Moves a point current in a straight line towards a target point.

The value returned by this function is a point maxDistanceDelta units closer to a target/ point along a line between currentand target. If the target is closer than maxDistanceDelta/ then the returned value will be equal to target (ie, the movement will not overshoot the target). Negative values of maxDistanceDelta can be used to push the point away from the target.

2)使用举例

 using UnityEngine;

 using System.Collections;public class ExampleClass : MonoBehaviour {

    public Transform target;

    public float speed;

    void Update() {

        float step = speed * Time.deltaTime;

        transform.position = Vector3.MoveTowards(transform.position, target.position, step);

    }

 }

2、Transform.LookAt:

1)功能简述

public void LookAt(Transform target, Vector3 worldUp = Vector3.up);

Parameters

target:Object to point towards.

worldUp:Vector specifying the upward direction.

Rotates the transform so the forward vector points at /target/'s current position.

Then it rotates the transform to point its up direction vector in the direction hinted at by the worldUp vector. If you leave out the worldUp parameter, the function will use the world y axis. worldUp is only a hint vector. The up vector of the rotation will only match the worldUp vector if the forward direction is perpendicular to worldUp.

2)使用举例

// This complete script can be attached to a camera to make it 

// continuously point at another object.// The target variable shows up as a property in the inspector. 

// Drag another object onto it to make the camera look at it. 

 using UnityEngine;

 using System.Collections;public class ExampleClass : MonoBehaviour{

    public Transform target;    void Update()    {

        // Rotate the camera every frame so it keeps looking at the target

        transform.LookAt(target);

    }

 }

1、在Unity场景中新建一个“Plane”和“Cube”是低昂调整大小与布局,“Maain Camera”的视角调整好,具体如下图

Unity 物体运动 之 物体按规定路线运动的优化

2、在场景中添加路线的关键点,演示需要大致随意摆放几个点,具体如下图

Unity 物体运动 之 物体按规定路线运动的优化

Unity 物体运动 之 物体按规定路线运动的优化

3、在工程中,仙剑两个脚本“Move”和“WayPoints”,代开脚本进行编辑,具体如下图

Unity 物体运动 之 物体按规定路线运动的优化

4、在“WayPoints”脚本上编辑代码,具体代码和代码说明如下图

Unity 物体运动 之 物体按规定路线运动的优化

5、“WayPoints”脚本具体内容如下:

using UnityEngine;

public class WayPoints : MonoBehaviour

{

    public static Transform[] wayPoints;

    void Awake()

    {

        int count = transform.childCount;

        wayPoints = new Transform[count];

        for (int i = 0; i < count; i++)

        {

            wayPoints[i] = transform.GetChild(i);

        }

    }

}

6、在“Move”脚本上编辑代码,本脚本关键使用LookAt朝向目标,然后MoveTowards在移动到目标点,具体代码和代码说明如下图

Unity 物体运动 之 物体按规定路线运动的优化

7、“Move”脚本具体内容如下:

using UnityEngine;

public class Move : MonoBehaviour

{

    public float speed = 5;

    private Transform[] ways;

    private int index;

    // Use this for initialization

    void Start(){

        ways = WayPoints.wayPoints;

        index = 0;

    }

    // Update is called once per frame

    void Update(){

        MoveTo();

    }

    void MoveTo(){

        if (index > ways.Length - 1)

            return;

        

        //保证正面朝向物体运动

        transform.LookAt(ways[index].position);

        transform.position = Vector3.MoveTowards(transform.position,

            ways[index].position, Time.deltaTime * speed);

        if (Vector3.Distance(ways[index].position, transform.position) < 0.2f){

            index++;

            if (index == ways.Length){

                transform.position = ways[index - 1].position;

            }

        }

    }

}

8、脚本编译正确,回到Unity界面,“WayPoints”脚本赋给场景中的“WayPoints”,“Move”脚本赋给“Cube”

9、运行场景,可以看到,物体首先朝向目标点,然后在向目标点运动,弥补朝向不变的不足,具体如下图

Unity 物体运动 之 物体按规定路线运动的优化

10、到此,《Unity 物体运动 之 物体按规定路线运动的优化》讲解结束,谢谢

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢