Unity技能学院——Inputsystem第一期

Posted Unity游戏开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity技能学院——Inputsystem第一期相关的知识,希望对你有一定的参考价值。

RPG 游戏想必大家都不陌生。作为游戏类型中的一大分支,RPG 游戏通常需要玩家控制一个角色去探索剧情、与其他玩家互动、与 NPC 交流、猎杀怪物等。

而作为玩家 与游戏交互的输入系统,在整个游戏开发过程中,起着举足轻重的作用。

这篇文章,就将带着读者们,一起初步介绍病探索一下 unity 的输入系统。[文中使用的unity 版本为 2020.3.33,编辑器为 visual studio 2022]

目前 unity 中存在 2 套不同的输入系统,一直以来使用的默认输入系统,以及近几年推 出的 InputSystem。接下来将分别介绍这 2 种输入系统,并简单阐述优缺点。

本篇介绍重点

1.unity 默认输入系统的简介

2.InputSystem的入门介绍

一、unity 默认输入系统的简介

unity 默认输入系统上手十分简单,对于没有复杂需求的情况下,使用起来非常方 便,也推荐初学者去使用。接下来我们来简单看一下,unity 默认输入系统是如何使用的

我们给 MainCamera 挂载一个 InputTest 脚本,在 InputTest 类的 Updaet 函数中添加 如下代码:

代码十分好理解,也很直观。Input.GetKeyDown()函数会去判断游戏运行时,用户是否摁下了某个按键。

传入的参数就如代码所示,当我们分别摁下 w/a/s/d 的时候就 会打印对应的日志。如下:

类似的我们可以通过

Input.GetMouseButtonDown(...) 获取鼠标事件;

Input.GetTouch(...)可以接收移动端的触屏事件;

Input.GetButtonDown(...)获取其他外设的输入。

如果我们想要实现摁下 wasd 操作物体移动,那么直接修改这里的 Debug.Log,改成自己实现的物体移动函数,就能够完成物体移动。

如果同学们对角色移动感兴趣,可以在添加助教老师微信咨询讨论,后续也会考虑专门针对移动出一篇详细的技能教程。这里主要介绍输入系统,就不再详细演示了。

Unity 这种默认输入系统优点很明显,使用方便、上手简单、也很直观。

不过在遇 到大项目时,也有比较显著的缺点。它会嵌套在每个控制文件中,导致项目耦合度高。遇见需要切换输入场景时(从角色控制切换到聊天输入),也需要自己去写代码控制。

因此,就出现了 InputSystem 这样一个,更符合大项目需求的低耦合、易于调试、 方便切换、跨平台、跨设备的输入系统,就诞生了。接下来,我们介绍一下 InputSystem的使用。

二、初探 InputSystem

1、安装

要安装 InputSystem,首先要找到菜单栏中的 Window->Package Manager,打开之后,找 到 InputSystem,点击 Install,完成安装。

随后会弹出对话框,询问你“是否用 InputSystem 来替换 unity 默认的输入系统”,我 们点击 Yes 即可。

随后等待 unity 重启后,就完成了 InputSystem 的安装。如果没有弹窗,也可以自行修 改项目设置,具体位置在 Edit -> Project Setting -> Player -> Other Setting -> Active Input Handling:

2、建立 InputActions

安装完之后,我们暂时还不能进行代码编写。我们需要先建立 InputActions 表。

在 Project文件夹中右键 create->Input Actions 创建一个对象,并重命名为 MyActions。

双击打开,我们可以看到下面这个界面:

我们点击 ActionMaps 右侧的加号按钮,添加两个输入控制表分别重命名为 PlayerMove和 UI,他们的作用是对于我们的输入进行分组。这样我们可以很方便的,将输入操作在玩 家移动和 UI 之间进行切换。

在中间一栏,点击 Actions 右侧加号按钮,添加我们自己的 Attack 和 Jump 动作:

我们目标是绑定给 Attack 和 Jump 绑定不同的按钮,并输出日志。接下来我们先点击Attack 旁边的加号,添加按钮绑定。

分别添加 a 和 s 按钮绑定这意味着当我们摁下 a 和s 的时候,都会触发 Attack 事件。同时,我们也为 Jump 绑定空格按钮。有 3 种方式可以绑 定。

第一种是直接选择 Path 中的按钮:

第二种,是在搜索栏中,搜索我们想要的按键。然后仔细筛选,就可以找到我们想要的 按键:

最后一种也是最推荐的方式。我们可以点击 Listen,此时它就会开始监听我们的操作。这时候,我们再摁一下我们想要的按键,系统就会自动显示对应的按钮。比如我们摁下D键:

到这里为止,我们就完成了角色移动的表配置,以及其按键绑定。我们需要将这张表生 成为我们能够使用的代码。我们在点击 Project 中 MyActions 表,在 Inspector 面板中就可以 看到这样的内容:

根据自己的喜好,修改合适的类名和命运空间,点击 apply 按钮,就可以自动生成我们想要的代码:

我们可以看到,在 Project 中就生成了一个代码文件。当然我们不需要去关心代码当中是什么样子的。

我们的目标是,学会如何使用它。

修改 InputTest 的代码,如下:

简单解释一下主要的代码:
第 7 行声明了 MyActions 变,并在函数中的第 11 行 new 了一下。
第 12 行和第 20 行,分别调用了 enable 和 disable 函数。这两个函数,通常要承兑的出现。

而最主要的输入响应函数,就是第 14 行和第 15 行。Performed 是一个委托,他在对应的按钮被摁下是,会激活 performed 委托。

因此我们给 performed 委托添加我们需要调用的 函数,来输出日志。运行一下,进行测试:

这篇文章,对 Unity 的 InputSystem 系统,进行了初步的探索和简单的介绍。在初步了 解了它的使用后,后续也将对 InputSystem 的使用进行更为深入的探索和更贴合实际项目的应用。

各位同学敬请关注!

Unity实现动作游戏的技能系统(Ability System)设计原型

前言

尝试写一个技能系统,希望其尽量完善。目前能想到的元素包括控制、模型、动画、音效、特效、碰撞检测、事件响应、伤害判断、Buff控制。集所有元素为一个编辑器,方便策划和美术进行操作。

输入控制

使用Input System作为跨平台接收输入响应,然后整合到Character脚本中,然后由CharacterOnCharacterEvent事件节点,监听对应的操作。

public void AddActionStarted(string actionName,Action<InputAction.CallbackContext> callback)

   GetInputAction(actionName).started += callback;

public void AddActionPerformed(string actionName, Action<InputAction.CallbackContext> callback)

   GetInputAction(actionName).performed += callback;

public void AddActionCanceled(string actionName, Action<InputAction.CallbackContext> callback)

   GetInputAction(actionName).canceled += callback;



private InputAction GetInputAction(string actionName)

   var action = _inputCharacterGamePlay.FindAction(actionName, throwIfNotFound: true);
   return action;

技能编辑

使用Timeline作为一个整合工具,可以添加动画特效音效物体控制扩展脚本集成为一个技能,并可以在Scene中随时进行预览。具体操作可以参考官方教程。

扩展了一个PlayableAsset作为Combo触发条件,为连击动画的衔接尽量合理而规定了一定的触发范围。

角色编辑器

在编辑了多个技能后,肯定需要一个角色编辑器来统筹所有的技能。规范技能播放的规则,进行碰撞检测等一系列操作,打通角色的操作的逻辑。
这里的Character是通过继承ScriptableObject实现的,方便保存角色的系列信息,并扩展了一个CharacterEditor,用来编辑保存角色的一些属性、技能、以及控制逻辑。

技能触发

在角色编辑器中创建OnCharacterEvent节点,然后创建一个Skill节点,连接即可触发技能播放。事件支持Input System触发,直接输入Input Action的名称,就可以获取当前的输入返回的参数。

若当前技能需要技能效果,则利用Timeline创建多个技能,通过OnCombo进行连击即可触发,下面多连击动作的展示。

  1. 连击A
  2. 连击AA
  3. 连击AAA

基础动画

除了技能动画以外, 还有一些IdleWalkJump等常规动画。本来想沿用技能实现使用Timeline一套的解决方案,但是总感觉有点不搭。这里还是使用了默认的Animator让几个基础动画的切换感觉更合理一些。

输入在Input System中添加movementInput Action使用Vector2作为返回值, 键盘WASD、xbox的摇杆、以及移动端的虚拟摇杆都可以映射为一个Vector2的值,方便进行角色的控制。

基础动画的展示

碰撞检测

这里我主要在角色的大刀上绑定了一个碰撞盒子,并结合Timeline在技能施放动画的一定区间范围内开启碰撞盒子,方便让攻击的碰撞更为合理。并且在编辑器里面添加了一个创建测试的敌人的快捷按钮Create Enemy

在检测的碰撞的同时,可以获取当前角色正在施放的技能信息。即可对敌人进行,伤害判定,播放受击动画,以及添加BUFF或者DEBUFF。
因为连击技能也是一个个单独的技能,每个连击动作都有自己的单独属性,都可以根据不同的连击动画,给敌人造成更高的伤害。

敌人受击展示

BUFF系统

Buff主要是一个以计时器驱动的角色属性持续修改的状态。它本身包括的东西很多,除了就能修改角色自带的那一部分属性,还可以对角色进行一些其他操作,比如无敌击飞击退沉默恐惧嘲讽禁锢等等。

因为Buff的重复使用率非常高,这里会建立一个Buff池,在角色收到一个技能攻击的时候,会从Buff Pool中取出一个Buff并对其进行初始化,然后遍历当前角色的所有Buff,并根据Buff的基本信息,确定其中的优先级,然后执行对应的逻辑。在计时结束的时候,会回收给Buff池。
Buff持续存在的时间段中,角色的实时属性,有基础属性+Buff的各种因子综合而来。

未完待续

根据具体的需求,一个技能系统的复杂程度远不止于此。当前很多东西,还没设计完善,都还是针对点的说明,后续持续修改更新。
这篇博客在这里也算抛砖引玉了。

以上是关于Unity技能学院——Inputsystem第一期的主要内容,如果未能解决你的问题,请参考以下文章

100个 Unity实用技能| Unity InputSystem中拿到触摸屏幕的坐标,鼠标的坐标等

100个 Unity实用技能☀️ | Unity InputSystem中拿到触摸屏幕的坐标,鼠标的坐标等

Unity实现动作游戏的技能系统(Ability System)设计原型

Unity实现动作游戏的技能系统(Ability System)设计原型

Unity实现动作游戏的技能系统(Ability System)设计原型

Unity——InputSystem入门及部分问题讲解