Unity3D——利用协同程序实现游戏中的AI(自动行走和发现目标)

来源:互联网 发布:三国乱世挂机软件 编辑:程序博客网 时间:2024/05/22 06:49


协同程序主程序运行时同时开启另外一段逻辑处理,来协同当前的执行;同一时刻只有一个协同程序在运行,并且协同程序会影响到主线程的运行;
开启方法:(方法2可以传递多个参数,并且性能消耗略小)

  1. StartCorourine(string methodName)
  2. 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
原创粉丝点击