您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页Unity之敌人AI

Unity之敌人AI

来源:华佗小知识
Unity之敌人AI

今天做了项目的第二关,制作小BOSS,让它实现自动巡逻,一定范围攻击主角的功能 下边是项目的代码,及其解释很清晰

public EnemyType enemyType = EnemyType.Enemy0; //敌人类型枚举 有策划人员选择

public GameObject player; //主角游戏对象

//敌人状态 普通状态 旋转状态 奔跑状态 追击主角状态 攻击主角状态 private const int EMEMY_NORMAL = 0; private const int EMEMY_ROTATION = 1; private const int EMEMY_RUN = 2; private const int EMEMY_CHASE = 3;

private const int EMEMY_ATTACK = 4;

//记录当前敌人状态 根据不同类型 敌人播放不同动画 private int state;

//旋转状态,敌人自身旋转 private int rotation_state; //记录敌人上一次思考时间

private float aiThankLastTime;

void Start() {

//初始话标志敌人状态 以及动画为循环播放

state = EMEMY_NORMAL;

this.animation.wrapMode = WrapMode.Loop; }

void Update() {

//根据策划选择的敌人类型 这里面会进行不同的敌人AI switch (enemyType)

{

case EnemyType.Enemy0: updateEnemyType0(); break;

case EnemyType.Enemy1: updateEnemyType1(); break; } }

//更新第一种敌人的AI

void updateEnemyType0() {

//这个AI比较简单, 当主角与他的距离小于10米时,他将始终朝向这主角 if (Vector3.Distance(player.transform.position, this.transform.position) <= 10) {

this.transform.LookAt(player.transform); } }

//更新第二种敌人的AI void updateEnemyType1() {

//判断敌人是否开始思考 if (isAIthank()) {

//敌人开始思考 AIthankEnemyState(3); } else

{

//更新敌人状态 UpdateEmenyState(); } }

int getRandom(int count) {

return new System.Random().Next(count); }

bool isAIthank() {

//这里表示敌人每3秒进行一次思考 if (Time.time - aiThankLastTime >= 3.0f) {

aiThankLastTime = Time.time; return true;

}

return false;

}

//敌人在这里进行思考

void AIthankEnemyState(int count) {

//开始随机数字。 int d = getRandom(count);

switch (d) {

case 0:

//设置敌人为站立状态

setEmemyState(EMEMY_NORMAL); break;

case 1:

//设置敌人为旋转状态

setEmemyState(EMEMY_ROTATION); break; case 2:

//设置敌人为奔跑状态

setEmemyState(EMEMY_RUN); break; }

}

void setEmemyState(int newState) {

if (state == newState) return; state = newState;

string animName = \"Idle\"; switch (state)

{

case EMEMY_NORMAL: animName = \"Idle\"; break;

case EMEMY_RUN: animName = \"Run\"; break;

case EMEMY_ROTATION: animName = \"Run\";

//当敌人为旋转时, 开始随机旋转的角度系数

rotation_state = getRandom(4);

break;

case EMEMY_CHASE: animName = \"Run\";

//当敌人进入追击状态时,将面朝主角方向奔跑

this.transform.LookAt(player.transform); break;

case EMEMY_ATTACK: animName = \"Attack05\";

//当敌人进入攻击状态时,继续朝向主角开始攻击砍人动画 this.transform.LookAt(player.transform); break;

}

//避免重复播放动画,这里进行判断 if (!this.animation.IsPlaying(animName)) {

//播放动画

this.animation.Play(animName); }

}

//在这里更新敌人状态 void UpdateEmenyState() {

//判断敌人与主角之间的距离

float distance = Vector3.Distance(player.transform.position, this.transform.position); //当敌人与主角的距离小于10 敌人将开始面朝主角追击 if (distance <= 10)

{

//当敌人与主角的距离小与3 敌人将开始面朝主角攻击 if (distance <= 3) {

setEmemyState(EMEMY_ATTACK); } else

{

//否则敌人将开始面朝主角追击 setEmemyState(EMEMY_CHASE); }

} else

{

//敌人攻击主角时 主角迅速奔跑 当它们之间的距离再次大于10的时候 敌人将再次进入正常状态 开始思考

if (state == EMEMY_CHASE || state == EMEMY_ATTACK) {

setEmemyState(EMEMY_NORMAL); }

}

switch (state) {

case EMEMY_ROTATION:

//旋转状态时 敌人开始旋转, 旋转时间为1秒 这样更加具有惯性 transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, rotation_state * 90, 0), Time.deltaTime * 1); break;

case EMEMY_RUN:

//奔跑状态,敌人向前奔跑

transform.Translate(Vector3.forward * 0.02f); break;

case EMEMY_CHASE:

//追击状态 敌人向前开始追击

transform.Translate(Vector3.forward * 0.02f); break;

case EMEMY_ATTACK:

break; }

} }

想了解更多到狗刨学习网

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务