unity3d WayPoint路点寻路,AI

unity3d WayPoint路点寻路,AI前言一个简单的人工智能 WayPointWayP 游戏中敌人根据几个巡逻点自动巡逻 在巡逻过程中 时刻监听英雄 敌人 和自己距离是否达到追击范围 不巡逻 最近英雄 在追击过程中 监听是否达到攻击范围 不追击 攻击 所需对象当前玩家敌人 3 个巡逻点每个对象的脚本脚本类 1 巡逻点 这里给每个巡逻点添加这个类 并拖入这个巡逻点的下一个巡逻点 pu

前言

所需对象

  1. 当前玩家
  2. 敌人
  3. 3个巡逻点
    1

每个对象的脚本

2

脚本类

1.巡逻点 ,这里给每个巡逻点添加这个类,并拖入这个巡逻点的下一个巡逻点

public class WayPoint : MonoBehaviour { public WayPoint NextWayPoint; } 

2.控制玩家移动脚本

public class PlayerMove : MonoBehaviour { void Update () { float h = Input.GetAxis ("Horizontal"); //x轴 ad float v = Input.GetAxis ("Vertical");//z轴 ws transform.Translate (h * Time.deltaTime * 2, 0, 0); transform.Translate (0, 0, v * Time.deltaTime * 2); } }

3.敌人巡逻AI,发现玩家就追击玩家,到一定距离攻击

using UnityEngine; using System.Collections; ///  /// Enemy AI. /// 敌人的AI, /// 1. 3个点之间的巡逻 /// 2. 追击,攻击英雄 ///  public class EnemyAI : MonoBehaviour { public WayPoint _startWayPoint; WayPoint _targetWayPoint; public GameObject _playerPoint; GameObject _targetPoint; void Start(){ _startWayPoint = GameObject.Find ("WayPoint1").GetComponent 
    
      (); _playerPoint = GameObject.Find ( 
     "Player"); Vector3 v = _startWayPoint.transform.position; 
     // < 某值,根据实际值计算 
     if (Vector3.Distance (v, transform.position) < 
     0.5f) { _targetWayPoint = _startWayPoint.NextWayPoint; } 
     else { _targetWayPoint = _startWayPoint; } StartCoroutine (MyAI()); } 
     //第一种在Update里,使用主进程来写 
     /* void Update(){ //巡逻前提->不用追击英雄 Debug.Log("update..."); //判断是否到达追击的范围 if (Vector3.Distance (transform.position, _playerPoint.transform.position) < 5) { Debug.Log ("发现玩家..."); if (Vector3.Distance (transform.position, _playerPoint.transform.position) < 1) { //播放攻击动画 Debug.Log ("攻击动画..."); } else { //追击 Debug.Log ("追击中..."); _targetPoint = _playerPoint; transform.LookAt (_targetPoint.transform); transform.Translate (Vector3.forward * Time.deltaTime*2f, Space.Self); } } else { //巡逻 Debug.Log ("巡逻中..."); Vector3 v = _targetWayPoint.transform.position; if (Vector3.Distance (transform.position, v) < 0.5f) { _targetWayPoint = _targetWayPoint.NextWayPoint; Debug.Log("巡逻下一个点"+_targetWayPoint.name); } transform.LookAt (_targetWayPoint.transform.position); transform.Translate (Vector3.forward * Time.deltaTime*2f, Space.Self); } } */ 
     //以下使用协程来写 
     //巡逻 IEnumerator MyAI(){ 
     while ( 
     true) { Vector3 v = _playerPoint.transform.position; 
     if (Vector3.Distance (transform.position, v) > 
     5f) { Debug.Log ( 
     "巡逻中..."); Vector3 nextP = _targetWayPoint.transform.position; 
     if (Vector3.Distance (transform.position, nextP) < 
     0.5f) { Debug.Log ( 
     "走下一个巡逻点"); _targetWayPoint = _targetWayPoint.NextWayPoint; 
     yield 
     return 
     new WaitForSeconds ( 
     1); } transform.LookAt (_targetWayPoint.transform); transform.Translate (Vector3.forward * Time.deltaTime, Space.Self); } 
     else { 
     //Debug.Log ("发现玩家"); 
     yield 
     return StartCoroutine (MyNewAI ()); } 
     yield 
     return 
     new WaitForEndOfFrame (); } } 
     //追击 IEnumerator MyNewAI(){ 
     while ( 
     true) { Vector3 PPos = _playerPoint.transform.position; 
     if (Vector3.Distance (transform.position, PPos) > 
     5) { Debug.Log ( 
     "玩家超出追击范围,继续巡逻..."); 
     yield 
     break; } 
     else { 
     if (Vector3.Distance (transform.position, PPos) < 
     1) { Debug.Log ( 
     "攻击中..."); } 
     else { Debug.Log ( 
     "追击玩家..."); _targetPoint = _playerPoint; transform.LookAt (_targetPoint.transform.position); transform.Translate (Vector3.forward * Time.deltaTime, Space.Self); } } 
     yield 
     return 
     new WaitForEndOfFrame (); } } } 
    

总结

  1. 这个WayPoint路点寻路AI,其实一开始就一直在检查、获取玩家距离,
  2. 如果玩家玩家距离过大,就进行巡逻逻辑
  3. 当玩家进入设置的距离范围时,则调用追击、攻击的逻辑
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209546.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午9:00
下一篇 2026年3月19日 上午9:00


相关推荐

  • c语言和java哪个有前途_C语言和Java哪个难学

    c语言和java哪个有前途_C语言和Java哪个难学C 语言和 Java 哪个难学 相信对于编程有一定了解的小伙伴 肯定都知道 C 语言是基础 比较夸张地说 掌握 C 语言也就无所不能了 因此 C 语言的难度可想而知 相比于 C 语言 Java 对于入门编程语言的学习者来说 则要友好得多 至于找工作的问题 可以说只要掌握了 C 语言和 Java 其中任何一门语言 就业就都不是问题了 下面我们来详细对比一下 C 语言和 Java 的学习难易程度 不知道大家作为程序员 看到过这么一个段子没

    2026年3月19日
    2
  • C语言-函数-递归数列

    C语言-函数-递归数列题目:递归数列类别函数与递归程序类型:代码片段时间限制:2S内存限制10000Kb问题描述一个数列A定义如下A(1)=1,A(2)=1/(1+A(1)),A(3)=1/(1+A(2)),……A(n)=1/(1+A(n-1))。定义一个函数function用来计算数列的第第n项的值,函数声明如下:doublefunction(intn);输入说明:输入为1个…

    2025年10月28日
    5
  • 新编原创-Hcash(hsr)矿工指南,含出矿算法分析、各种显卡算力分析和收益计算模型

    新编原创-Hcash(hsr)矿工指南,含出矿算法分析、各种显卡算力分析和收益计算模型Hcash超级现金于2017-9-13日正式开始切换到POW/POS挖矿模式,本文旨在修正和完善前篇【深度分析-从源代码看Hcash(超级现金)的矿业指南和矿工规划,含挖矿收益预估】中的分析,针对HSR矿工进行详尽的指导和收益模型分析。

    2022年5月2日
    72
  • 看板娘制作

    看板娘制作https www cnblogs com yjlblog p 8724881 html utm source gold browser extension 转载于 https www cnblogs com 1129 tangqiyuan p 9838291 html

    2026年3月18日
    2
  • iframe标签使用

    iframe标签使用使用场景 一般的调用子功能在特定的布局内去跳转页面则可以用 iframe 来请求直接获取子功能页面 iframe 标签的作用 iframe 标签可以实现 html 主页面嵌套 html 子页面 子页面可以是一个功能页面 在某些时候使用 iframe 非常的方便 所以如果是模板渲染方式的 前端就可以使用 iframe 标签节省一点网络带宽 传输的内容会少一些 并且主页面不会刷新 只是 iframe 在请求得到新的资源 height 用来定义 iframe 标签的高度 属性默认

    2026年3月18日
    2
  • 教你配置浏览器的苹果绿背景-保护您的眼睛

    教你配置浏览器的苹果绿背景-保护您的眼睛1 IE 浏览器 先进入系统 比如 win7 个性化 窗口颜色 高级外观设置 窗口 颜色 配置色调 85 饱和度 90 亮度 205 再配置 IE 内核浏览器 IE 选项 颜色 使用 windows 颜色 辅助功能 勾选 忽略网页上指定的颜色 2 chrome 浏览器 网上一种说法是到 chrome 网上应用店 https chrome google com webstore

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号