欢迎光临散文网 会员登陆 & 注册

Unity暑期萌新入门:巡逻敌人篇

2019-08-17 11:38 作者:皮皮关做游戏  | 我要投稿

作者:Truly


上一篇中我们设置了不会动的石像鬼,这一篇我们将制作在关卡中巡逻的幽灵,并且在关卡中投放一定数量的敌人。幽灵比石像鬼多了一个巡逻的功能,我们结合之前在关卡中设置的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: ( 00.60)

  • 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.75 0.4 

  • Rotation:(


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.30-3.1)

  • Gost(1) Postion: ( 1.504)

  • Gost(2) Postion: ( 3.206.5)

  • Gost(3) Postion: ( 7.40-3)

(2)设置路线目标点

我们用一些空的GameObject来制作路线的目标点。

①在Hierarchy窗口中右键 > Create Empty,重命名为Waypoint.;

Ctrl+D再复制出9个Waypoint,下边给每只幽灵分配并设置各自的巡逻目标点;

③把Waypoint和Waypoint(1)拖进Ghost 的Waypoint Patrol脚本并修改Positon;

  • Waypoint的Positon: ( -5.306.7)。

  • Waypoint(1)的Positon:( -5.50-4.5)。

④把Waypoint(2)和Waypoint(3)拖进Ghost(1)的Waypoint Patrol脚本并修改Positon;

  • Waypoint(2)的Positon: ( 1.207.7 )。

  • Waypoint(3)的Positon: ( 0.90-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

①再复制2Gargoyle

②修改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),把所有GhostGargoyle拖进去;

(2)新建一个空的GameObject,名为Waypoints,Positon设为(0,0,0),把所有Waypoint拖进去。

设置完成后记得保存场景哦。

结语:本篇我们制作了可以巡逻的幽灵,并且在关卡中布置了数只怪物,游戏的大部分设置算是都基本完成了,接下来最后一章我们将为游戏添加音效,进一步烘托恐怖的气氛。

迫不及待想自行开始制作的小伙伴,可以浏览John Lemon's Haunted Jaunt官方教程:https://learn.unity.com/project/john-lemon-s-haunted-jaunt-3d-beginner


咱们的游戏开发交流群也欢迎强势插入:869551769

希望参与线下游戏开发学习的,欢~~~~~~迎访问:levelpp.com/

Unity暑期萌新入门:巡逻敌人篇的评论 (共 条)

分享到微博请遵守国家法律