文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 前言
- 一、输入系统切换
- 二、两种使用InputSystem的方法
- 1.直接引用
- 2.间接引用
- (1)通过PlayerInput
- (2)通过C#
- Value类
- Button类
- PassThrough类
- 注意
- 总结
前言
Unity InputSystem学习记录
参考:
转载
官方文档
转载
一、输入系统切换 二、两种使用InputSystem的方法 1.直接引用
不需要InputAction,4类的各种按键均有默认值;
代码如下(示例):
private void Update()
{
var gamepad = Gamepad.current;//手柄
var keyboard = Keyboard.current;//键盘
var mouse = Mouse.current;//鼠标
var pointer = Pointer.current;//指针
if (gamepad != null)
{
Debug.Log(gamepad.leftStick.ReadValue());//手柄遥感的偏移
if (gamepad.bButton.wasPressedThisFrame)
Debug.Log("按下B键");
}
if (keyboard != null)
{
//执行顺序 isPressed = false -> 按下:wasPressedThisFrame = true -> 中途:isPressed = true -> 松开:wasReleasedThisFrame = true -> isPressed = false
if (keyboard.wKey.wasPressedThisFrame)
Debug.Log("w键按下(一直按住w键的话,也只执行一次)");
if (keyboard.wKey.wasReleasedThisFrame)
Debug.Log("w键松开");
Debug.Log("是否按住w键:" + keyboard.wKey.isPressed);
}
if (mouse != null)
{
Debug.Log(mouse.scroll.ReadValue());//滚轮的滚动值,向前滚Y的值为正,向后滚为负
if (mouse.leftButton.wasPressedThisFrame)
Debug.Log("按鼠标左键");
if (mouse.rightButton.wasPressedThisFrame)
Debug.Log("按鼠标右键");
if (mouse.middleButton.wasPressedThisFrame)
Debug.Log("按滚轮键");
}
if (pointer != null)
{
Debug.Log(pointer.delta.ReadValue());//与上一帧的偏移
Debug.Log(pointer.position.ReadValue());//在空间中的坐标
}
2.间接引用
创建InputAction, 其中Move,Look是Value(Vector2类型),Jump是Button,Sprint是PassThrough类型;
通过绑定Actions,来获取输入;Behaviors一栏有四种,当为SendMessage/BroadcastMessage时可通过挂在该物体上的脚本的方法回调;
public void OnMove(InputValue value)//形参可为空
{
var v = value.Get<Vector2>();
//Todo
}
public void OnJump(InputValue value)//Button;形参可为空,按下为ture;松开不会变成false;
{
var v = value.isPressed;
//Todo
}
public void OnSprint(InputValue value)//PassThrough;形参可为空,按下为ture;松开会变成false;
{
var v = value.isPressed;
//Todo
}
当为UnityEvent时,其他基本相同,回调参数改变
public void OnMove(InputAction.CallbackContext context)
{
var value = context.ReadValue<Vector2>();
//Todo
}
(2)通过C#
Apply后,自动生成脚本(生成的文件名和类名可能不一致,如果你改名字的话);通过其他脚本来调用;
private StarterInput StarterInput;
private void OnEnable()
{
if (StarterInput == null)
{
StarterInput = new StarterInput();
//Todo
}
StarterInput.Enable();
}
private OnDisable()
{
StarterInput.Disable();
}
Value类
如move;要在Update里读取;
private void Update()
{
var move = StarterInput.Player.Move.ReadValue<Vector2>();
}
Button类
如jump;回调有顺序 started=>performed=>canceled,在按下期间(started,performed)ReadValueAsButton始终为true;松开后(canceled)ReadValueAsButton为false;
如果想达到按下变true然后马上变回false;建议改成isjump=false或者在lateUpdate中设置isJump=false
public bool isJump;
private void OnEnable()
{
StarterInput.Player.Jump.started += ctx => {isJump = ctx.ReadValueAsButton();};
StarterInput.Player.Jump.performed += ctx =>
{//isJump = ctx.ReadValueAsButton();
isJump =false};
StarterInput.Player.Jump.canceled += ctx => {isJump = ctx.ReadValueAsButton();};
}
PassThrough类
如Sprint;PassThrough类不响应started ,canceled 回调,只响应performed 回调,
performed回调;按下ReadValueAsButton变true,松开变ReadValueAsButtonfalse
public bool isSprint;
private void OnEnable()
{
StarterInput.Player.isSprint.performed += ctx =>{isSprint= ctx.ReadValueAsButton();};
}
注意
需要注意的是我们必须手动的设置其Enable和Disable,来启动或关闭InputAction
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)