|
上一篇中我们设置了不会动的石像鬼,这一篇我们将制作在关卡中巡逻的幽灵,并且在关卡中投放一定数量的敌人。幽灵比石像鬼多了一个巡逻的功能,我们结合之前在关卡中设置的Nav Mesh来实现这个功能。
一、制作Ghost预制体(推荐参照GIF或图片快速操作)
1.新建Ghost预制体
在Project > Assets > Models > Characters文件夹里找到Ghost的模型,拖动到Hierarchy窗口创建Ghost GameObject,再把Ghost GameObject拖动到Project > Assets > Prefabs文件夹中创建预制体。
2.设置动画
(1)在Assets > Animation > Animators文件夹中新建Animator Controller ,命名为Ghost。
(2)双击Ghost(Animator Controller)打开Animator视窗,打开Assets > Animation > Animations文件夹,把Ghost@Walk拖到Animator视窗里。
(3)把设置好的Ghost(Animator Controller)分配到Ghost 预制体的Animator中。
3.添加并设置Collider
(1)进入编辑预制体模式,给Ghost 添加Capsule Collider组件。
(2)设置其属性:
- Center: ( 0, 0.6, 0)
- Radius: 0.25
- Height: 1.2
4.添加并设置Rigidbody
因为Ghost幽灵移动的时候不能被John撞离路线,所以我们要添加Rigidbody,并且勾选IsKinematic,使Ghost不受外力影响。
5.添加并设置视野模拟
在Gargoyle(石像鬼)中我们用PointOfView GameObject模拟范围检测,我们可以把它做成Prefab(预制体),应用到Ghost(幽灵)中。
(1)打开Assets> Prefabs 文件夹并双击Gargoyle Prefab,打开预制体。
(2)把Hierarchy窗口中的PointOfView GameObject拖进Assets > Prefabs 文件夹,生成PointOfView Prefabs(预制体)。
(3)双击Ghost Prefab打开预制体,把PointOfView Prefabs拖到Ghost 上,使其添加为Ghost的子对象。
(4)在Hierarchy窗口中,选择PointOfView ,修改其Transform:
- Position:(0 ,0.75 ,0.4 )
- Rotation:(0 ,0 ,0 )
6.添加并设置Nav Mesh Agent组件
(1)要使Ghost在关卡中移动,需要两个步骤:
①给Ghost添加Nav Mesh Agent,使Ghost可以使用NavMesh进行导航。
②通过脚本控制Nav Mesh Agent。
(2)在Inspector窗口中添加Nav Mesh Agent组件,并根据如下设置:
- Speed(移动速度):0.25
- Stopping Distance(停止距离):0.2,与目标点的距离小于该值就会停止。
- Radius(半径):0.25,模拟Ghost的半径,用于判断Ghost是否有足够的空间在路径上行走。
Ghost预制体已经完成Nav Mesh Agent组件的设置,接下来进行脚本的编写,设置目标点。
二、脚本编写
游戏中Ghost(幽灵)会根据一系列目标点来进行巡逻。
1.新建脚本
(1)在Asset > Scripts文件夹里新建脚本,命名为WaypointPatrol。
(2)把WaypointPatrol脚本拖到Ghost的Inspector窗口中,使其添加为Ghost的组件。
2.思路
(1)在Scene视窗中设置一系列目标点,然后传(拖)入脚本。
(2)Ghost顺着各自的目标点进行移动。
(3)根据Ghost与目标点的距离,更新当前目标点,达到巡逻的效果。
3.脚本
(1)使用Nav Mesh Agent时要添加命名空间using UnityEngine.AI;
(2)我们使用数组来储存一系列目标点,暂时可以理解为用一个容器把这些目标点“装”起来,这些目标点都会被赋予一个下标(编号),下标从0开始递增。我们将通过更换下标的方式来更新当前目标点。
通过以下公式计算更换当前点的下标,下标会从起点(0)到终点一直循环:
m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;
- m_CurrentWaypointInde:当前目标点下标;
- waypoints.Length:数组长度(元素个数);
- %:取余符号。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class WaypointPatrol : MonoBehaviour
{
public NavMeshAgent navMeshAgent; //每个幽灵对应的navMeshAgent组件
public Transform[] waypoints; //存储一系列目标点的数组(目标点从外部拖入)
int m_CurrentWaypointIndex; //当前目标点的下标
void Start()
{
navMeshAgent.SetDestination(waypoints[0].position); //设置第一个目标点(下标为0)
}
void Update()
{
//如果离目标点剩余的距离小于设定的停止距离
if (navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance)
{
//计算下一个目标点。(当前下标+1)与数组长度取余数
m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;
navMeshAgent.SetDestination(waypoints[m_CurrentWaypointIndex].position); //更换目标点
}
}
}
4.给Waypoint Patrol脚本分配引用(编辑预制体模式)
回到Ghost预制体编辑窗口,选中Ghost GameObject,把Nav Mesh Agent组件拖到Waypoint Patrol脚本的Nav Mesh Agent字段中,保存预制体。
5.给Observer脚本分配引用(普通模式)
退出编辑预制体模式,在Hierarchy窗口里选中Ghost的子对象PointOfView :
- 把JohnLemon GameObject拖进Observer脚本的Player字段;
- 把GameEnding GameObject拖进Observer脚本的GameEnding字段。
三、布置幽灵及石像鬼
我们已经制作好一只Ghost和一只Gargoyle,接下来就是复制怪物,把他们布置在关卡中。
(1)布置Ghost
①在Hierarchy窗口里选中Ghost,Ctrl+D复制3只Ghost。
②修改每只Ghost 的Transform组件的Positon:
- Gost Postion: ( -5.3, 0, -3.1)
- Gost(1) Postion: ( 1.5, 0, 4)
- Gost(2) Postion: ( 3.2, 0, 6.5)
- Gost(3) Postion: ( 7.4, 0, -3)
(2)设置路线目标点
我们用一些空的GameObject来制作路线的目标点。
①在Hierarchy窗口中右键 > Create Empty,重命名为Waypoint.;
②Ctrl+D再复制出9个Waypoint,下边给每只幽灵分配并设置各自的巡逻目标点;
③把Waypoint和Waypoint(1)拖进Ghost 的Waypoint Patrol脚本并修改Positon;
- Waypoint的Positon: ( -5.3, 0, 6.7)。
- Waypoint(1)的Positon:( -5.5, 0, -4.5)。
④把Waypoint(2)和Waypoint(3)拖进Ghost(1)的Waypoint Patrol脚本并修改Positon;
- Waypoint(2)的Positon: ( 1.2, 0, 7.7 )。
- Waypoint(3)的Positon: ( 0.9, 0, -3.5 )。
⑤把Waypoint(4)、Waypoint(5)、Waypoint(6)和Waypoint(7)拖进Ghost(2)的Waypoint Patrol脚本并修改Positon;
- Waypoint(4)的Positon: ( 3.2, 0, 5.6 )。
- Waypoint(5)的Positon: ( 3.2, 0, 12.3 )。
- Waypoint(6)的Positon: ( 6.5, 0, 12.3 )。
- Waypoint(7)的Positon: ( 6.5, 0, 5.6 )。
⑥把Waypoint(8)和Waypoint(9)拖进Ghost(3)的Waypoint Patrol脚本并修改Positon;
- Waypoint(8)的Positon: ( 3.2, 0,-5 )。
- Waypoint(9)的Positon: ( 7.4, 0,-2 )。
(3)布置Gargoyle
①再复制2只Gargoyle。
②修改Gargoyle (1)的Transform:
- Positon:( -2.6, 0, -8.5);
- Rotation:( 0, 30, 0)。
③修改Gargoyle (2)的Transform:
- Positon:( -4.8, 0, 10.6)。
四、整理Hierarchy
经过一轮的设置之后,我们的Hierarchy窗口显得比较凌乱,我们可以对它们进行分类,并且用新建相应的空GameObject作为父节点把它们“装”起来。
(1)新建一个空的GameObject,名为Enemies,Positon设为(0,0,0),把所有Ghost和Gargoyle拖进去;
(2)新建一个空的GameObject,名为Waypoints,Positon设为(0,0,0),把所有Waypoint拖进去。
设置完成后记得保存场景哦。
结语:本篇我们制作了可以巡逻的幽灵,并且在关卡中布置了数只怪物,游戏的大部分设置算是都基本完成了,接下来最后一章我们将为游戏添加音效,进一步烘托恐怖的气氛。
迫不及待想自行开始制作的小伙伴,可以浏览John Lemon&#39;s Haunted Jaunt官方教程:
https://learn.unity.com/project/john-lemon-s-haunted-jaunt-3d-beginner
咱们的游戏开发交流群也欢迎强势插入:869551769
希望参与线下游戏开发学习的,欢~~~~~~迎访问:http://www.levelpp.com/ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|