InputSystem实操教程
1.前言
在上一篇文章当中我们手把手的跟大家分享了InputSystem的基础操作(如何使用5种不同的方式获取到InputSystem种的输入检查信息)。那么接下来我们继续分享一下在我们获取到InputSystem输入信息后,如何使用检测到的信息实现我们对应的输入功能。
本次我们使用的Unity编辑器版本为2021.3LTS(如使用不同版本可能存在操作界面不同的情况)。
如果觉得图文教程不够详细的朋友可以移步到【InputSystem实操教程】观看视频教程。
2.多种输入信号获取
上篇文章的分享当中我们学习了5种不同的输入检测调用方式,我们本次分享主要会以脚本调用来完成功能的实现(不了解的朋友可以翻回上一篇文章查看一下 - 【InputSystem基础教程】)。
2-1.PC端-鼠键
在安装好InputSystem之后我们先在项目中创建InputActions。
创建InputActions成功后双击打开InputActions编辑页面,创建一个ActionMaps命名为PC,之后再创建Map中对应的几个Actions分别命名为Move,CameraControl,Jump。
Move,CameraControl的Action Type选择Value, Control Type为返回值类型选择Vector2。
在MoveAction的输入绑定中我们需要进行以下操作
选择方向键混合绑定
之后在每个方向检测上绑定对应的输入检测方式,每次变更完InputAction后记得点击Save Asset保存(或者勾选右侧的Auto Save自动保存)
此处Jump和CameraControl的输入检测绑定大同小异,如有不清楚的可以查看 日醉夜的狗-【Unity】InputSystem教程系列 视频内有更详细的绑定教程与分享。
创建好的InputActions后,我们可以在InputActions属性面板中找到Generate C# Class并勾选,随后点击Apply生成对应的脚本,之后我们就可以在我们自己写的PlayerController 类中调用该脚本了
万事俱备之后我们就需要开始写代码了
PC脚本调用初始化
在获取我们对应输入检测前需要先写一些初始化的脚本
using UnityEngine;
using UnityEngine.InputSystem;
public class RPGController : MonoBehaviour
{
public RPGInputActions rpgInputActions;
private void Awake() {
//实例化我们刚刚生成的rpgInputActions脚本
rpgInputActions = new RPGInputActions();
}
void OnEnable()
{
//使用前需要将该rpgInputActions开启
rpgInputActions.PC.Enable();
}
void OnDisable()
{
//使用完需要将该rpgInputActions关闭
rpgInputActions.PC.Disable();
}
//Update生命周期函数
private void Update() {
}
}
PC获取Move Action输入
//将获取Move输入方法写在Update方法中逐帧调用
private void Update() {
getMoveInput();
}
//获取Move输入方法
private void getMoveInput(){
//将读取到的Move返回值赋值给moveVector2
Vector2 moveVector2 = rpgInputActions.PC.Move.ReadValue<Vector2>();
//判断是否有按下对应的Move按键
if (moveVector2 != Vector2.zero) {
//将获取到的返回值打印出来
Debug.Log(moveVector2);
}
}
PC获取Jump Action输入
//将获取Jump输入方法写在Update方法中逐帧调用
private void Update() {
getJumpInput();
}
//获取Jump输入方法
private void getJumpInput(){
//将读取到的Jump返回值赋值给isJump
bool isJump = rpgInputActions.PC.Jump.IsPressed();
//判断是否有按下对应的Jump按键
if (isJump) {
//将获取到的返回值打印出来
Debug.Log(isJump);
}
}
PC获取CameraControl Action输入
//将获取CameraControl输入方法写在Update方法中逐帧调用
private void Update() {
getCameraControlInput();
}
//获取CameraControl输入方法
private void getCameraControlInput(){
//将读取到的CameraControl返回值赋值给cameraOffset
Vector2 cameraOffset = rpgInputActions.PC.CameraControl.ReadValue<Vector2>();
//判断是否有鼠标是否有产生偏移
if (cameraOffset != Vector2.zero) {
//将获取到的鼠标偏移值打印出来
Debug.Log(cameraOffset );
}
}
将我们上面写好的脚本挂载到对应的游戏对象上,点击开始在项目运行时我们就可以通过刚刚绑定在Action上的按键触发我们写好的输入检测获取方法了。
2-2.主机端-手柄
待更新…
2-3.移动端-触摸屏
我们要获取移动端触摸屏输入检测的话可以通过两种方式
在获取之前我们需要做几个对应的准备工作
PC鼠标模拟触控
使用PC上鼠标模拟触摸屏上点击实现模拟触控(仅能模拟单指触控)
我们需要点击Window=>Analysis =>Input Debugger
打开Debugger视窗之后点击左上角的Options选择Simulate Touch Input
添加新输入设备检测后可以看到输入设备栏中从原本只有鼠键两种检测新增多了一个模拟触摸屏,这就代表成功了。
之后我们使用鼠标点击就相当于模拟我们手指在触摸屏上点击的效果
Unity Remote 真机触控
使用Unity Remote 实现真机触控(实机模拟完全真实)
这篇文章中有详细的 Unity Remote使用教程
3.功能实现
既然我们可以获取到不同硬件设备的输入检测时,我们接下来就要将检测到的输入信号和我们实际的执行方法关联在一起,实现我们项目中的具体功能。我们具体功能的实现会以PC端鼠键输入检测为例。
3-1.键盘控制角色移动
根据上述2-1章节中PC端鼠键检测的操作,我们可以通过键盘的WASD或者小键盘的方向键获取到一个类型为Vector2的返回值。接下来我们将该方法进行一个小改动实现角色移动的功能。
public class RPGController : MonoBehaviour
{
public RPGInputActions rpgInputActions;
//声明一个移动速度属性初始值可以自行安排,我这里给个2
private float moveSpeed = 2f;
private void Update() {
getMoveInput();
}
private void getMoveInput(){
//将读取到的Move返回值赋值给moveVector2
Vector2 moveVector2 = rpgInputActions.PC.Move.ReadValue<Vector2>();
//因为我们的playerMove会在Update生命周期函数中逐帧执行,所以在执行前需要判断是否有按下对应的按键
if (moveVector2 != Vector2.zero) {
//使用获取到的Vector2返回值作为角色移动的参数
transform.Translate(new Vector3(moveVector2.x,0,moveVector2.y)*Time.deltaTime*moveSpeed,Space.World);
}
}
}
在该代码中我们实现了通过Move输入检测来控制角色移动那么我们来一点小小的优化让代码更加简洁
public class RPGController : MonoBehaviour
{
public RPGInputActions rpgInputActions;
//声明一个移动速度属性初始值可以自行安排,我这里给个2
private float moveSpeed = 2f;
//表达式用于初始化moveAxis获取rpgInputActions.PC.Move的返回值赋值给moveAxis
private Vector2 moveAxis => rpgInputActions.PC.Move.ReadValue<Vector2>();
private void Update() {
getMoveInput();
}
private void getMoveInput(){
//因为我们的playerMove会在Update生命周期函数中逐帧执行,所以在执行前需要判断是否有按下对应的按键
if (moveAxis!= Vector2.zero) {
//使用moveAxis作为角色移动的参数
transform.Translate(new Vector3(moveAxis.x,0,moveAxis.y)*Time.deltaTime*moveSpeed,Space.World);
}
}
}
3-2.键盘控制角色跳跃
在我们通过键盘的空格键获取到一个类型为bool的返回值。接下来我们就使用该返回值实现角色跳跃的功能。
public class RPGController : MonoBehaviour
{
public RPGInputActions rpgInputActions;
//获取对象刚体用于实现跳跃功能时给其施加一个向上的力
public Rigidbody playerRigidbody;
//表达式用于初始化isJump 获取rpgInputActions.PC.Jump是否有按下赋值给cameraOffset
private bool isJump => rpgInputActions.PC.Jump.IsPressed();
private void Update() {
getJumpInput();
}
private void getJumpInput(){
if (isJump) {
//判断Jump输入设备被按下时给游戏刚体施加一个向上的力实现跳跃的效果
playerRigidbody.AddForce(Vector3.up * 5);
}
}
}
3-3.鼠标控制视角转动
在我们通过鼠标偏移获取到一个类型为Vector2的返回值。接下来我们就使用该返回值实现控制镜头的功能。
public class RPGController : MonoBehaviour
{
public RPGInputActions rpgInputActions;
//获取围绕旋转对象的Transform
public Transform targetFollowTransform;
//获取需要控制旋转的相机Transform
public Transform cameraTransform;
//表达式用于初始化moveAxis获取rpgInputActions.PC.CameraControl的返回值赋值给cameraOffset
private Vector2 cameraOffset => rpgInputActions.PC.CameraControl.ReadValue<Vector2>();
private void Update() {
getCameraControlInput();
}
private void getCameraControlInput(){
{
//判断获取cameraControl的输入设备是否触发偏移值
if(cameraOffset != Vector2.zero){
//控制相机以targetFollowTransform对象为中心围绕世界坐标垂直轴进行水平旋转,旋转角度为cameraOffset水平方向返回的偏移值
cameraTransform.RotateAround(targetFollowTransform.position, Vector3.up, cameraOffset.x);
//控制相机以targetFollowTransform对象围绕相机自身水平轴进行垂直旋转,旋转角度为cameraOffset垂直方向返回的偏移值
cameraTransform.RotateAround(targetFollowTransform.position, cameraTransform.right, -cameraOffset.y);
}
}
}
}
3-4.鼠标控制角色移动
在我们通过鼠标点击地图获取到对应的坐标实现角色的移动。
待更新…
4.总结
以上就是我们InputSystem一些实用技巧的分享,如果觉得图文分享不够详细可以点击链接 日醉夜的狗-【Unity】InputSystem教程系列 观看更详细的视频分享哦!另外还有更多详细实用的教程系列视频在我的Unity中文课堂频道 欢迎大家一起来学习!