using
UnityEngine
;
using
System
.
Collections
;
//这里是枚举选择敌人类型
public
enum
EnemyType
{
Enemy0
,
Enemy1
}
public
class
AI
:
MonoBehaviour
{
//敌人类型枚举 有策划人员选择
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
=
"Attack"
;
//当敌人进入攻击状态时,继续朝向主角开始攻击砍人动画
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
;
}
}
}