轉自http://blog.csdn.net/zhangxiao13627093203/article/details/47451063
盡管隨機運動可能完全不可預知,它還是相當無趣的,因為它完全是以相同的方式工作——完全隨機。下面要學習到的算法是根據具體環境作出不同響應的處理。作為例子,這里選擇了追蹤算法。追蹤AI考慮到跟蹤目標的位置,然后改變AI對象的軌道好讓它移向被追蹤的對象。
追蹤可以是將方向矢量直接指向目標,或者采用跟真實的模型,使得物體像導彈那樣行動。
本文將的就是第一種,直接矢量追蹤,效果如下圖所示:
通過鍵盤方向鍵控制幽靈,然后蚊子會追蹤幽靈,在這里我做了一些界面處理,當蚊子或者幽靈運動超過了屏幕范圍的時候讓它們出現在屏幕的另一邊而不是消失在屏幕上
代碼如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class AITrack : MonoBehaviour {
public Image target;
public float moveSpeed;//追蹤目標移動速度
public float targetSpeed;//追蹤速度
public float target_x;//追蹤移動的單位量
public float target_y;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
MoveTarget();
Track_AI();
}
void Track_AI()
{
//x方向的追蹤
if(target.transform.position.x>this.transform.position.x)
{
this.transform.position += new Vector3(target_x, 0, 0)*targetSpeed;
}
else if(target.transform.position.x<this.transform.position.x)
{
this.transform.position -= new Vector3(target_x, 0, 0)*targetSpeed;
}
//y方向的追蹤
if(target.transform.position.y>this.transform.position.y)
{
this.transform.position += new Vector3(0, target_y, 0)*targetSpeed;
}
else if(target.transform.position.y<this.transform.position.y)
{
this.transform.position -= new Vector3(0, target_y, 0)*targetSpeed;
}
//檢測是否超出了邊界
if(this.transform.position.x>=Screen.width)
{
this.transform.position = new Vector3(-this.GetComponent<Image>().rectTransform.lossyScale.x, 0, 0);
}
else if(this.transform.position.x<-this.GetComponent<Image>().rectTransform.lossyScale.x)
{
this.transform.position = new Vector3(Screen.width, this.transform.position.y, 0);
}
if(this.transform.position.y>=Screen.height)
{
this.transform.position = new Vector3(this.transform.position.x,-this.GetComponent<Image>().rectTransform.lossyScale.y, 0);
}
else if(this.transform.position.y<-this.GetComponent<Image>().rectTransform.lossyScale.y)
{
this.transform.position = new Vector3(this.transform.position.x, Screen.height, 0);
}
}
void MoveTarget()
{
float x = Input.GetAxis("Horizontal")*100;
float y = Input.GetAxis("Vertical")*100;
target.transform.Translate(x*Time.deltaTime*moveSpeed,y*Time.deltaTime*moveSpeed,0);
//如果超出屏幕范圍則讓它出現在另一面
if (target.transform.position.x >= Screen.width)
{
//使用了Image的target.rectTransform.lossyScale.x來表示顯示的圖片寬度
target.transform.position = new Vector3(-target.rectTransform.lossyScale.x, target.transform.position.y, 0);
}
else if(target.transform.position.x<-target.rectTransform.lossyScale.x)
{
target.transform.position = new Vector3(Screen.width, target.transform.position.y, 0);
}
if(target.transform.position.y>=Screen.height)
{
target.transform.position = new Vector3(target.transform.position.x, -target.rectTransform.lossyScale.y, 0);
}
else if(target.transform.position.y<-target.rectTransform.lossyScale.y)
{
target.transform.position = new Vector3(target.transform.position.x, Screen.height, 0);
}
}
}
