找回密码
 立即注册
查看: 270|回复: 1

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

[复制链接]
发表于 2023-2-23 20:17 | 显示全部楼层 |阅读模式
上一篇中我们设置了不会动的石像鬼,这一篇我们将制作在关卡中巡逻的幽灵,并且在关卡中投放一定数量的敌人。幽灵比石像鬼多了一个巡逻的功能,我们结合之前在关卡中设置的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
①再复制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
希望参与线下游戏开发学习的,欢~~~~~~迎访问:http://www.levelpp.com/

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-2-23 20:27 | 显示全部楼层
按你的写了,但进入play mode时,ghos的y位置会自动变到-1.8.无法解决
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-6-22 13:25 , Processed in 0.107383 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表