Unity3D——利用协同程序实现游戏中的AI(自动行走和发现目标)
来源:互联网 发布:三国乱世挂机软件 编辑:程序博客网 时间:2024/05/22 06:49
协同程序:主程序运行时同时开启另外一段逻辑处理,来协同当前的执行;同一时刻只有一个协同程序在运行,并且协同程序会影响到主线程的运行;
开启方法:(方法2可以传递多个参数,并且性能消耗略小)
- StartCorourine(string methodName)
- StartCorourine(IEnumerator routine)
如下图所示,AI(黑球)沿着5个黄色方块(Cube)所连接的绿色路径(使用Gizmos绘制)行走,当Mage(Hero)接近AI一定范围的时候,AI将会追击Mage,Mage离开范围时,AI继续之前的行走。
挂载在Cube上的绘制路径的脚本:WayPoint类
using UnityEngine;using System.Collections;public class WayPoint : MonoBehaviour {#regionpublic WayPoint nextWayPoint;#endregionvoid OnDrawGizmosSelected() {Gizmos.color = Color.green;Gizmos.DrawLine(transform.position, nextWayPoint.gameObject.transform.position);}}
挂载在AI上的脚本:
using UnityEngine;using System.Collections;public class AI : MonoBehaviour {#region variable[SerializeField] //保护封装性private float speed = 3f;[SerializeField]private WayPoint targetPoint, startPoint;[SerializeField]private Hero mage;#endregion// Use this for initializationvoid Start () {if (Vector3.Distance(transform.position, startPoint.transform.position) < 1e-2f) {targetPoint = startPoint.nextWayPoint;} else {targetPoint = startPoint;}StartCoroutine(AINavMesh());}IEnumerator AINavMesh() {while(true) {if (Vector3.Distance(transform.position, targetPoint.transform.position) < 1e-2f) {targetPoint = targetPoint.nextWayPoint;yield return new WaitForSeconds(2f);}if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) <= 6f) {Debug.Log("侦测到敌人,开始追击!!!");yield return StartCoroutine(AIFollowHero());}Vector3 dir = targetPoint.transform.position - transform.position;transform.Translate(dir.normalized * Time.deltaTime * speed);yield return new WaitForEndOfFrame();}}IEnumerator AIFollowHero() {while (true) {if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) > 6f) {Debug.Log("敌人已走远,放弃攻击!!!");yield break;}Vector3 dir = mage.transform.position - transform.position;transform.Translate(dir.normalized * Time.deltaTime * speed * 0.8f);yield return new WaitForEndOfFrame();}}}
挂载在Mage上的脚本:
using UnityEngine;using System.Collections;//在本实例中起到标记的作用public class Hero : MonoBehaviour {}
0 0
- Unity3D——利用协同程序实现游戏中的AI(自动行走和发现目标)
- Unity3D 协同程序和让步
- Unity3D中的Coroutine使用(协同执行程序)
- [游戏安全] Unity3D游戏无意中的发现
- Unity3D--协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D--协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3D协同程序(Coroutine)
- Unity3d 协同程序学习和测试
- Unity3D AI角色移动和自动跟随
- Unity3D学习记录——API IEnumerator(协同程序)
- Unity3d面试6 DontDestroyOnLoad();PlayerPrefs;协同程序;游戏框架;Unity中播放视频;LOD技术
- PHP变量
- TCMalloc原理
- Allegro设置及实用小技巧(一)
- 后台初始化日期传给前端jsp页面
- process.waitfor()发生阻塞
- Unity3D——利用协同程序实现游戏中的AI(自动行走和发现目标)
- App Store 内购项目配置
- Java操作mongodb数据库
- 创新工场笔试
- jsp实现自动登录(Cookie机制)
- Qt:QML控件类关系图
- Quartz-java定时任务实现
- HTML5开发前景是否还能入坑
- tcp五层模型中 物理层与数据链路层的区别