玩家根据速度追踪不同的航路点

本文关键字:航路 追踪 速度 玩家 | 更新日期: 2023-09-27 17:59:01

我想问题出在路点脚本的某个地方。

如果我让玩家慢慢走,比如说速度1或2,他走到第一个航路点,然后在到达第二个航路点时转向下一个航路点。而不是回到原来的位置,他绕了一圈,然后走回第一个航路。我想让它做的不是走到第一个航路点,而是走到它原来的起始位置。

另一件事是,如果我把玩家的速度改为7,我会看到他走得很快,当他到达第二个航路点时,他向左转弯,一直向左走。就像根据球员的速度不同,他的表现也不同。

这是一个视频剪辑,显示了播放器的速度2:第二个走得更快的玩家是速度2,看看当他到达第二个航路点时会发生什么:

视频剪辑速度2

这是第二个使用7速的玩家

视频剪辑速度7

这是c#中的路点脚本

using UnityEngine;
using System.Collections;
public class Waypoints : MonoBehaviour {
    public Transform[] waypoint;
    public float patrolSpeed;
    public bool loop = true;
    public int dampingLook = 4;
    public float pauseDuration;
    private float curTime;
    private int currentWaypoint = 0;
    public CharacterController character;
    // Use this for initialization
    void Start () {

    }
    void LateUpdate(){
        if(currentWaypoint < waypoint.Length){
            patrol();
        }else{    
            if(loop){
                currentWaypoint=0;
            } 
        }
    }
    void patrol(){
        Vector3 nextWayPoint = waypoint[currentWaypoint].position;
        // Keep waypoint at character's height
        nextWayPoint.y = transform.position.y; 
        // Get the direction we need to move to
        // reach the next waypoint
        Vector3 moveDirection = nextWayPoint - transform.position;

        if(moveDirection.magnitude < 1.5){
            Debug.Log("enemy is close to nextwaypoint");

            // This section of code is called only whenever the enemy
            // is very close to the new waypoint 
            // so it is called once after 4-5 seconds.
            if (curTime == 0)
                // Pause over the Waypoint 
                curTime = Time.time; 
            if ((Time.time - curTime) >= pauseDuration){
                Debug.Log("increasing waypoint");
                currentWaypoint++;
                curTime = 0;
            }
        }
        else
        {     
            Debug.Log("reaching in rotation " + moveDirection.magnitude);
            // This code gets called every time update is called
            // while the enemy if moving from point 1 to point 2.
            // so it gets called 100's of times in a few seconds  
            // Now we need to do two things
            // 1) Start rotating in the desired direction
            // 2) Start moving in the desired direction 
            // 1) Let' calculate rotation need to look at waypoint
            // by simply comparing the desired waypoint & current transform
            var rotation = Quaternion.LookRotation(nextWayPoint - transform.position);
            // A slerp function allow us to slowly start rotating 
            // towards our next waypoint 
            transform.rotation = Quaternion.Slerp(transform.rotation, rotation, 
                Time.deltaTime * dampingLook);
            // 2) Now also let's start moving towards our waypoint
            character.Move(moveDirection.normalized * patrolSpeed * Time.deltaTime);
        }  
    }
}

也许玩家的这种奇怪行为从物理角度来看是可以的?那么,如果速度太快,它会做出这种行为吗?但这很奇怪。我想,不管它以多快的速度在两个航路点之间穿行,不是吗?

玩家根据速度追踪不同的航路点

如果我让玩家慢慢走,比如说速度1或2,他走到第一个航路点,然后在到达第二个航路点时转向下一个航路点。而不是回到原来的位置,他绕了一圈,然后走回第一个航路。我想让它做的不是走到第一个航路点,而是走到它原来的起始位置。

这是因为当敌人到达你的最后一个检查点时,你将currentWaypoint设置为0。因此,下一帧敌人将寻找该航路点。既然你的起始位置不是一个航路点,他就再也不会走到那个位置了。你可以做的是制作另一个与你的敌人起始位置相同的航路点。这样它就会回到原来的位置。

另一件事是,如果我把玩家的速度改为7,我会看到他走得很快,当他到达第二个航路点时,他向左转弯,一直向左走。就像根据球员的速度不同,他的表现也不同。

这是因为移动(位置)和旋转与您的巡逻速度不同步。你只是在增加行走速度,而不是旋转速度。因此,每当你的敌人走了一段距离,它就需要重新开始旋转。试着用旋转你的敌人

transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * patrolSpeed);

如果速度仍然很慢,请尝试增加旋转的速度修改器。

对于第一个问题,您永远不会存储"原始"位置——您只有路点。因此,当实体到达最后一个航路点时,它会为第一个航路点waypoint[0]设置航向,因为这就是LateUpdate()currentWaypoint设置为的。

至于基于速度的实体更改行为,有两件事需要检查——它是否真的到达了if(moveDirection.magnitude < 1.5)块内部?如果没有,它在一帧中移动得太快而无法检测。但看起来你总是在moveDirection中移动,这实际上不受你计算的旋转的影响,除非你的Move()函数的工作方式与我预期的不同,所以实体很可能因此一直朝着一个方向前进。