unity⾃动⽣成敌⼈_Unity3D敌⼈AI和动画(Animator)系统的
实例讲解
在这个实例中,我们要做⼀些敌⼈AI的简单实现,其中⾃动跟随和动画是重点,我们要达到的⽬标如下:
1.敌⼈能够⾃动跟随主⾓
2.敌⼈模型⼀共有四个动作:Idle(空闲) Run(奔跑) Attack(攻击) Death(死亡).
3.要求敌⼈在合适的时机能够做出合适动作
(⼀)⾃动跟随的实现
1)⾸先,新建⼀个场景  如图,场景⾥⾄少有两个⾓⾊:  有⼀个敌⼈(⼑骷髅兵) 还有⼀个主⾓(没错,就是那个胶囊体)
2)先选择场景模型,然后在 Inspector 窗⼝选项 Static旁边的⼩三⾓显⽰出下拉菜单,确定其中 Navigation Static 被选中.  对于与场景地形⽆关的模型选项,则要确定没有被选中,如图所⽰。
Navigation 窗⼝的选项主要是定义地形对寻路的影响。Radius 和 Height 可以理解为寻路者的半径和⾼
度。Max Slope 是最⼤坡度,超过这个坡度寻路者则⽆法通过。Step Height 是楼梯的最⼤⾼度 ,超过这个⾼度寻路者则⽆法通过。Drop Height表⽰寻路者可以跳落的⾼度极限。Jump Distance 表⽰寻路者的跳跃距离极限。
3)选择菜单栏⾥的Window 选项⾥的Navigation选项  点击下⾯的bake  渲染完成后是这个样⼦  这些蓝⾊的区域就是能⾃动寻路的区域
4) 然后给主⾓写 移动控制脚本 和 镜头控制脚本  并赋给主⾓(胶囊体):
1 public classPlayerControl : MonoBehaviour
2 {3
4 //定义玩家的Transform
5 publicTransform m_transform;
6 //定义玩家的⾓⾊控制器
7 CharacterController m_ch;8 //定义玩家的移动速度
9 float m_movespeed = 10.0f;10 //定义玩家的重⼒
11 float m_gravity = 2.0f;12 //定义玩家的⽣命
13 public int m_life = 5;14
15 //定义摄像机的Transform
16 Transform m_cameraTransform;17 //定义摄像机的旋转⾓度
18 Vector3 m_cameraRotation;19 //定义摄像机的⾼度
20 float m_cameraHeight = 1.4f;21 //定义⼩地图摄像机
22 publicTransform m_miniMap;23
24 //定义⼝的Transform m_muzzlepPoint;
25 Transform m_muzzlePoint;26 //定义射击时,射线射到的碰撞层
27 publicLayerMask m_layer;28 //定义射中⽬标后粒⼦效果的Transform
29 publicTransform m_fx;30 //定义射击⾳效
31 publicAudioClip m_shootAudio;32 //定义射击间隔时间计时器
33 float m_shootTimer = 0;34
35
36
37 //Use this for initialization
38 voidStart()39 {40 //获取玩家本⾝的Transform 赋给 m_transform
41 m_transform = ansform;42 //获取玩家本⾝的CharacterController组件 赋给 m_ch
43 m_ch = this.GetComponent();44
45 //摄像机的控制的初始化46 //获取摄像机的Transform
47 m_cameraTransform =ansform;48 //定义⼀个三维向量⽤来表⽰摄像机位置 并把玩家的位置赋给它 设置摄像机初始位置
49 Vector3 pos =m_transform.position;50 //摄像机的Y轴坐标 为 本来的坐标加上上⾯定义的摄像机⾼度
51 pos.y +=m_cameraHeight;52 //把修改后的摄像机坐标重新赋给m_cameraTransform
53 m_cameraTransform.position =pos;54 //把主⾓的旋转⾓度 赋给 摄像机的旋转⾓度
55 ation =ation;56 //获取摄像机的⾓度
57 m_cameraRotation =m_transform.eulerAngles;58
59 //隐藏⿏标
60 Cursor.visible = false;61 }62
63 //Update is called once per frame
64 voidUpdate()65 {66 //如果玩家的⽣命⼩于等于0 什么也不做
67 if (m_life <= 0)68 {69 return;70 }71
72 //如果玩家的⽣命⼤于0 那么调⽤玩家控制函数73 //移动函数
74 MoveControl();75 //摄像机控制函数
76 CameraControl();77 //跳跃函数
78 Jump();79 }80
81
82 //定义玩家的控制函数
83 voidMoveControl()84 {85
86 //定义玩家在XYZ轴上的移动量
87 float xm = 0, ym = 0, zm = 0;88
89 //玩家的重⼒运动 为 减等于玩家的重⼒乘以每帧时间
90 ym -= m_gravity *Time.deltaTime;91
92 //实现玩家上下左右的运动93 //如果按下 W键 玩家在Z轴上的量增加
94 if(Input.GetKey(KeyCode.W))95 {96 zm += m_movespeed *Time.deltaTime;97 }98 //如果按下 S键 玩家在Z轴上的量减少 这⾥⽤else if是因为每帧只能按下相反⽅向的⼀个键
99 else if(Input.GetKey(KeyCode.S))100 {101 zm -= m_movespeed *Time.deltaTime;102 }103 //如果按下 A键 玩家在X轴上的量减少
104 if(Input.GetKey(KeyCode.A))105 {106 xm -= m_movespeed *Time.deltaTime;107 }108 //如果按下 D键 玩家在X轴上的量增加
109 else if(Input.GetKey(KeyCode.D))110 {111 xm += m_movespeed *Time.deltaTime;112 }113
114 当玩家在地⾯上的时候 才能前后左右移动 在空中不能移动
115 if (!m_ch.isGrounded)116 {117 xm = 0;118 zm = 0;119 }120
121 //通过⾓⾊控制器的Move()函数,实现移动
122 m_ch.Move(m_transform.TransformDirection(newVector3(xm, ym, zm)));123
124
125 }126
127
128 //定义玩家的摄像机控制函数
129 voidCameraControl()130 {131
132 //实现对摄像机的控制133 //定义主⾓在horizon⽅向X轴移动的量 也就是获取主⾓⿏标移动的量
134 float rh = Input.GetAxis("Mouse X");135 //定义主⾓在Vertical ⽅向Y轴移动的量
136 float rv = Input.GetAxis("Mouse Y");137unity3d animation
138
139 //旋转摄像机140 //把⿏标在屏幕上移动的量转化为摄像机的⾓度 rv(上下移动的量) 等于 ⾓⾊X轴的⾓度 rh(⽔平移动的量) 等于 ⾓⾊Y轴上的⾓度
141 m_cameraRotation.x -=rv;142 //Debug.Log(rv); 向下时 rv 为正值(顺时针) 向上时 rv 为负值(逆时针)
143 m_cameraRotation.y +=rh;144 //Debug.Log(rh); 向右时 rh 为正值(顺时针) 向左时 rh 为负值(逆时针)145
146
147 //限制X轴的移动在-60度到60度之间
148 if (m_cameraRotation.x >= 60)149 {150 m_cameraRotation.x = 60;151 }152 if (m_cameraRotation.x <= -60)153 {154 m_cameraRotation.x = -60;155 }156 m_cameraTransform.eulerAngles =m_cameraRotation;157
158 //使主⾓的⾯向⽅向与摄像机⼀致 ⽤Vector3定义⼀个中间变量是因为 eularAngles ⽆法直接作为变量
159 Vector3 camrot =m_cameraTransform.eulerAngles;160 //初始化摄像机的欧拉⾓为0
161 camrot.x = 0;162 camrot.z = 0;163 //把摄像机的欧拉⾓ 赋给 主⾓
164 m_transform.eulerAngles =camrot;165
166 //使摄像机的位置与主⾓⼀致 ⽤Vector3定义⼀个中间变量是因为 position ⽆法直接作为变量
167 Vector3 pos =m_transform.position;168 //摄像机的Y轴位置 为 主⾓的Y轴位置加上摄像机的⾼度
169 pos.y +=m_cameraHeight;170 //把主⾓的位置 赋给 摄像机的位置
171 m_cameraTransform.position =pos;172
173 }174
175
176 //定义玩家的Jump函数
177 voidJump()178 {179 //当玩家在地⾯上的时候 玩家的i跳才有效果
180 if(m_ch.isGrounded)181 {182 //此时玩家的重⼒为10
183 m_gravity = 10;184 //如果按下 space键 玩家的重⼒变为负数 实现向上运动
185 if(Input.GetKey(KeyCode.Space))186 {187 m_gravity = -8;188 }189 }190 //此时玩家跳了起来191 else
192 {193 //玩家的重⼒ 为 玩家的重⼒10 乘以 每帧的时间
194 m_gravity +=10f*Time.deltaTime;195 //如果玩家的重⼒⼤于10的话 让他等于10
196 if (m_gravity>=10)197 {198 m_gravity =10f;199 }200 }201
202 }
5)给敌⼈写⾃动追踪脚本并赋给敌⼈ :
1 public classEnemy : MonoBehaviour
2 {3
4 //定义敌⼈的Transform
5 Transform m_transform;
6 //CharacterController m_ch;7
8 //定义动画组件
9 Animator m_animator;10
11 //定义寻路组件
12 NavMeshAgent m_agent;13
14 //定义⼀个主⾓类的对象
15 PlayerControl m_player;16 //⾓⾊移动速度
17 float m_moveSpeed = 0.5f;18 //⾓⾊旋转速度
19 float m_rotSpeed = 120;20 //定义⽣命值
21 int m_life = 15;22
23 //定义计时器
24 float m_timer = 2;25 //定义⽣成点26 //protected EnemySpawn m_spawn;27
28
29 //Use this for initialization
30 voidStart()31 {32 //初始化m_transform 为物体本⾝的tranform
33 m_transform = ansform;34
35 //初始化动画m_ani 为物体的动画组件
36 m_animator = this.GetComponent();37
38 //初始化寻路组件m_agent 为物体的寻路组件
39 m_agent = GetComponent();40
41 //初始化主⾓
42 m_player = GameObject.FindGameObjectWithTag("Player").GetComponent();43
44
45 }46
47 //Update is called once per frame
48 voidUpdate()49 {50 //设置敌⼈的寻路⽬标
51 m_agent.SetDestination(m_player.m_transform.position);52
53 //调⽤寻路函数实现寻路移动
54 MoveTo();55
56
57 }58
59
60 //敌⼈的⾃动寻路函数
61 voidMoveTo()62 {63 //定义敌⼈的移动量
64 float speed = m_moveSpeed *Time.deltaTime;65
66 //通过寻路组件的Move()⽅法实现寻路移动
67 m_agent.Move(m_transform.TransformDirection(new Vector3(0, 0, speed)));68 }69
70
71
72 }
这时,运⾏游戏,敌⼈就能⾃动跟随了.
(⼆)敌⼈动画的逻辑实现
1)⾸先,在Project⾯板⾥⾯create⼀个Animator Controller  双击它 就会发现多了⼀个BaseLayer⾯板  如下⾯第⼀个图  这个是⽤来控制动画的逻辑关系的    在敌⼈模型的动画分类⾥ 如下图中间  选择⾃⼰需要的动画  然后拖到BaseLayer⾯板⾥⾯  右键标签可以创建箭头,这⾥为了便于讲解,选了四个动画(idle空闲  run奔跑  attack攻击  death死亡)  按照下⾯右图把动画标签的关系调节好.
2)给敌⼈添加动画播放脚本  这个脚本与上⾯的敌⼈脚本不同 注释的很清楚 很容易理解
1 public classEnemy : MonoBehaviour
2 {3
4 //定义敌⼈的Transform
5 Transform m_transform;
6 //CharacterController m_ch;7
8 //定义动画组件
9 Animator m_animator;10

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。