Unity3D--创建敌人和玩家之间的AI
创建敌人和玩家之间的AI
using UnityEngine;
using System.Collections;
public class EnemyAI : MonoBehaviour
{
// 敌人冲向的目标
public Transform target;
// 敌人移动速度
public int moveSpeed = 5;
// 敌人旋转速度
public int rotationSpeed = 5;
// 敌人和玩家之间的最大距离
public int maxDistance;
// ??? 看下面解释
private Transform myTransform;
// ???
void Awake()
{
myTransform = transform;
}
void Start ()
{
// 通过标签去查找游戏对象
GameObject go = GameObject.FindGameObjectWithTag("Player");
// 将它的transform指定给target
target = go.transform;
maxDistance = 2;
}
void Update ()
{
// 在敌人和玩家之间画一条线
Debug.DrawLine(target.position,myTransform.position,Color.red);
// 看着目标
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed * Time.deltaTime );
// 判断敌人和玩家之间的距离是否大于最大距离
if(Vector3.Distance(target.position, myTransform.position) > maxDistance)
{
// 移向目标
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
}
}
注释 :Awake() 是激活功能,它将会在你的脚本所用功能之前调用,所以你想要在脚本的最一开始做一些事情的话,你可以加一个Awake (); 讲解以下代码: Public Transform myTransform; myTransform = transform; 目的是给我们的Transform【形态】做一个缓存,然后再Awake功能中将transform赋值myTransform。我们知道我们将会调用transform信息,在Update中进行移动,旋转,但是每次调用transform的时候,它每次都要回去查找transform到底是什么,所以与其让它每次都来检查这个transform,我们不如建立一个缓存,将它存进myTransform变量中,这将让运算变得更加快速,所以我们不需要不停地去查找这些信息,我们直接给它一个自动的参考,这就是为什么这么做的原因。
