玩家根据速度追踪不同的航路点
本文关键字:航路 追踪 速度 玩家 | 更新日期: 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()
函数的工作方式与我预期的不同,所以实体很可能因此一直朝着一个方向前进。