简介:当制作动作类攻击游戏时,会用到敌人的自动攻击及自动寻找攻击目标,如何实现自动攻击和自动寻路呢?下面简单的讲解我对这方面的理解。
当你已经导入了敌人的模型并制作好了敌人动画控制状态机,接下来肯定会想让敌人具备攻击和寻找目标的能力,要开发这一功能,其实只需要做两件事情:
第一:通过CharacterController控制移动,即通过调用SimpleMove(Vector3)移动。
第二:根据主角的位置和距离,判断是否进行攻击,攻击的时候利用随机数来发起攻击动画的选择。
编写脚本:Enimy.cs
using UnityEngine;
usingSystem.Collections;
public class Enimy : MonoBehaviour {
// Use this for initialization
private Transform player;
public float attackDistance = 2;//这是攻击目标的距离,也是寻路的目标距离
private Animator animator;
public float speed;
private CharacterController cc;
public float attackTime = 3; //设置定时器时间 3秒攻击一次
private float attackCounter = 0; //计时器变量
voidStart () {
player = GameObject.FindGameObjectWithTag("Player").transform;
cc = this.GetComponent<CharacterController>();
animator = this.GetComponent<Animator>();//控制动画状态机中的奔跑动作调用
attackCounter = attackTime;//一开始只要抵达目标立即攻击
}
// Update is called once per frame
voidUpdate () {
Vector3 targetPos =player.position;
targetPos.y = transform.position.y;//此处的作用将自身的Y轴值赋值给目标Y值
transform.LookAt(targetPos);//旋转的时候就保证已自己Y轴为轴心旋转
float distance = Vector3.Distance(targetPos,transform.position);
if (distance <= attackDistance)
{
attackCounter += Time.deltaTime;
if (attackCounter >attackTime)//定时器功能实现
{
int num = Random.Range(0, 2);//攻击动画有两种,此处就利用随机数(【0】,【1】)切换两种动画
if (num == 0)animator.SetTrigger("Attack1");
else animator.SetTrigger("Attack2");
attackCounter = 0;
}
else
{
animator.SetBool("Walk", false);
}
}
else
{
attackCounter = attackTime;//每次移动到最小攻击距离时就会立即攻击
if(animator.GetCurrentAnimatorStateInfo(0).IsName("EnimyWalk"))//EnimyWalk是动画状态机中的行走的状态
cc.SimpleMove(transform.forward*speed);
animator.SetBool("Walk ",true);//移动的时候播放跑步动画
}
}
}
结合上面的注释,是不是很清楚这些功能的实现原理了,至少当我忘记的时候看到这个笔记就会明白了。有问题可以留言,一起交流学习。