gpt4 book ai didi

c# - Vector3.MoveTowards 不工作。它不会移动或显示任何错误

转载 作者:行者123 更新时间:2023-12-05 06:03:49 28 4
gpt4 key购买 nike

当使用 Vector3.MoveTowards 时,它不会对任何一个执行任何操作,因为一个无法运行会导致另一个无法运行。

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PlaneAI : MonoBehaviour
{
public Transform[] runwayPoints;
public Transform[] startTakeoffPoints;
public Transform[] takeoffPoints;
public NavMeshAgent navMeshAgent;
public bool takeoff = false;
bool departing = false;
bool moving = false;
int selectedRunway;
public IEnumerator Depart()
{
navMeshAgent.SetDestination(runwayPoints[selectedRunway = Random.Range(0, runwayPoints.Length)].position);
yield return new WaitForSeconds(3f);
departing = true;
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
StartCoroutine(Depart());
}
GetComponent<LineRenderer>().SetPosition(0, new Vector3(transform.position.x, 1, transform.position.z));
GetComponent<LineRenderer>().SetPosition(1, navMeshAgent.destination);
if (navMeshAgent.pathStatus == NavMeshPathStatus.PathComplete && departing && navMeshAgent.remainingDistance == 0)
{
Takeoff();
}
if (moving && Vector3.Distance(transform.position, startTakeoffPoints[selectedRunway].position) <= 0.001f)
{
transform.position = Vector3.MoveTowards(transform.position, takeoffPoints[selectedRunway].position, 3); // this one does not work it should be after the other one
transform.LookAt(takeoffPoints[selectedRunway]);
takeoff = false;
}
}
public void Takeoff()
{
navMeshAgent.enabled = false;
GetComponent<Collider>().enabled = false;
transform.LookAt(new Vector3(takeoffPoints[selectedRunway].position.x, 0, takeoffPoints[selectedRunway].position.z));
MoveTakeoff();
departing = false;
}
public void MoveTakeoff()
{
transform.position = Vector3.MoveTowards(transform.position, startTakeoffPoints[selectedRunway].position, 2); // this one does not work
moving = true;
takeoff = false;
}
}

没有脚本错误,只是行不通。

我认为不相关的唯一错误是:

“无效的 worldAABB。对象太大或离原点太远。”

“无效的 localAABB。对象转换已损坏。”

“表达式断言失败:'IsFinite(d)'UnityEngine.GUIUtility:processEvent(Int32, IntPtr)"

“表达式断言失败:'IsFinite(outDistanceForSort)'UnityEngine.GUIUtility:processEvent(Int32, IntPtr)"

“表达式断言失败:'IsFinite(outDistanceAlongView)'UnityEngine.GUIUtility:processEvent(Int32, IntPtr)"

最佳答案

您需要更好地将状态转换逻辑与状态事件逻辑分开。当状态转换发生在相同的 block 中时,您有代码应该运行,代码应该在状态处于事件状态的每一帧运行。

处理此问题的一种方法是将状态转换为协程:

public class PlaneAI : MonoBehaviour
{
public Transform[] runwayPoints;
public Transform[] startTakeoffPoints;
public Transform[] takeoffPoints;
public NavMeshAgent navMeshAgent;
public bool takeoff = false;
bool departing = false;
bool moving = false;
int selectedRunway;

LineRenderer lr;

void Awake()
{
lr = GetComponent<LineRenderer>();
}

IEnumerator Depart()
{
navMeshAgent.SetDestination(runwayPoints[selectedRunway = Random.Range(0,
runwayPoints.Length)].position);
yield return new WaitForSeconds(3f);

departing = true;
while(departing)
{
if (navMeshAgent.pathStatus == NavMeshPathStatus.PathComplete
&& navMeshAgent.remainingDistance == 0)
{
StartCoroutine(MoveTakeoff());
yield break;
}
yield return null;
}
}

IEnumerator MoveTakeOff()
{
departing = false;
moving = true;

navMeshAgent.enabled = false;
GetComponent<Collider>().enabled = false;
transform.LookAt(new Vector3(takeoffPoints[selectedRunway].position.x, 0,
takeoffPoints[selectedRunway].position.z));

while (moving)
{
if (Vector3.Distance(transform.position,
startTakeoffPoints[selectedRunway].position) <= 0.001f)
{
StartCoroutine(TakeOff())
yield return break;
}

transform.position = Vector3.MoveTowards(transform.position,
startTakeoffPoints[selectedRunway].position, 2);

yield return null;
}
}

IEnumerator Takeoff()
{
moving = false;
takeOff = true;

transform.LookAt(takeoffPoints[selectedRunway]);

while (takeOff)
{

if (Vector3.Distance(transform.position,
startTakeoffPoints[selectedRunway].position) <= 0.001f)
{
takeoff = false;
yield break;
}

transform.position = Vector3.MoveTowards(transform.position,
takeoffPoints[selectedRunway].position, 3);
yield return null;
}
}

void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
StopAllCoroutines();
StartCoroutine(Depart());
}

lr.SetPosition(0, new Vector3(transform.position.x, 1, transform.position.z));
lr.SetPosition(1, navMeshAgent.destination);

}
}

理想情况下,状态应该是单个枚举器而不是多个 bool 值,但希望这能说明我的意思。

关于c# - Vector3.MoveTowards 不工作。它不会移动或显示任何错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66556751/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com