敌人AI:攻击

在上篇敌人AI:行走的基础上,本篇博文实现敌人攻击主角。下图的敌人的Inspector面板展示了敌人身上挂的东西。


using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {

	public int hp = 200;// 敌人默认的血量
	public float speed = 2f;// 敌人行走的速度
	private CharacterController cc; // 定义控制敌人行走的CharacterController组件

	// **********控制敌人攻击的变量********************************
	public float attackRate = 2;      // 攻击速率,2s攻击一次
	private float attackDistance = 2; // 敌人发生攻击需要的距离
	private float distance = 0;       // 敌人和主角的距离
	private float attackTimer = 0;

	void Start(){
		cc = this.GetComponent<CharacterController> ();//  得到CharacterController组件
		// 通过协同来计算距离,以优化在Update中逐帧调用CalcDistance而消耗的性能
		InvokeRepeating("CalcDistance", 0, 0.1f);
	}

	void Update(){

		if (hp <= 0)
			return;

		if (distance < attackDistance) {// true==>敌人攻击
			attackTimer += Time.deltaTime;
			if (attackTimer > attackRate) {
				// 攻击之前面向主角
				// 本代码中获取主角调用多次,可以在Start反方中进行初始化以进行优化,这里仅供学习用,方便清楚代码整个框架(逻辑)
				Transform player = TranscriptManager._instance.player.transform;
				Vector3 targerPos = player.position;
				targerPos.y = transform.position.y;
				transform.LookAt(targerPos);
				// **************************************
				GetComponent<Animation>().Play("attack01");// 其中attack01为敌人攻击的动画
				attackTimer = 0;
			}

			if (!GetComponent<Animation> ().IsPlaying ("attack01")) {
				GetComponent<Animation> ().CrossFade ("idle");
			}

		} else {
			GetComponent<Animation> ().Play ("walk");// 播放行走的动画
			Move ();// 在Update方法中,每一帧调用Move方法
		}

	}

	// *******************计算距离***********************************************
	void CalcDistance(){
		Transform player = TranscriptManager._instance.player.transform;
		distance = Vector3.Distance (player.position, this.transform.position);
	}


	// *********************** 控制敌人AI行走的方法 *********************************
	void Move(){
		// 需求分析:要实现敌人总是朝着游戏主角行走

		// 1. 首先获取主角相关组件
		// 主角的Transform组件
		Transform player = TranscriptManager._instance.player.transform;// 获取主角由TranscriptManager类管理
		Vector3 targerPos = player.position;
		targerPos.y = transform.position.y;// 敌人的y和主角的y一致

		// 2. 面向主角
		transform.LookAt(targerPos); // this/*敌人*/.transform.LookAt(targetPos)

		// 3. 敌人移动
		cc.SimpleMove (transform.forward * speed);

	}
		
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值