本文已参与「新人创作礼」活动,一起开启创作之路。
unity推出了最新的输入系统Input system,不敢说一定比老版本Input manager好。键盘输入的话,个人觉得还是老的输入系统好,不过如果是Xbox手柄的话,个人认为新系统坐实舒服!就让喜新厌旧的我带大家看看吧哈哈
这里是官方英文文档
首先,确保你的项目是Unity 2019.1以上版本, 并且API设置为 .NET 4 runtime( 2021/1/23更新)
然后导入package:windows->package manager 然后选择Unity Registry Advanced中选中Show preview packages 之后你可以寻找或者自主搜索Input System,右下角会显示download,下载完毕后import即可(我已经导入过了所以这里只显示remove(移除)) 点击确定后让unity重启(2021/1/23更新)
Tip:记得检查一下你的Edit->Project Settings->Player->Other Settings->Active Input Handing,它默认应该是Both(即两种都可用),你只要保证它不是Input Manager(Old)即可 (现在导入input system后会自动改为Input SystemPackage)
以前应该是自动创建的,现在需要点一下才能创建setting asset(我点过了,没这个图了……下图是另找的)(2021/1/23更新) (2021/1/23更新)
Property | 介绍 |
---|---|
Default Deadzone Min | 盲区的最小值,输入值小于该值就会被认为为0(这是为了防止无意的输入) |
Default Deadzone Max | 盲区最大值,输入值大于该值则被认为是1(有些设备不会一直返回最大值,设置它可以帮助保持) |
Default Button Press Point | 针对有按钮的设备,这代表它们需要被按住多长时间,系统才能认为它们已被按下 |
Default Tap Time | 针对触摸屏,同样代表它们需要被按住多长时间,系统才能认为它们已被按下 |
Default Slow Tap Time | 默认的慢点击时间. |
Default Hold Time | 默认的持续按住的最短时间 |
Tap Radius | 在触摸屏上,两个手指点击之间的最大距离,系统认为这是同一触摸点击,而不是更多. |
Multi Tap Delay Time | 两次点击之间的最小时延(也是给触摸屏用的) |
下面就是在场景中创建一个物体(我选Capsule胶囊),然后给它命名为player,再给它添加Rigibody和player Input组件 (点Create Actions会创建一个unity已做好的Action模板,模板很全面,很有参考价值) (2021/1/23更新)
在project窗口下右键create->InputActions,做个重命名(此处命名为InputControl)
双击打开->Add Control Scheme->重命名Scheme Name->点击加号寻找操作系统XboxController->save
好了,现在你可以开始进行按键设置了: 添加动作集和相应动作,以player map以及其movement移动为例: 先将movement的属性Action type 由默认的Button改为Pass through或Value;然后更改Control Type为Vector2(因为一般移动只有四个方向,二维的,Vector2正合适)
(2021/1/23更新)
Action Type | 解释 |
---|---|
Value | 当你绑定了多个输入设备。如果你在同一时间内,只希望有一个输入设备在使用,就选这个(如果选了这个,并且在同一时间使用了两个输入设备,unity就只认输入值大的那个) |
Pass through | 当你绑定了多个输入设备。如果你在同一时间内,还想处理多个输入设备的输入值,选这个 |
Button | 顾名思义,只要是按键就选这个(用键盘的话,基本上就是这个了) |
右键movement,Add 2D Vector Composite添加2D操作内容 (也可Add Binding,然后直接绑定遥感即可,自动就是二维的了)
将2D Vector 的Mode改为Analog,这样可以完美发挥摇杆输入是浮点数的优势(当然,这一步并不是必要的) 然后选中movement下的Binding,在右边path处:GamePad->Xbox Controller->Left Stick->Up(当然你想选右边的right Stick也可以,就是玩着可能有点别扭哈哈) 不过我个人更喜欢用listen功能,在已经连接手柄的情况下,点击后可以你只需要上推一下左边的摇杆,下面就直接显示出来了,省劲。 剩下的三个如法炮制…… 好了,设置完毕,下面是最重要的事情:保存!Save!SaveAsset!(重要的事情说三遍) 如果你选中了Auto-Save,那当我没说哦。(不过你可能会跟我一样每次操作都会卡一下,不说卡到怀疑人生,但就是恶心哈哈,可能这就是低配电脑的命吧……)
将刚才设置好的InputControl加到胶囊胶囊体的Actions上,其他内容默认即可(2021/1/23更新)
下面就是代码了,将这个脚本也挂上去就可以咯 注意最上面要有:
using UnityEngine.InputSystem;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
private bool grounded; //判断是否在地面上
private Vector2 moveValue;
public float moveSpeed =3f; //移动速度
private void Update()
{
transform.Translate(new Vector3(moveValue.x,0,moveValue.y)*moveSpeed*Time.deltaTime);
}
void OnMovement(InputValue value) //用这个方法来响应你的输入
{ //你是否也发现了它和InputControl中Actions里的名字很像呢?
moveValue = value.Get<Vector2>();
Debug.Log(value.Get<Vector2>()); //在console窗口显示你的输入值
}
void OnJump() //附赠的跳跃方法哈哈
{
if (grounded)
{
GetComponent<Rigidbody>().velocity += new Vector3(0, 5, 0);
grounded = false;
Debug.Log("I am Pressing Jump");
}
}
private void OnCollisionEnter(Collision collision)
{
grounded = true;
}
}
聪明如你是不是已经发现了方法名称和Actions有什么联系了呢?
你是不是还想知道跳跃是怎么设置的?如下添加Action和binding就行咯:
是不是比movement简单多了?
现在你可以按照自己的创意玩转新输入了!!!