HuldaGnodim 发表于 2023-2-23 20:17

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

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

    void Update()
    {
      //如果离目标点剩余的距离小于设定的停止距离
      if (navMeshAgent.remainingDistance < navMeshAgent.stoppingDistance)            
      {
            //计算下一个目标点。(当前下标+1)与数组长度取余数
            m_CurrentWaypointIndex = (m_CurrentWaypointIndex + 1) % waypoints.Length;   
            navMeshAgent.SetDestination(waypoints.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's Haunted Jaunt官方教程:
https://learn.unity.com/project/john-lemon-s-haunted-jaunt-3d-beginner
咱们的游戏开发交流群也欢迎强势插入:869551769
希望参与线下游戏开发学习的,欢~~~~~~迎访问:http://www.levelpp.com/

APSchmidt 发表于 2023-2-23 20:27

按你的写了,但进入play mode时,ghos的y位置会自动变到-1.8.无法解决
页: [1]
查看完整版本: Unity暑期萌新入门:巡逻敌人篇