Unity开发一个FPS游戏之二

在之前的文章中,我介绍了如何开发一个FPS游戏,添加一个第一人称的主角,并设置武器。现在我将继续完善这个游戏,打算添加敌人,实现其智能寻找玩家并进行对抗。完成的效果如下:

fps_enemy_demo

下载资源

首先是设计敌人,我们可以在网上找到一些好的免费素材,例如在Unity商店里面有一个不错的免费素材, Low Poly Soldiers Demo | 3D 角色 | Unity Asset Store,里面提供了3D模型和动画,其收费版提供了更多的模型,武器以及动画,收费10美刀也不贵。这里我以收费版为素材,把其加到我之前开发的FPS游戏中。

下载资源后导入到项目中,然后在项目文件的LowPoly Soldiers的prefab目录下,可以看到有多个不同服装和武器的Prefab。选择一个拖动到项目中的Prefab目录。然后打开Prefab,在模型中找到其武器,在其枪口位置新增一个名为muzzle的空的GameObject,这将作为敌人发射子弹的位置。如下图:

点击这个Prefab的根对象,即左侧导航树的Soldier_marine variant,为其增加一个Capsule collider,调整其设置,使得这个Collider能覆盖整个人物。

增加一个Script的组件,重用之前创建的MuzzleEffect脚本。

添加一个Nav Mesh Agent组件,使得敌人能在烘培的路面上具备自动寻路的功能。

烘培路线

要让敌人能自动寻路,需要在场景中进行路线的烘培。打开菜单的Window->AI->Navigation,选择Bake,设置Agent的相关参数,然后点击Bake按钮即可。

定义敌人状态和动画切换

在项目的Scripts目录新增一个名为WanderingAI的Script文件,定义敌人的行为模式。这里我们可以定义敌人有行走,快跑,瞄准,射击,重载弹药,受伤害和死亡这几种行为。为了方便起见,在这个Script里面可以定义一个enum来统一管理当前的状态,如以下代码:

[Flags]
private enum EnemyStatus {Idle, Walk,Aim,AimLeft,AimRight,Shoot,Reload,Sprint,Damage,Death
}

在以上状态中,瞄准状态有三个,分别对应原地瞄准,向左移动瞄准和向右移动瞄准。

另外再定义其他的一些属性,并进行初始化,如以下代码:

[Header("Enemy speed")]
public float speed = 3.0f;
public float sprintSpeed = 5.0f;[Header("Enemy eyeview")]
public float eyeviewDistance = 500.0f;
public float viewAngle = 120f;
public float obstacleRange = 1.0f;[Header("Enemy behavior")]
public float aimPeriod = 3.0f;[Header("Shoot Setting")]
[SerializeField]
private Transform muzzleTransform;
[SerializeField] GameObject bulletPrefab;
public int ammo = 5;[Header("Enemy life")]
public int health = 10;private Animator _animator;
private Collider[] SpottedPlayers;
private GameObject bullet;
private MuzzleEffect muzzleEffect;
private long shootTS = 0;
private Vector3 prevPlayerPosition = new Vector3(100f, 100f, 100f);
private Vector3 enemyMuzzleDelta = new Vector3(0f, 2.0f, 0f);
private Vector3 playerPositionDelta = new Vector3(0f, 1.0f, 0f);
private Vector3 playerDirection;
private int currentAmmo; 
private float lerpValue = 10f;
private bool randomSearch = true;
private NavMeshAgent _agent;
private Coroutine corDiscoverPlayer = null;
private Coroutine corReload = nu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/541745.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SD-WAN专线解决跨国业务应用和系统访问慢问题

在全球化背景下,跨国企业面临着日益增长的业务应用和系统访问需求。然而,由于地理位置和网络结构等因素的限制,跨国业务应用和系统访问常常受到网络连接速度慢的困扰。SD-WAN(软件定义广域网)专线作为一种新兴的网络技…

git小白入门

git是什么 Git是一种流行的版本控制系统,被广泛用于软件开发中来跟踪和管理代码的变化。它是由Linus Torvalds在2005年创建的,最初的目的是为了更高效地管理Linux内核的开发。Git使得多人在同一个项目上工作变得更加简单,可以轻松合并不同开…

Filter实现请求日志记录

将锁有得外部访问都记录在日志文件里面,设计这个功能是为了(为什么): 1. 在不引入Promentheus进行接口监控时,基于日志文件就可以实现整个项目得监控。 2. 当出现问题时,可以基于此进行流量重放。 效果如…

Android 深入Http(2)加密与编码

可以对二进制数据(比如图片、视频) 经典算法: DES(密钥短被弃用了) AES (密钥很长 很顶) 速度快,效率高 IDEA 3DES(三重DES,听起来就很慢和重 &#xf…

详解IPD流程之任务书(Charter)

IPD体系是一种全新的产品研发管理模式,它将研发合格产品整个过程分为确保开发做正确的事和如何正确地做事两个阶段。 确保开发做正确的事是指在产品进入研发之初就清晰地定义出有竞争力的产品,核心是确保产品能够对准客户需求,能够给客户带来…

【C++】手撕AVL树

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:能直接手撕AVL树。 > 毒鸡汤:放弃自…

第二十四节 Java 异常处理

什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格…

Vue.js+SpringBoot开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

使用opencv进行图片分析

opencv学习 一、配置环境并打开编译器 配置opencv在你的任意一个盘里创建一个专属于opencv的文件夹便于学习与整理 打开控制台winr输入cmd,进入后输入conda activate opencv,进入环境以后进入你所设置的opencv文件的盘,我的是D盘&#xff0…

专业款希亦、小米、必胜、云鲸洗地机怎么样?深度测评利弊

洗地机可以说是一种非常实用的清洁工具,尤其是对于那些需要经常给家里地板清洁的人来说。它能够高效、彻底清洁地板,去除顽固污渍、灰尘和细菌,让家居环境更加洁净卫生。可是面对型号繁多的洗地机,我们应该怎么挑选呢?…

综合利用Cisco Packet Tracer模拟器配置园区网

1. 内容 1.在课室交换机中创建各个课室的VLAN,并将1-20端口平均分配给各个课室。 2.使用课室交换机的每个端口只能接入一台计算机,发现违规就丢弃未定义地址的包。3.网络内部使用DHCP分配各课室的IP地址,在课室交换机按照第一题划分的VLAN地…