C# 我将如何在下面的AI代码中实现navmesh寻路。统一
我有这个代码,使敌人跟随我的球员(和攻击等),但我不知道如何添加导航网格到这个,使它可以导航障碍。目前,它继续前进,并卡在墙上和障碍物上。 我以前从未使用过navmesh 如何在这段代码中实现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
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
现在剩下的就是让你的navmeshWindow->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论坛或