UFPS入门: Unity FPS 教程

527 篇文章 10 订阅
订阅专栏

原文:Introduction To UFPS: Unity FPS Tutorial
作者: Anthony Uccello

用一支散弹枪轰杀大片凶恶的敌人或者在战场上小心翼翼地狙杀你的对手是一种爽到极点的游戏体验。以动作+射击为主的游戏被称作第一人称射击游戏(FPS)。它有一个类似的种类,即第三人称射击游戏——区别在于你看到的画面是角色的后背还是枪管的下方。

在编写 FPS 游戏时,毫无疑问需要做大量工作。但是,我们没有必要从 0 开始,你可以使用一个叫做 UFPS(终极FPS)的框架!

在本文中,我们将介绍 UFPS 是什么以及如何用它创建一个基本的 Unity FPS “沙盒”游戏——“沙盒”一词意指玩家被限制在一个有限的空间内。

读完本文,你将学会:

  • 用简单的 UFPS 脚本让玩家移动和开火
  • 使用 vp_FP 组件
  • 当子弹击到平面时显示弹孔
  • 为玩家添加内置的 FPS 动作
  • 添加新的枪具并配置属性
  • 添加带瞄准镜的大狙(最好的枪)

预备知识

你应当熟悉 C# 脚本并关联组件到 GameObject 对象。如果你没接触过 Unity 或者需要重温一下,请参考我们的 getting started in Unity 教程。

你还需要一份 Opsive 公司的 “UFPS: Ultimate FPS” 许可协议,这份协议你可以从Unity Asset 商店获得。这篇教程是用 UFPS 1.7编写的。

最后,你需要使用 Unity 5.5.0 或以上的版本。

开始

UFPS 是一个 Unity 插件,包含用于支持典型 FPS 游戏的核心逻辑。不需要自己为每个场景编写脚本,你可以通过修改预置脚本来处理常见的任务比如:

  • 装备枪支
  • 枪的移动和开火
  • 管理弹药和库存
  • 玩家的移动
  • 管理相机视角
  • 跟踪相机
  • 管理事件,比如被激光枪击中
  • 管理平面,比如滑坡和水道
  • 尸体及重力物理

好的游戏不可能一蹴而就。做游戏的最好方式是把注意力集中在基本功能上,比如核心玩法,然后以此为基础逐步完善。UFPS 能够帮你打好这个基础并且还提供一个更加庞大的框架给你使用。

下载开始项目: ReadyAimFire_Unity3D_starter。

在 Unity 中打开项目,双击 Main 场景加载游戏场景。

注意:我们不能再次分发 UFPS 的源文件,因此这个教程中不会有一个最终项目,它们也不包含在开始项目中。你需要自己完成整个游戏:]

在 Unity Asset 商店中找到 UFPS,找到下载栏,点击下载按钮。下载完成后,点击 Import 按钮,稍等一会显示出包的内容,然后点 OK。包很大,请耐心一点。

注意:你可能会看到一个关于“importing a complete project”的警告:

这是因为 asset 中包含了一些项目设置,这些设置会覆盖你当前 open project 设置。在这里,只有 Graphics 和 Tag 设置会被覆盖,因此你只需要点击 Import 按钮继续导入 UFPS 即可。

导入完成后,你可能会看到几个警告。这些警告来自于 UFPS,直接忽略即可。

从 File 菜单选择 Save Scenes,保存修改。点击 Play 按钮,感受一下全新的项目。

重要概念

你肯定非常想射击(或者编写脚本),但理解 UFPS 框架的一些关键概念非常重要。

FP 组件

FP 包含了一个组件,它属于一个脚本族,这个脚本族用于管理真实的第一人称射击对象——也就是玩家。这些组件都以 vp_FP 开头。其中最重要的组件是 vp_FPController 脚本,在玩家对象被创建的时候就关联了这个脚本。

状态

状态是一个容易混淆的概念。在许多 vp_FP 逐渐中,你都会找到另一个名为 State 的属性,例如:

某个 vp_FP 脚本用一个 state 字段来记录一些本地变量的值,这些变量用于表示组件在指定时间点的状态。设想一下:当你放大并使用狙击步枪的瞄准镜时,你可以处于一种“Zoom”状态—— 这个状态下的预设值应当变大,同时改变枪的位置和角度以对准中心位置。当你 Zoom 的时候,它也会让武器的移动呈现出动画。

事件

事件是对象之间的信号,用于表示某些重要的事情发生了,其它对象必须做出响应。例如,当某样东西被射中时。“被射中”就是一种事件——也可以说一个信号。根据你的游戏设定,其它对象会对此做出响应。这篇教程不会过多介绍事件。

好了,伙计,干得不错。

创建玩家预制件

在项目浏览器的搜索栏中输入 SimplePlayer,然后将 SimplePlayer 预制件拖到场景中,放到靶子前面。

在结构视图中选中 SimplePlayer 这个 GameObject,设置它的 Position 为 (X = -26.6, Y = 1.3, Z = -21.3) ,Rotation 为 (X = 0, Y = 0, Z = 0)。

从结构视图中删除 Camera 这个 GameObject。我们不需要它,因为在 SimplePlayer 上的镜头会给你一个第一人称视角。

点击 Play,你创建了一个 FPS 游戏并且可以运行了!

在开枪或使用瞄准镜的的时候按下 play,会将光标锁定到屏幕上。按下 Escape 又会重新获得光标。

使用 WASD 键移动或者按下鼠标左键开枪,右键打开瞄准镜——你可以在打开瞄准镜的同时开枪。还可以用 Shift 键跑,用空格键跳。请打到靶子上:]

注意:在编写本教程的时候,UFPS 有一个 Bug,当你第一个试玩一个场景时,不能看到枪口焰。解决办法是点击鼠标右键打开瞄准镜一次——后面就正常了。

后面有许多逻辑,但 UFPS 好的地方就是它会为你完成许多工作。它让你把注意力放在更重要的事情上,比如为武器添加自定义的行为。你会惊喜地发现根本不需要为玩家的移动和武器的开火创建任何动画。你看见的动作使用了物理引擎。这也是由 UFPS 完成的!

UFPS 开始只有一把小手枪,但开始项目中还包含散弹枪和狙击步枪的预制件。你可以简单地拖入这两个预制件并修改 UFPS 设置以完善动画效果。

尽管不需要管枪支的动画,但你需要自己实现手的动画。这篇教程不会设计手的动画,UFPS 也不会包含手的动画。但是,如果你要创建一个正式的 FPS 游戏,可能需要考虑实现手的动画。

最后,你可以为枪支模型添加复杂动画。这样,你就需要在模型中包含手。

添加弹孔

你会听到枪声并看到弹壳跳出!在枪口还会有很酷的枪焰喷出!UFPS 为你实现了这些,它有一个特性运允许你轻易地添加和配置新枪。

尝试向某些东西开火,看看到底还差了点什么?这个枪难道是射到了空气中吗?为什么没有弹孔?

当你射到某样物体时,你会留下一些痕迹。终止游戏。在结构视图中,点击 Eviroment GameObject 左边的下拉箭头,选择子 GameObject Wall。

在检视器中,点击 Add Component,在搜索栏中输入 vp_SurfaceIdentifier。点击 vp_SuerfaceIdentifier——唯一的脚本——然后添加它。点击 Surface Type 字段右边的小圆点,在弹出菜单中,选择 Assets 标签,然后选择 Metal。

在结构视图中选中 Ground 这个 GameObject,重复上述步骤,但在最后一步选择 Wood。

枪靶需要一个木制的表面痕迹,因此在结构视图中选中 Target 和 BackTarget GameObject,点击旁边的下拉箭头,选择它们的子 GameObject,然后添加 vp_SurfaceIdentifier 脚本组件,表面类型设置为 Wood。

点击 Play 然后分别向标靶、墙和地板射击,现在你可以检查你的手艺如何了 :]

如何使用 UFPS 手枪

仅仅用小手枪是无法应付一堆恶心的怪物的,你觉得呢?过一会你会添加散弹枪,但我们先来理解如何使用手枪会更简单一点。

在结构视图中,展开 SimplePlayer,然后展开 FPSCamera GameObject。选择 1Pistol GameObject。

武器前面的编号 1 表示玩家在游戏期间可以按这个数字来装备手枪。当你添加新武器的时候,你可以向上增加这个数字,UFPS会自动处理换枪的问题。

1Pistol 有几个重要组件:

  • AudioSource 让枪开火时发出 bang 的声音。
  • vp_FPWeapon 将该 GameObject 识别为 UFPS 框架中的一种武器并决定了和这个武器所对应的外观。
  • vp_FPWeaponShooter 负责枪焰、弹壳弹跳和子弹的效果。
  • vp_FPWeaponReloader 负责装弹时的声音和动效。

注意: 弹药和装弹不属于本文内容,但它们也属于创建游戏时需要考虑的内容。在 UFPS 文档中关于这些 vp_FP 组件的完整介绍包含了许多章节,因此当你遇到问题时,请首先参考这个文档。

vp_FPWeapon

在检视器中,展开 vp_FPWeapon 脚本组件的 Position Springs 一节。这个组件用于设置枪在屏幕上的位置,它是根据状态改变的——例如,当手枪在 Zoom 状态下移动的时候。Offset 是枪在屏幕上的位置。

点击 Play,通过修改 Offset 值随意调整枪的位置。通过这种方式,可以让你在试玩模式下不会搞乱游戏的真实值。

在试玩模式下修改设置是一种测试和调试的好方法——唯有一点,如果你真的想改变这些设置,请不要在试玩模式下。这是非常容易忘记的事情,忘记自己仍然处于试玩模式是,这往往会导致额外的工作量并让你爆出粗口。

从这个组件往下看,找到 Spring2 Stiffn 和 Spring2 Damp — 这是枪的后坐力设置。Spring2 Stiffn 即 ‘弹性’, 或者开火后枪如何弹回它原来的位置。Spring2 Damp 是弹回的速度有多快。最简单的办法是通过实际操作来体验:]

点击 Play 然后拖动 Spring2 Stiffn 和 Spring2 Damp 值,感受不同的效果。

要使最终的动画满意,可能需要做一些实验并付出点代价,因此一点也不要奇怪,头几次很可能枪就像一只弹簧弹来弹去。

你已经知道 Position 了,接下来我们看一下 Rotation。在检视器中,展开 vp_FPWeapon 的 RotationSprings 节。找到 Offset 值,它和你在 PositionSrping 节中看到的是一样的。所不同的是这些值决定了枪的角度。

点击 Play 并修改一下 Offse 值试试。

试想一下当你开枪的时候会发生什么。UFPS 通过插值的方式在两个状态间实时创建动画。

你所需要的仅仅是在 vp_FPWeapon 组件中设置各个状态值——不需要创建或导入导致这种效果的动画。你会在添加散弹枪和狙击步枪的时候亲身体会这一点。

停止游戏。

进行一点深入讨论。在 vp_FPWeapon 的检视器中展开 States 节,看一下已有的状态及与之关联的数据文件。数据文件在状态改变时 vp_FPweapon 中的什么记录值会发生改变。

以 Zoom 状态为例。双击 WeaponPistolZoom,看一下脚本文件——Unity 默认的代码编辑器会打开。它是一个简单数据文件:

ComponentType vp_FPWeapon
ShakeSpeed 0.05
ShakeAmplitude 0.5 0 0
PositionOffset 0 -0.197 0.17
RotationOffset 0.4917541 0.015994 0
PositionSpringStiffness 0.055
PositionSpringDamping 0.45
RotationSpringStiffness 0.025
RotationSpringDamping 0.35
RenderingFieldOfView 20
RenderingZoomDamping 0.2
BobAmplitude 0.5 0.4 0.2 0.005
BobRate 0.8 -0.4 0.4 0.4
BobInputVelocityScale 15
PositionWalkSlide 0.2 0.5 0.2
LookDownActive false

当 vp_FPWeapon 进入 Zoom 状态时肯定会有某些变化发生。 看起来有点吓人,但其实非常简单——你可以在试玩期间改变枪的位置,然后保存状态文件。

vp_FPWeaponShooter

在检视器中展开 vp_FPWeaponShooter 下面的 Projectile 节。这个决定了枪的开火方式。

  • Firing Rate 是多长时间触发一次动作。
  • Tap Firing 允许玩家不需要等待开火的动画完成直接射击——它修改了开火动画。
  • Prefab 是子弹。子弹的脚本位于 vp_BulletFX 下,要了解更多请参考这个文档。

展开 Muzzle Flash 小节。你可以设置这个美工预制件,它的大小、位置以在玩家开枪后显示完美的枪焰效果。

展开 Shell 小结,看一下这些设置,它们负责完成当弹壳从枪管跳出后的动作。

最后,展开 Sound 小节。这些设置负责开枪时和空枪时的声效。

在这里还会有一个 States 节。它和 vp_WPWeapon 节的状态栏类似。如果你不知道它们的用途,你可以查看源代码,里面包含了一个高级主题 Refelection——在本文最后有一个链接,你可以参考它。

添加散弹枪

编写一个不让主角拥有短程毁灭性武器的 FPS 游戏有什么意义?那还不如不要写。没有这种武器的只可能是一个非常小、非常小的 FPS 游戏。

回到 UFPS 上来,你将不废吹灰之力就添加一个枪械模型。

在项目浏览器中,输入 2Shotgun 然后将 2Shotgun 预制件拖到结构视图的 1Pistol GameObjecdt 下面。

你会发现 vp_WeaponShooter 没有任何选项,那是因为预制件被禁用了。将 2Shotgun 左边的选项框勾上。

你可能也想到了,你只需要运行游戏然后按 2 就可以装备上散弹枪了?差不多吧!但是 SimplePlayer 预制件只配置了手枪。

为了让新枪能够生效,你需要添加了一个新组件。在结构视图中点击 SimplePlayer GameObject,然后在检视器中点 Add Component。输入 vp_FPWeaponHandler,选中这个脚本。这个脚本允许更换武器。

将 Start Weapon 设置为 1,即手枪。现在,你可以点击 Playe 然后按 2 了,你就可以从手枪切换到散弹枪。

等等……有点不对劲——枪的位置不对!在结构视图中选中 2Shotgun,在检视器中展开 vp_FPWeapon 的 PositionSprings 节,将 Offset 设为 (X = -0.04, Y = -0.46, Z = 4.89)。 展开 RotationSprings 节,将 offset 设置为 (X = -1.09, Y = -93.3, z = 2.5)。

散弹枪会发射一片子弹。一次只射出一颗子弹就有问题了。

展开 vp_FPWeaponShooter 下面的 Projectdile,将 Count 设置为 10,Spread 设置为 2。

展开 MuzzleFlash 将预制件设置为 MuzzleFlashShotgun。

将 Position 设为 (X = -0.08, Y = -0.24, Z = 8.88) ,Scale 为 (X = 1, Y = 1, Z = 1)。如果你想修改这些值,可以在试玩过程中编辑 MuzzleFlash Position,然后停止游戏后再修改 Position——这样枪焰就会精确地出现在你指定的位置。

展开 Sound 小节,将 Fire 设置为 ShotgunFire。

点击 Play 并按下数字 2,在靶心上射出一些弹孔。

Zoom 是一种特殊的状态,在 UFPS 中它被预设为 RMB(鼠标右键)来触发。点击右键后,会将所有组件设置为 Zoom 状态,这些组件必须监听这种状态。

你可以添加自己的 Zoom 状态。来试一下,点击 Play,按下 2 换成散弹枪。修改 vp_FPWeapon 的 Position Springs 和 Rotation Springs Offset 值,让镜头指向枪管下面。点击位于 vp_FPWeapon 底部的 Save 按钮,将文件名命名为 ShotgunZoom 然后点击 Save。

注意:如果你无法让 Zoom 显示正常,或者你使用的 Mac 上无法看到 vp_FileDialog 窗口中的 Save 按钮,请下载这个文件 ShotgunZoom并将它拖到 Unity 的 Assets 文件夹。

设置完 Zoom 之后,散弹枪并不知道怎样去用它。停止游戏,点击结构视图中的 2Shotgun GameObjecdt,在检视器中展开 vp_FPWeapon 的 States 小节。将 ShotgunZoom 拖到 Zoom 字段。

UPFPS 利用开始值和终止值创建动画。点击 Play,当你换上散弹枪并切换到 Zoom 模式下时,它会以动画方式移动到你所保存的 Zoom 状态的位置。

添加狙击枪

一个好的 FPS 游戏都会提供一系列武器以便玩家能够在各种条件下消灭敌人。这次你需要在一个安全距离下一个接一个地搞定,没有什么比一直大狙更好的武器了!

在项目浏览器中搜索 3Sniper 并将 3Sniper 预制件拖到结构视图的 2Shotgun GameObject 下面。在检视器中,和前面一样,添加 vp_FPWeapon 和 vp_WeaponShooter 脚本。

在项目浏览器中展开 Assets/Prefabs 文件夹,将狙击步枪的模型添加到 vp_FPWeapon 的 Rendering 节。

在结构视图中,点击 3Sniper 这个 GameObject,在检视器中展开 vp_FPWeapon 组件。展开 Rendering 节,找到 1st Person Weapon(Prefab) 字段。将 m24 预制件从项目浏览器中拖到 1st Person Weapon(Prefab) 字段。

在 vp_FPWeapon 下面,将 Position Springs 设置为 (X = 1.4, Y = -0.81, Z = 4.88) ,Rotation Springs 设为 (X = -2.7, Y = 79.62, Z = -5.01)。展开 vp_FPWeaponShooter 的 Sound 小节,将 Fire 设置为 SniperShot。

然后就可以使用大狙了。点击 Play,按数字 3 试一试。别忘了开枪试试 :]

你是不是觉得“可以用” 是有点夸张了?在你瞄准的时候没有瞄准镜!完这个游戏的手,添加一个瞄准镜是非常有用的。

接下来添加一个 Sniper 组件,用于瞄准。这是一个特殊脚本,为了能够正常工作,它需要监听玩家事件。

打开 Scripts 文件夹,在任何地方右键,使用弹出菜单创建一个新的脚本,名为 Sniper。双击这个文件打开,将内容编辑为:

using UnityEngine;
using System.Collections;

public class Sniper : MonoBehaviour
{
  //1
  public vp_FPPlayerEventHandler playerEventHandler;
  public Camera mainCamera;
  private bool isZooming = false;
  private bool hasZoomed = false;

  //2
  void Update()
  {
    if (playerEventHandler.Zoom.Active && !isZooming)
    {
      isZooming = true;
      StartCoroutine("ZoomSniper");
    } 
    else if (!playerEventHandler.Zoom.Active)
    {
      isZooming = false;
      hasZoomed = false;
      GetComponent<vp_FPWeapon>().WeaponModel.SetActive(true);
    }

    if (hasZoomed)
    {
      mainCamera.fieldOfView = 6;
    }
  }

  //3
  IEnumerator ZoomSniper()
  {
    yield return new WaitForSeconds(0.40f);
    GetComponent<vp_FPWeapon>().WeaponModel.SetActive(false);
    hasZoomed = true;
  }
}

代码解释如下:

  1. 这些变量用于保存 PlayerEventHandler 和镜头的引用。两个布尔变量用于保存 zoom 状态。
  2. 这段代码判断 zoom 状态是否启用。当枪处于 zoom 状态时,它会将视图的这个字段设置为 6,这就出发了 zoom 状态。
  3. 这个子程序判断什么时候 zoom 动画才完成——这里大约需要 0.4 秒左右——然后隐藏枪支模型。这会在切换视野之前给玩家一个缓冲时间。

保存文件,返回 Unity。将 Sniper 基本拖到 3Sniper 这个 GameObject。

将 SimplePlayer 预制件拖到 Sniper 组件的 PlayerEventHandler 上。然后,将 FPSCamera 拖到 Simper 组件的 Main Camera 字段。

在结构视图,你会发现有一个名为 UI 的 GameObject,它是用一个 SniperZoom 的贴图创建的。

进入 Scripts 文件夹,创建一个新的 C# 脚本。命名为为 GameUI。在结构视图中选中 UI 对象,将 GameUI 脚本从项目浏览器中拖到检视器中。

打开 GameUI 脚本,编辑如下内容:

using UnityEngine;
using UnityEngine.UI;

public class GameUI : MonoBehaviour
{
  public GameObject sniperZoom;
  public vp_PlayerEventHandler playerEventHandler;

  public void ShowSniperZoom() 
  {
    sniperZoom.SetActive(true);
    sniperZoom.GetComponent<Image>().enabled = true;
  }

  public void HideSniperZoom()
  {
    sniperZoom.SetActive(false);
    sniperZoom.GetComponent<Image>().enabled = false;
  }
}

两个公共方法分别用于显示和隐藏 sniper scope 贴图——这里保存了一个 scope 纹理的引用和事件处理器的引用。Sniper 脚本经过配置后会调用这两个方法。保存脚本,返回 Unity。

在结构视图中,展开 UI 对象。将 SniperZoom 拖到检视器中的 SinperZoom 字段,然后将 SimplePlayer 拖进 PlayerEventHandler 字段。

打开 Sniper 脚本。在头部添加变量:

public GameUI gameUI;

现在,这个脚本将引用 GameUI。

在 else if (!playerEventHandler.Zoom.Active) 语句下面,加入:

gameUI.HideSniperZoom();

修改之前是 :

else if (!playerEventHandler.Zoom.Active)
{
  isZooming = false;
  hasZoomed = false;
  GetComponent<vp_FPWeapon>().WeaponModel.SetActive(true);
}

修改之后变成了:

else if (!playerEventHandler.Zoom.Active)
{
  gameUI.HideSniperZoom();
  isZooming = false;
  hasZoomed = false;
  GetComponent<vp_FPWeapon>().WeaponModel.SetActive(true);
}

当处于“非-zoom”状态时,sniper zoom 图片将隐藏。

在 GetComponent().WeaponModel.SetActive(false); 后面添加:

gameUI.ShowSniperZoom();

修改之前的代码是:

IEnumerator ZoomSniper()
{
  yield return new WaitForSeconds(0.40f);
  GetComponent<vp_FPWeapon>().WeaponModel.SetActive(false);
  hasZoomed = true;
}

修改之后变成了:

IEnumerator ZoomSniper()
{
  yield return new WaitForSeconds(0.40f);
  GetComponent<vp_FPWeapon>().WeaponModel.SetActive(false);
  gameUI.ShowSniperZoom();
  hasZoomed = true;
}

这句在狙击步枪进入 zoom 状态之后显示 sniper scope 图片。保存,返回 Unity。选择 3Sniper 对象,将它拖到 UI 对象的 GameUI 字段。

所有的工作是为了在玩家进入瞄准状态时把枪隐藏,同时显示瞄准器视野。运行游戏,按下数字键 3,换成大狙,点击 RMB (鼠标右键)切换到 zoom 状态。

起作用了,但还不完善。你可以通过一些设置进行改进,让玩家在瞄准的时候能够看一眼瞄准镜。

点击 Play,按 3 切到大狙。展开 3Sniper 的 Position Spring 和 Rotation Springs,调整位置和角度的 offset 值,直到镜头前有瞄准镜显示出来。

点击 vp_FPWeapon 组件底部的 Save 按钮。文件命名为 SniperZoom 然后点 Save。

我们将大狙进入瞄准状态时的状态保存到了文件里。这里,你将枪上移,进入镜头前面显示出来,就像玩家在低头看瞄准镜一样,SniperZoom 中刚好保存了这个状态。

注意:如果你无法创建或保存你的设置,请下载此 SniperZoom文件。

现在,你已经设好了状态,但还需要创建要用到的状态。选中 3Sniper,展开 vp_FPWeapon,展开 State 一节。

点击 Add State 按钮,将 Untitled with Zoom 替换成 new State 字段。

从 Assets 文件夹将 SniperZoom.txt 文件拖到 3Sniper 的 vp_FPWeapon 组件的 Text Asset 字段。

吃枪子去吧!

在你能够狙击猎物之前,还有几个工作要做。在枪里面装入子弹是个不错的注意——当然,你可以跳过这一步,但这就不是狙杀了。前面的手枪和散弹枪都创建过子弹。我们从头开始创建大狙的子弹,因此你需要设置子弹所用的预制件。

仍然是在 3Sniper 中,展开 vp_FPWeaponShooter,再展开 Projectile 一节。点击 Prefab 右边的小圆圈按钮。找到并选择 PistolBullet 预制件。

点击 Play,瞄准距离最远的枪靶——你可能需要转个方向。按下 RMB 瞄准、开枪!

现在,在进入 zoom 状态之前,你会看见狙击镜显示。干得不错!

结束

噢,又到说再见的时候了。从何说起呢?UFPS 是一个强大的框架,这篇教程仅仅论及皮毛。

接下来的步骤应该是添加一只突击步枪和令人满意的动画。试着修改 vp_FPWeapon 中的滑竿和值直到感觉满意。记住,它的射速要快,每次射击后会产生快而小的后弹动作。

你学会了基本的概念,但在 UFPS 文档中还有大量的东西需要学习。比如,你还不知道什么是 vp_FXBullet。在 FPS 游戏中有一个关键特性就是库存和弹药管理,它设计到 UI 的使用。

你也没有体验到许多 UFPS 的超酷的特性——因此请继续学习它们。

关于 Unity 的 UI 系统,你可以参考以下教程:

Unity UI Part 1
Unity UI Part 2
Unity UI Part 3

或者购买 Unity Games by Tutorials一书,学习如何编写棒棒的游戏。

正如我之前所说的,reflection 是一个高级技术,它在你的编码工具箱中是个很好的工具,因此请你有机会一定要 阅读它。

通过这个官方 Unity 事件教程( https://www.youtube.com/watch?v=3NBYqPAA5Es),你可以更深入地学习事件系统。

有任何问题、建议或需要更多的 UFPS 教程,请在论坛中留言。你的评价将决定我们下一个主题会介绍什么——请告诉我!

致谢

特别感谢 Wojciech Klimas 提供了枪械模型,以及其他资源:

网站
散弹枪的 Asset
狙击步枪的 Asset

UnityFPS游戏开发插件最新版UFPS Ultimate FPS 2.2.4
09-24
UFPS Ultimate FPS是一款专为unity开发者打造的游戏开发插件,该插件主要方便开发者制作出满意的FPS游戏,我们玩到的一些FPS类的游戏也多是使用UFPS插件进行开发的,该插件拥有先进的移动平台支持,兼倥慢动作模式,有需要此款工具的朋友们欢迎前来下载使用。
Unity3D(FPS中文教程)
07-29
Unity3D游戏制作教程!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
探索UnityFS:一个强大的Unity资源管理系统
最新发布
gitblog_00080的博客
04-05 611
探索UnityFS:一个强大的Unity资源管理系统 项目地址:https://gitcode.com/ialex32x/unityfs UnityFS 是一个开源的项目,专为Unity游戏开发设计,用于管理和优化资源加载和存储。它旨在提供一种高效、灵活的方式来处理Unity中的大量游戏资源,从而提升游戏性能和用户体验。 项目简介 UnityFS是一个基于Unity引擎的文件系统扩展,它允许开发者...
Unity官方FPS教程解析(一)
qq_51443004的博客
10-21 2547
在刚接触Unity的时候学习官方教程时下载导入过官方FPS教程,但是由于什么都不懂所以光是看着整个层次面板都觉得难受😂,所以就放弃了,今天算是重拾并且也算是对一些和我一样的刚接触的各位发表一些自己的见解。(一)下载并导入这个FPS资源,如图: 导入与打开操作我就跳过了,没有什么注意的。(二)观察游戏层次面板如图: 这里建议各位刚接触新手别急着点开所有层次关系,目前的层次是官方已经布局好了的并且有分隔标识,不然的话会冒藏话的。 整个面板包括6个部分:在查看其组成时可以选中目标然后在编辑场景中按F,即可聚焦
Unity官方FPS教程解析(二)
qq_51443004的博客
10-23 1191
其下包括了两个主要部分,第一个就是FeedBackFlashCanvas,主要为状态反馈,其作用与上面的淡出效果一样,一个是受打击时反馈,一个是血量低时反馈(此处为了凸显效果改为了亮色),这里直接贴图。所以,我们可以得出,一个基本的可互动的敌人至少需要有一个模型(让你能看得见),一个血条(让你能打的),以及一个交互脚本,所以就官方例子来说,敌人已经足够简化了。到此算是整个案例的基本的层次结构大都了解了,剩下的就是最重要的脚本了,下一期我们就从我们的主角Player的控制讲起吧。
UFPS : Ultimate FPS 1.7.4
10-05
大名鼎鼎的ufps插件,用于制作第一人称设计游戏
UFPS Ultimate FPS 2.2.4.unitypackage
05-05
UFPS Ultimate FPS 2.2.4.unitypackage 关于该插件的详细描述可上Asset Store 查询
UFPS-Ultimate-FPS-v2.4.8
10-17
UFPS-Ultimate-FPS-v2.4.8
UFPS Ultimate FPS 终极FPS解决方案
10-29
经过实战检验的FPS解决方案;有VR内容;案例教学
UNITY 3d FPS游戏教程中文版
11-23
这个教程将详细介绍如何制作一个简单的第一人称射击(FPS)游戏,它将介绍基本的3D游戏程序概念并且给出一个游戏程序员如何进行思考的提示
基于Unity3D的简单FPS游戏教程
07-11
简单的FPS游戏教程,十分完整,适合初期接触Unity3D的同学学习,并且整理了FPS-Tutorial的素材包,使用更方便
Unity源码之FPS
01-24
经典的DT教程中的第七章人物移动的相关项目源码。基本包含了一个FPS游戏的开始阶段的模型和射击操作的关键代码。
UNITY开发的FPS游戏
03-03
UNITY开发的FPS游戏,包括小地图等,比较全面的学习demo
unity3d FPS 完整demo
07-19
guanf官方75刀插件~ FPS unity3d 开发 专案进行参考 现在把代码提交,美术资源 没有
unity fps
weixin_37744986的博客
06-07 341
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Getfps : MonoBehaviour { int tick = 0; float elapsed = 0; float fps = 0; // Use this for ...
Unity 显示FPS
acuriousguy
05-07 215
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FPSView : MonoBehaviour { public float updateInterval = 0.5F; private float accum = 0; private int fram...
unityFps射击
作孽就得先起床的博客
06-12 271
FPS射击对象是从,主相机中心发射出的子弹,并不是枪口发射的子弹
unity EventTrigger
09-02
EventTrigger是Unity中的一个组件,用于处理游戏对象上的事件触发。它继承了许多事件接口,为开发者提供了方便的事件处理功能。通过使用EventTrigger,开发者可以在特定的事件发生时执行自定义的操作。 在Unity中,EventTrigger可以用于许多场景,比如在用户点击按钮时触发某个动作,或者在鼠标进入某个区域时触发某个效果等。它可以与其他Unity插件或扩展一起使用,例如Ultimate FPS (UFPS)、Uni2D和Vectrosity等。 在EventTrigger中,有多个事件可以进行配置,例如PointerClick事件、PointerEnter事件和PointerExit事件等。每个事件可以与一个或多个自定义方法关联,以在事件发生时执行相应的操作。 举个例子,当用户点击一个按钮时,可以通过配置EventTrigger的PointerClick事件来调用一个自定义的方法,来处理按钮点击事件。同样地,当鼠标进入或退出某个区域时,可以通过配置EventTrigger的PointerEnter和PointerExit事件来执行相应的操作。 总之,Unity的EventTrigger提供了一个灵活的事件触发系统,可以帮助开发者更方便地处理游戏对象上的事件。通过合理地配置EventTrigger,开发者可以实现各种各样的交互效果和游戏逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity中EventTrigger的几种使用方法](https://blog.csdn.net/qq_45152631/article/details/107388530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [unity Behavior Designer 1.5.10 AI专用插件](https://download.csdn.net/download/qq_36848370/10389567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [unity | EventTrigger(Button按钮按下、抬起等时执行的方法)](https://blog.csdn.net/weixin_49427945/article/details/127283331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交

博客专家认证

411
原创
1048
点赞
2531
收藏
5206
粉丝
关注
私信
写文章

热门文章

  • Groovy入门教程 229328
  • 企业版IDP的申请及“In House”发布 104734
  • 一个签名错误的解决——codesign failed with exit code 1 102170
  • PKCS12 证书的生成及验证 82944
  • Android:资源 id 及资源 id 的动态获取 82016

分类专栏

  • SwiftUI 5篇
  • Core Graphics 入门教程 8篇
  • kotlin 24篇
  • iOS动画专栏 17篇
  • MCCS 8篇
  • mac开发 13篇
  • MailCore专栏 7篇
  • 开源框架CorePlot 8篇
  • iOS MDM 专栏 7篇
  • Lua & Wax 6篇
  • Android Studio 入门系列 18篇
  • iOS开发问与答系列 10篇
  • iOS数据库开发专栏 5篇
  • Cocos2d游戏开发 9篇
  • Android 41篇
  • Flex
  • iPhone开发 527篇
  • javaEE 13篇
  • javascript 4篇
  • Oracle 1篇
  • 一步一步学grails 11篇
  • 系统管理 3篇
  • Mac OS X 15篇
  • 游戏开发 7篇
  • java 14篇
  • 跨平台开发 2篇
  • 视频教程 1篇
  • 算法
  • 架构 10篇

最新评论

  • Core Location 电子围栏:入门

    m0_62335860: 啊对对对,你就这么可劲儿造用户电池,一会儿就没电了,你知道实时定位有多费电吗表情包

  • Unity 脚本入门教程

    码冬梅: 什么时候把入门也翻译了表情包

  • 快排算法为什么会这样写?

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/7980902, 请多输出高质量博客, 帮助更多的人

  • Android 自定义和可下载字体

    sz_denny: 楼主,这个访问google是不要梯子才可以?如果要从自己的服务器下载自定义的字体要怎么做呢?

  • 如何在 Unity 中制作一个道具系统

    fw820924: 您提供的学习视频链接已经过期或者视频已经被撤下,请问还有其他渠道或备用方案么?

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • iOS 信号量 DispatchSemaphore
  • Swift Tips(3)
  • Swift Tips(2)
2023年6篇
2022年26篇
2021年27篇
2020年7篇
2019年48篇
2018年56篇
2017年89篇
2016年65篇
2015年50篇
2014年63篇
2013年59篇
2012年68篇
2011年93篇
2010年36篇
2009年7篇
2008年2篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

4617作文网好听的早餐店名字大全,早餐店起名周易13卦详解给姓安的男孩起名是否有算命很准的熊姓小女孩起名字怎样化解不好的梦梦见死人周公解梦原版辽宁周易起名起名字大全配送公司周易免费测公司名字打分测评姓杜起名根据中文名字起英文名字的网站朱姓生猪宝宝起名周易取名图李姓女孩起名大全2019女孩yi字取名起名大全威海周易起名周公解梦大全查询掉头发周易免费车牌测试周易测公司名打分免费周公解梦大老鼠糖字起名赵字起名字猪宝宝起名用那个字梦到绿蛇预示着什么周公解梦孩子生辰八字算命尔雅易学网算命一条街单姓怎么取名起名大全女孩缺土缺火起名字梦见你的哪一夜广场舞分解慢动作淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男子给前妻转账 现任妻子起诉要回网友建议重庆地铁不准乘客携带菜筐月嫂回应掌掴婴儿是在赶虫子重庆警方辟谣“男子杀人焚尸”国产伟哥去年销售近13亿新的一天从800个哈欠开始男孩疑遭霸凌 家长讨说法被踢出群高中生被打伤下体休学 邯郸通报男子持台球杆殴打2名女店员被抓19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警两大学生合买彩票中奖一人不认账德国打算提及普京时仅用姓名山西省委原副书记商黎光被逮捕武汉大学樱花即将进入盛花期今日春分张家界的山上“长”满了韩国人?特朗普谈“凯特王妃P图照”王树国3次鞠躬告别西交大师生白宫:哈马斯三号人物被杀代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了房客欠租失踪 房东直发愁倪萍分享减重40斤方法“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火手机成瘾是影响睡眠质量重要因素考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼网友洛杉矶偶遇贾玲呼北高速交通事故已致14人死亡西双版纳热带植物园回应蜉蝣大爆发男孩8年未见母亲被告知被遗忘张立群任西安交通大学校长恒大被罚41.75亿到底怎么缴沈阳一轿车冲入人行道致3死2伤奥运男篮美国塞尔维亚同组周杰伦一审败诉网易国标起草人:淀粉肠是低配版火腿肠外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万杨倩无缘巴黎奥运男子被猫抓伤后确诊“猫抓病”春分“立蛋”成功率更高?记者:伊万改变了国足氛围奥巴马现身唐宁街 黑色着装引猜测

4617作文网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化