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
脚本中,然后由Character
的OnCharacterEvent
事件节点,监听对应的操作。
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
进行连击即可触发,下面多连击动作的展示。
- 连击A
- 连击AA
- 连击AAA
基础动画
除了技能动画以外, 还有一些Idle
、Walk
、Jump
等常规动画。本来想沿用技能实现使用Timeline
一套的解决方案,但是总感觉有点不搭。这里还是使用了默认的Animator
让几个基础动画的切换感觉更合理一些。
输入在Input System
中添加movement
的Input 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)设计原型