如何根据面向旋转的对象更改数组中 waypoints 的顺序?
How can i change the order of waypoints in the array according to the object facing rotation?
在脚本的顶部:
public Transform traveller;
public GameObject[] waypoints;
public Transform nextWaypoint;
public bool reverse = false;
private int targetsIndex = 0;
开始:
void Start()
{
waypoints = GameObject.FindGameObjectsWithTag("Waypoint").OrderBy(go => go.name).ToArray();
targetsIndex = 0;
}
更新中:
void Update()
{
WayPointsAI();
}
然后 WayPointsAI:
private void WayPointsAI()
{
if (targetsIndex == waypoints.Length)
targetsIndex = 0;
nextWaypoint = waypoints[targetsIndex].transform;
float distance = Vector3.Distance(traveller.transform.position, nextWaypoint.transform.position);
traveller.transform.rotation = Quaternion.Slerp(traveller.transform.rotation, Quaternion.LookRotation(nextWaypoint.position - traveller.transform.position), rotationSpeed * Time.deltaTime);
if (reverse == true)
{
var targetAngles = traveller.transform.eulerAngles + 180f * Vector3.up;
traveller.transform.eulerAngles = Vector3.Lerp(traveller.transform.eulerAngles, targetAngles, rotationSpeed * Time.deltaTime);
var lastWaypoint = waypoints[currentIndex];
}
if (distance < distancetoRotate)
{
traveller.transform.position += traveller.transform.forward * slowDownSpeed * Time.deltaTime;
}
else
{
traveller.transform.position += traveller.transform.forward * moveSpeed * Time.deltaTime;
}
if (distance < nextWaypoint.transform.localScale.magnitude)
{
rotateNumber = true;
currentIndex = targetsIndex;
if (random == false)
{
targetsIndex++;
}
else
{
targetsIndex = UnityEngine.Random.Range(0, waypoints.Length);
}
}
}
相关部分是相反的:
if (reverse == true)
{
var targetAngles = traveller.transform.eulerAngles + 180f * Vector3.up;
traveller.transform.eulerAngles = Vector3.Lerp(traveller.transform.eulerAngles, targetAngles, rotationSpeed * Time.deltaTime);
var lastWaypoint = waypoints[currentIndex];
}
当我勾选反面的复选框时,它会到达这一部分。
现在举例来说,对象访问的最后一个航点是航点 1 (currentIndex = 1)
现在这个物体让你转向另一个方向 180 度,现在我希望他继续向另一个方向移动,但是在 waypoints 之间只是相反的方向。
问题是如何更改 waypoints 数组顺序。例如,如果访问的对象的最后一个航路点是 1,现在他掉头应该回到 1,然后回到 0,然后回到 4 3 2 1 0,依此类推。
所以在任何地方我都勾选了相反的复选框,它应该改变 waypoints 数组的顺序。这是我不知道该怎么做。
它应该在行后的反面部分:
var lastWaypoint = waypoints[currentIndex];
我认为通过更合理地拆分任务可能会更好。
创建一个作为目标航路点的字段
我建议制作一个 "headtowaypoint" 的函数,它只负责前往目标航路点。
然后,有另一个函数处理在路点发生的事情,这将调用函数 setnextwaypoint,
然后有另一个函数 "reverse" 设置一个 bool 朝向最后一个航路点,并告诉 setnextwaypoint 你要去前一个,并告诉 headtowaypoint 你现在要去在列表中向下而不是向上。
在脚本的顶部:
public Transform traveller;
public GameObject[] waypoints;
public Transform nextWaypoint;
public bool reverse = false;
private int targetsIndex = 0;
开始:
void Start()
{
waypoints = GameObject.FindGameObjectsWithTag("Waypoint").OrderBy(go => go.name).ToArray();
targetsIndex = 0;
}
更新中:
void Update()
{
WayPointsAI();
}
然后 WayPointsAI:
private void WayPointsAI()
{
if (targetsIndex == waypoints.Length)
targetsIndex = 0;
nextWaypoint = waypoints[targetsIndex].transform;
float distance = Vector3.Distance(traveller.transform.position, nextWaypoint.transform.position);
traveller.transform.rotation = Quaternion.Slerp(traveller.transform.rotation, Quaternion.LookRotation(nextWaypoint.position - traveller.transform.position), rotationSpeed * Time.deltaTime);
if (reverse == true)
{
var targetAngles = traveller.transform.eulerAngles + 180f * Vector3.up;
traveller.transform.eulerAngles = Vector3.Lerp(traveller.transform.eulerAngles, targetAngles, rotationSpeed * Time.deltaTime);
var lastWaypoint = waypoints[currentIndex];
}
if (distance < distancetoRotate)
{
traveller.transform.position += traveller.transform.forward * slowDownSpeed * Time.deltaTime;
}
else
{
traveller.transform.position += traveller.transform.forward * moveSpeed * Time.deltaTime;
}
if (distance < nextWaypoint.transform.localScale.magnitude)
{
rotateNumber = true;
currentIndex = targetsIndex;
if (random == false)
{
targetsIndex++;
}
else
{
targetsIndex = UnityEngine.Random.Range(0, waypoints.Length);
}
}
}
相关部分是相反的:
if (reverse == true)
{
var targetAngles = traveller.transform.eulerAngles + 180f * Vector3.up;
traveller.transform.eulerAngles = Vector3.Lerp(traveller.transform.eulerAngles, targetAngles, rotationSpeed * Time.deltaTime);
var lastWaypoint = waypoints[currentIndex];
}
当我勾选反面的复选框时,它会到达这一部分。
现在举例来说,对象访问的最后一个航点是航点 1 (currentIndex = 1)
现在这个物体让你转向另一个方向 180 度,现在我希望他继续向另一个方向移动,但是在 waypoints 之间只是相反的方向。
问题是如何更改 waypoints 数组顺序。例如,如果访问的对象的最后一个航路点是 1,现在他掉头应该回到 1,然后回到 0,然后回到 4 3 2 1 0,依此类推。
所以在任何地方我都勾选了相反的复选框,它应该改变 waypoints 数组的顺序。这是我不知道该怎么做。 它应该在行后的反面部分:
var lastWaypoint = waypoints[currentIndex];
我认为通过更合理地拆分任务可能会更好。
创建一个作为目标航路点的字段
我建议制作一个 "headtowaypoint" 的函数,它只负责前往目标航路点。
然后,有另一个函数处理在路点发生的事情,这将调用函数 setnextwaypoint,
然后有另一个函数 "reverse" 设置一个 bool 朝向最后一个航路点,并告诉 setnextwaypoint 你要去前一个,并告诉 headtowaypoint 你现在要去在列表中向下而不是向上。