C# 我将如何在下面的AI代码中实现navmesh寻路。统一

C# 我将如何在下面的AI代码中实现navmesh寻路。统一,c#,unity3d,path-finding,navmesh,C#,Unity3d,Path Finding,Navmesh,我有这个代码,使敌人跟随我的球员(和攻击等),但我不知道如何添加导航网格到这个,使它可以导航障碍。目前,它继续前进,并卡在墙上和障碍物上。 我以前从未使用过navmesh 如何在这段代码中实现navmesh寻路 多谢各位 using UnityEngine; using System.Collections; public class wheatleyfollow : MonoBehaviour { public GameObject ThePlayer; public fl

我有这个代码,使敌人跟随我的球员(和攻击等),但我不知道如何添加导航网格到这个,使它可以导航障碍。目前,它继续前进,并卡在墙上和障碍物上。 我以前从未使用过navmesh

如何在这段代码中实现navmesh寻路

多谢各位

using UnityEngine;
using System.Collections;

public class wheatleyfollow : MonoBehaviour {

    public GameObject ThePlayer;
    public float TargetDistance;
    public float AllowedRange = 500;
    public GameObject TheEnemy;
    public float EnemySpeed;
    public int AttackTrigger;
    public RaycastHit Shot;

    void Update() {
        transform.LookAt (ThePlayer.transform);
        if (Physics.Raycast (transform.position, transform.TransformDirection (Vector3.forward), out Shot)) {
            TargetDistance = Shot.distance;
            if (TargetDistance < AllowedRange) {
                EnemySpeed = 0.05f;
                if (AttackTrigger == 0) {
                    transform.position = Vector3.MoveTowards (transform.position, ThePlayer.transform.position, EnemySpeed);
                }
            } else {
                EnemySpeed = 0;
            }
        }

        if (AttackTrigger == 1) {
            EnemySpeed = 0;
            TheEnemy.GetComponent<Animation> ().Play ("wheatleyattack");
        }
    }

    void OnTriggerEnter() {
        AttackTrigger = 1;
    }

    void OnTriggerExit() {
        AttackTrigger = 0;
    }

}
使用UnityEngine;
使用系统集合;
公共类惠特莱:单一行为{
公共游戏对象层;
公共浮动目标距离;
公共浮动允许范围=500;
公众游戏对象的敌人;
公共浮动速度;
公共int攻击触发器;
公共广播;
无效更新(){
transform.LookAt(ThePlayer.transform);
if(Physics.Raycast(transform.position、transform.TransformDirection(Vector3.forward)、out Shot)){
TargetDistance=射击距离;
if(目标距离<允许范围){
敌人速度=0.05f;
if(AttackTrigger==0){
transform.position=Vector3.movetoward(transform.position,ThePlayer.transform.position,EnemySpeed);
}
}否则{
敌人速度=0;
}
}
if(AttackTrigger==1){
敌人速度=0;
TheEnemy.GetComponent().Play(“惠特莱攻击”);
}
}
void ontriggenter(){
AttackTrigger=1;
}
void OnTriggerExit(){
AttackTrigger=0;
}
}

首先,我们需要在保存此脚本的对象上使用
NavMeshAgent
,然后保存对代理的引用。我们还需要一个
NavMeshPath
来存储我们的路径(这不是一个可附加的组件,我们将在代码中创建它)

我们需要做的就是使用
CalculatePath
SetPath
更新路径。您可能需要对代码进行一些微调,但这是最基本的。您可以使用
CalculatePath
生成路径,然后使用
SetPath
确定是否要执行该路径

注意:我们可以使用
SetDestination
,但是如果你有很多AI单元,如果你需要即时路径,它可能会变慢,这就是为什么我通常使用
CalculatePath
SetPath

现在剩下的就是让你的navmesh
Window->Navigation
。在那里你可以调整你的代理和区域。所需的一个步骤是在
bake
选项卡中烘焙网格

Unity支持预制组件和其他组件上的NavMesh,但是,这些组件尚未构建到Unity中,因为您需要将它们构建到项目中

正如您所见,由于现在由
NavMeshAgent
控制,您的所有速度和移动都已被删除

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class wheatleyfollow : MonoBehaviour {

  public GameObject ThePlayer;
  public float TargetDistance;
  public float AllowedRange = 500;
  public GameObject TheEnemy;
  public int AttackTrigger;
  public RaycastHit Shot;

  private NavMeshAgent agent;
  private NavMeshPath path;

  void Start() {
    path = new NavMeshPath();
    agent = GetComponent<NavMeshAgent>();
  }

  void Update() {
    if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out Shot)) {
      TargetDistance = Shot.distance;
      if (TargetDistance < AllowedRange && AttackTrigger == 0) {
        agent.CalculatePath(ThePlayer.transform.position, path);
        agent.SetPath(path);
      }
    }
    if (AttackTrigger == 1) {
      TheEnemy.GetComponent<Animation>().Play("wheatleyattack");
    }
  }

  void OnTriggerEnter() {
    AttackTrigger = 1;
  }

  void OnTriggerExit() {
    AttackTrigger = 0;
  }

}
使用UnityEngine;
使用UnityEngine.AI;
[RequiredComponent(类型(NavMeshAgent))]
公共类惠特莱:单一行为{
公共游戏对象层;
公共浮动目标距离;
公共浮动允许范围=500;
公众游戏对象的敌人;
公共int攻击触发器;
公共广播;
私人代理;
专用导航路径;
void Start(){
路径=新的NavMeshPath();
agent=GetComponent();
}
无效更新(){
if(物理.光线投射(变换.位置,变换.变换方向(矢量3.向前),出射)){
TargetDistance=射击距离;
if(TargetDistance

旁注:您应该删除任何未使用的
,因为这会使您的最终版本膨胀。

欢迎好先生。你最好在Unity论坛或