Unity人工智能学习—确定性AI算法之追踪算法一

原创:http://blog.csdn.net/zhangxiao13627093203/article/details/47451063

尽管随机运动可能完全不可预知,它还是相当无趣的,因为它完全是以相同的方式工作——完全随机。下面要学习到的算法是根据具体环境作出不同响应的处理。作为例子,这里选择了追踪算法。追踪AI考虑到跟踪目标的位置,然后改变AI对象的轨道好让它移向被追踪的对象。

追踪可以是将方向矢量直接指向目标,或者采用跟真实的模型,使得物体像导弹那样行动。

本文将的就是第一种,直接矢量追踪,效果如下图所示:

通过键盘方向键控制幽灵,然后蚊子会追踪幽灵,在这里我做了一些界面处理,当蚊子或者幽灵运动超过了屏幕范围的时候让它们出现在屏幕的另一边而不是消失在屏幕上

代码如下:

[csharp]  view plain  copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using UnityEngine.UI;  
  4.   
  5. public class AITrack : MonoBehaviour {  
  6.     public Image target;  
  7.     public float moveSpeed;//追踪目标移动速度  
  8.     public float targetSpeed;//追踪速度  
  9.     public float target_x;//追踪移动的单位量  
  10.     public float target_y;  
  11.     // Use this for initialization  
  12.     void Start () {  
  13.           
  14.     }  
  15.     // Update is called once per frame  
  16.     void Update () {  
  17.         MoveTarget();  
  18.         Track_AI();  
  19.     }  
  20.     void Track_AI()  
  21.     {  
  22.         //x方向的追踪  
  23.         if(target.transform.position.x>this.transform.position.x)  
  24.         {  
  25.             this.transform.position += new Vector3(target_x, 0, 0)*targetSpeed;  
  26.         }  
  27.         else if(target.transform.position.x<this.transform.position.x)  
  28.         {  
  29.             this.transform.position -= new Vector3(target_x, 0, 0)*targetSpeed;  
  30.         }  
  31.         //y方向的追踪  
  32.         if(target.transform.position.y>this.transform.position.y)  
  33.         {  
  34.             this.transform.position += new Vector3(0, target_y, 0)*targetSpeed;  
  35.         }  
  36.         else if(target.transform.position.y<this.transform.position.y)  
  37.         {  
  38.             this.transform.position -= new Vector3(0, target_y, 0)*targetSpeed;  
  39.         }  
  40.         //检测是否超出了边界  
  41.         if(this.transform.position.x>=Screen.width)  
  42.         {  
  43.             this.transform.position = new Vector3(-this.GetComponent<Image>().rectTransform.lossyScale.x, 0, 0);  
  44.         }  
  45.         else if(this.transform.position.x<-this.GetComponent<Image>().rectTransform.lossyScale.x)  
  46.         {  
  47.             this.transform.position = new Vector3(Screen.width, this.transform.position.y, 0);  
  48.         }  
  49.         if(this.transform.position.y>=Screen.height)  
  50.         {  
  51.             this.transform.position = new Vector3(this.transform.position.x,-this.GetComponent<Image>().rectTransform.lossyScale.y, 0);  
  52.         }  
  53.         else if(this.transform.position.y<-this.GetComponent<Image>().rectTransform.lossyScale.y)  
  54.         {  
  55.             this.transform.position = new Vector3(this.transform.position.x, Screen.height, 0);  
  56.         }  
  57.     }  
  58.     void MoveTarget()  
  59.     {  
  60.         float x = Input.GetAxis("Horizontal")*100;  
  61.         float y = Input.GetAxis("Vertical")*100;  
  62.   
  63.         target.transform.Translate(x*Time.deltaTime*moveSpeed,y*Time.deltaTime*moveSpeed,0);  
  64.         //如果超出屏幕范围则让它出现在另一面  
  65.         if (target.transform.position.x >= Screen.width)  
  66.         {  
  67.             //使用了Image的target.rectTransform.lossyScale.x来表示显示的图片宽度  
  68.             target.transform.position = new Vector3(-target.rectTransform.lossyScale.x, target.transform.position.y, 0);  
  69.         }  
  70.         else if(target.transform.position.x<-target.rectTransform.lossyScale.x)  
  71.         {  
  72.             target.transform.position = new Vector3(Screen.width, target.transform.position.y, 0);  
  73.         }  
  74.         if(target.transform.position.y>=Screen.height)  
  75.         {  
  76.             target.transform.position = new Vector3(target.transform.position.x, -target.rectTransform.lossyScale.y, 0);  
  77.         }  
  78.         else if(target.transform.position.y<-target.rectTransform.lossyScale.y)  
  79.         {  
  80.             target.transform.position = new Vector3(target.transform.position.x, Screen.height, 0);  
  81.         }  
  82.     }  

  1. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值