玩家根据速度不同地跟踪航点

时间:2016-07-27 18:01:13

标签: c# unity3d unityscript unity5

我猜的问题是在某处的路标脚本中。

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

另一件事,如果我将玩家速度改为7,当他到达第二个航点时,他看到它走得很快,他向左转,继续向左走。喜欢取决于玩家的速度,他的行为也不同。

这是一个视频片段,显示玩家的速度2: 第二个走得更快的球员是速度2,看看当他到达第二个航点时会发生什么:

video clip speed 2

这是速度7的第二个玩家

video clip speed 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);
        }  
    }
}

自从物理学以来,玩家的这种奇怪行为可能还行吗?所以,如果它太快,它会发生这种行为吗?但这很奇怪。我认为无论它在航点之间行走的速度如何?

2 个答案:

答案 0 :(得分:1)

  

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

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

  

另一件事,如果我将玩家速度改为7,当他到达第二个航点时,他看到它走得很快,他向左转,继续向左走。喜欢取决于玩家的速度,他的行为也不同。

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

旋转你的敌人
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * patrolSpeed);

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

答案 1 :(得分:0)

至于第一个问题,你从不存储“原始”位置 - 你只有路标。因此,当实体到达最后一个航点时,它会设置第一个航点的航线waypoint[0],因为LateUpdate()currentWaypoint设置为。{/ p>

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