【Unity InputSystem】实用指南:在PC端(鼠标与键盘)、手机端(触摸屏)、主机手柄上同步实现角色移动与跳跃功能

这篇具有很好参考价值的文章主要介绍了【Unity InputSystem】实用指南:在PC端(鼠标与键盘)、手机端(触摸屏)、主机手柄上同步实现角色移动与跳跃功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前引

随着Unity的不断发展,开发者对于项目的输入系统要求也日益提高。在进行多平台适配和跨平台移植时,常常需要改变输入系统,这给开发者带来了不少困扰。而Unity官方推出的InputSystem插件,则是为了解决这一问题而推出的全新输入方式。
相较于旧版的InputManager,InputSystem的操作虽然更为繁琐复杂,但在应对跨平台项目时,面对不同的输入方式,InputSystem的输入映射机制为开发者提供了巨大的便利。因此,学习InputSystem成为必要之举。


正文

PC端-键鼠🐀

创建PC对应的键鼠InputActions

在安装好InputSystem之后我们先在项目中创建InputActions,如下所示:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧


创建InputActions成功后双击打开InputActions编辑页面,创建一个ActionMaps命名为PC,之后再创建Map中对应的几个Actions分别命名为Move,CameraControl,Jump:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧


Move,CameraControl的Action Type选择Value, Control Type为返回值类型选择Vector2:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧


在MoveAction的输入绑定中我们需要进行以下操作 选择方向键混合绑定:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧


之后在每个方向检测上绑定对应的输入检测方式,每次变更完InputAction后记得点击Save Asset保存(或者勾选右侧的Auto Save自动保存):

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

创建好的InputActions后,我们可以在InputActions属性面板中找到Generate C# Class并勾选,随后点击Apply生成对应的脚本,之后我们就可以在我们自己写的PlayerController 类中调用该脚本了:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

万事俱备,只欠代码!


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上的按键触发我们写好的输入检测获取方法啦:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧


功能实现

既然我们可以获取到不同硬件设备的输入检测时,我们接下来就要将检测到的输入信号和我们实际的执行方法关联在一起,实现我们项目中的具体功能。我们具体功能的实现会以PC端鼠键输入检测为例。

键盘控制角色移动

根据上述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.x和Vector2.y返回值作为角色移动的参数
            playerMove(moveVector2.x,moveVector2.y);
        }
    }  
    //使角色真正移动的方法
    private void playerMove(float horizontal,float vertical){
        transform.Translate(new Vector3(horizontal,0,vertical)*Time.deltaTime*moveSpeed,Space.World);
    } 
}

来一点小小的优化让代码更加简洁:

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) {
            //使用获取到的Vector2.x和Vector2.y返回值作为角色移动的参数
            playerMove(moveVector2.x,moveVector2.y);
        }
    } 
    //使角色真正移动的方法
    private void playerMove(float horizontal,float vertical){
        transform.Translate(new Vector3(horizontal,0,vertical)*Time.deltaTime*moveSpeed,Space.World);
    } 
}
键盘控制角色跳跃

在我们通过键盘的空格键获取到一个类型为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输入设备被按下时给执行跳跃方法
            playerJump();
        }
    }
    //给刚体施加一个向上的力使角色模拟跳跃的效果
    public void playerJump(){
        playerRigidbody.AddForce(Vector3.up * 5);
    }
}
鼠标控制视角转动

在我们通过鼠标偏移获取到一个类型为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);
            }
        }
    } 
}

主机端-手柄🎮

创建主机对应的手柄InputActions

绑定MoveAction的触发操作

柄控制MoveAction的输入绑定中我们需要进行以下操作 选择普通的绑定即可:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

绑定操作设备选择手柄Gamepad:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

因为我们Move动作选择的返回值类型为Vector2所以手柄这里默认的触发行为默认的有三个D-Pad坐标方向键, Left Stick左摇杆, Right Stick右摇杆)根据我们喜好选择Gamepad上的触发操作(一般是选择左摇杆来控制移动):

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

绑定JumpAction的触发操作

在手柄控制JumpAction的输入绑定中前两步的选择都是一样
1.在JumpAction上点击+号选择普通的绑定即可
2.绑定操作设备选择手柄Gamepad
3.选择右边方向键的西边按键(因为不同厂商的右边方向键显示不同,所以用东南西北方向来表示):

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

绑定CameraControlAction的触发操作

在手柄控制CameraControlAction的输入绑定中前两步的选择都是一样
1.在CameraControlAction上点击+号选择普通的绑定即可
2.绑定操作设备选择手柄Gamepad
3.选择右摇杆(也可以根据自己喜欢选择其他触发操作):

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

功能实现

在手柄上的功能实现因为我们用的都是同一套的InputAction,所以我们只需要完成上述绑定手柄的对应Actions触发即可。 这里因为我们在PC端键鼠小节的时候已经把对应的脚本写好了,这里我们就不需要重新再写脚本了(这就是InputSystem区别于旧版InputManager最大的优势无需重新写代码)点击开始在项目运行时我们就可以通过刚刚绑定在Action上的按键触发我们写好的输入检测获取方法了。

移动端-触摸屏触摸屏📱

我们要获取移动端触摸屏输入检测的话可以通过两种方式 在获取之前我们需要做几个对应的准备工作:

PC鼠标模拟触控

使用PC上鼠标模拟触摸屏上点击实现模拟触控(仅能模拟单指触控)

我们需要点击Window=>Analysis =>Input Debugger:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧


打开Debugger视窗之后点击左上角的Options选择Simulate Touch Input:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

添加新输入设备检测后可以看到输入设备栏中从原本只有鼠键两种检测新增多了一个模拟触摸屏,这就代表成功了。


功能实现

触摸屏控制角色移动

在我们的上述章节当中其实已经实现了PC端和主机端物体移动,接下来我们完成以下几步即可实现移动端触摸屏的物体移动功能。

将虚拟摇杆中获取到的Vector2返回值作为参数赋值到我们移动方法:

public class RPGController : MonoBehaviour
{
    public Joystick moveJoystick;
    private float moveSpeed = 2f;
    //Update生命周期函数
    private void Update() {
        getTouchScreenMove();
    }
    private void getTouchScreenMove(){
        //使用获取到的虚拟摇杆Joystick的Horizontal和Vertical返回值作为角色移动的参数
        playerMove(moveJoystick.Horizontal,moveJoystick.Vertical);
    }
    //使角色真正移动的方法
    private void playerMove(float horizontal,float vertical){
        transform.Translate(new Vector3(horizontal,0,vertical)*Time.deltaTime*moveSpeed,Space.World);
    }
}

将刚刚写的公共JoyStick变量进行绑定 3.完成上述两步,我们移动端的触摸屏虚拟摇杆触发物体移动功能就完成了:

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

触摸屏控制角色跳跃

1.找到我们的JumpButton组件

2.在Button的属性面板上面找到OnClick绑定

3.将挂载了我们已经写好了功能实现脚本的对象拖动挂载到OnClick上面

4.找到写好的跳跃方法进行绑定

unity 设置鼠标模拟触屏,YF的Unity世界,unity,游戏引擎,插件,科技,使用技巧

触摸屏控制视角转动

在触摸屏上上述两种功能实现因为是用到了虚拟按钮没有使用到InputAction的触发绑定,所以需要完成以上两个小节才可以实现对应的具体功能。 但在视角旋转上面的触发操作我们是绑定了InputAction的,所以我们和前文手柄的功能实现一样无需做额外的操作即可实现对应的视角转动功能。

完成上述脚本编写和绑定CameraControl在触摸屏上触摸为触发操作以触发两帧之间的偏移值为返回值。那么我们在触摸屏上进行滑动触摸便可以进行视角的转动。

触摸屏触控操作优化

由于我们是在触摸屏上进行操作触发,上述流程虽然可以完成单独的功能实现,但在进行多点触控时可能会出现触发误判或冲突(例如,物体移动和视角转动功能之间存在冲突)。尽管移动功能是通过虚拟摇杆触发的,但同时触摸屏幕也可能触发视角转动功能。因此,我们需要对脚本进行升级,以区分触发的功能。

using UnityEngine.InputSystem;//引用InputSystem包
public class RPGController : MonoBehaviour
{
    public Joystick moveJoystick;
    private float moveSpeed = 2f;
    public GameInputActions gameInputActions;
    public Transform targetFollowTransform;
    public Transform cameraTransform;
    //Update生命周期函数
    private void Update() {
        getTouchScreenMove();
    }
    private void getTouchScreenMove(){
        //使用获取到的虚拟摇杆Joystick的Horizontal和Vertical返回值作为角色移动的参数
        playerMove(moveJoystick.Horizontal,moveJoystick.Vertical);
    }
    //使角色真正移动的方法
    private void playerMove(float horizontal,float vertical){
        transform.Translate(new Vector3(horizontal,0,vertical)*Time.deltaTime*moveSpeed,Space.World);
    }
    //获取CameraControl输入方法
    private void getCameraControlInput(){
        //将读取到的CameraControl返回值赋值给cameraOffset 
        Vector2 cameraOffset = gameInputActions.PC.CameraControl.ReadValue<Vector2>();
        //判断是否有鼠标是否有产生偏移
        if (cameraOffset != Vector2.zero) {
        //     //将获取到的鼠标偏移值打印出来
            cameraTransform.RotateAround(targetFollowTransform.position, Vector3.up, cameraOffset.x);
            cameraTransform.RotateAround(targetFollowTransform.position, cameraTransform.right, -cameraOffset.y);
        }
    }
    //将物体移动方法和视角转动方法都放到该方法内进行统一判定
    private void touchControl(){
        //因为在触摸屏上有多点触发的可能性,因此我们需要获取到每个触发点的顺序
        for(int i=0;i<Input.touchCount;i++){
            //按照触发点的顺序来获取在屏幕上的对应位置进行功能判定
            Vector3 touchPos= Input.GetTouch(i).position;
            //如果触发点在屏幕左半屏即为移动功能触发,我们执行移动方法即可
            if(touchPos.x < Screen.width / 2){
                getTouchScreenMove();
            }
            //如果触发点在屏幕右半屏即为视角转动功能触发,我们执行视角转动方法即可
            if(touchPos.x > Screen.width / 2 && touchPos.y > Screen.height / 2){
                getCameraControlInput();
            }
        }
    }
}

在脚本进行了优化之后我们触摸屏就可以实现左右半屏单点触发对应的功能。

总结

以上就是我们InputSystem在不同设备上的一些实用技巧分享,另外还有更多详细实用的Unity教程系列在我的“YF的Unity世界”频道,欢迎大家一起来学习交流!文章来源地址https://www.toymoban.com/news/detail-839181.html

到了这里,关于【Unity InputSystem】实用指南:在PC端(鼠标与键盘)、手机端(触摸屏)、主机手柄上同步实现角色移动与跳跃功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑端(PC)按键精灵——2.键盘命令和鼠标命令

    注:说命令之前,先说下基本设置 电脑端(PC)按键精灵—小白入门 详细教程 一、设置 如下图,点击设置,脚本格式——可以设置字体等内容 字体变大了 修改文件名,脚本属性 二、简单常用按键 1.注释和取消注释 注释的话前面加“ // ”,取消注释择删掉“ // ” 软件自带

    2024年02月08日
    浏览(46)
  • PC端windows自动化:pywinauto(四)鼠标和键盘操作

    pywinauto自带的鼠标操作有些时候并不能完全满足要求,可以调用mouse的方法 导入: 常见操作:   导入: pywinauto模拟操作键盘,需要使用到 pywinauto.keyboard.send_keys这个方法: ◆ pywinauto.keyboard.send_key 可以通过键盘完成以下操作:全选(ctrl+A) 复制(Ctrl+C) 粘贴(Ctrl+V) 回车(Ent

    2024年02月03日
    浏览(46)
  • python+pyautogui—PC端自动化(二)键盘鼠标及对话框操作

    目录 鼠标操作 获取鼠标所在位置坐标 获取鼠标所在位置的RGB值 鼠标点击 鼠标按下和释放 鼠标移动 鼠标拖拽 滚轮滚动 键盘操作 输入英文字符 普通按键操作press 按下与抬起 组合键hotkey 持续按键hold 弹出对话框 alert confirm prompt password 获取鼠标所在位置坐标 获取鼠标所在位

    2024年02月12日
    浏览(41)
  • unity鼠标键盘交互

    将代码放置在被拖动的物体上   将代码放置在灯上,设置虚拟轴的键盘+-改变数值 将代码放置在空物体上

    2024年02月11日
    浏览(82)
  • Unity鼠标键盘事件

    GetMouseButton(0):按下鼠标左键不动,程序会一直运行,松开左键程序停止运行。 GetMouseButton(2):按下鼠标中键不动,程序会一直运行,松开中键程序停止运行。 GetMouseButton(1):按下鼠标右键不动,程序会一直运行,松开右键程序停止运行。 GetMouseButtonDown(0):按下鼠标左键时,程序运

    2023年04月12日
    浏览(43)
  • 【无标题】苹果手机连接罗技鼠标和蓝牙键盘的设置方法

    苹果手机连接罗技鼠标和蓝牙键盘的设置方法如下:iPhone手机打开鼠标设置的路径:设置——辅助功能——触控——辅助触控(打开) 请按以下步骤操作 第一步:  第二步:  第三步: 第四步: 到这一步以后,屏幕上会出现一个半透明小圆球。同时也可以蓝牙连接鼠标,连

    2024年02月16日
    浏览(236)
  • 【Unity入门】鼠标输入和键盘输入

    一、监听鼠标输入 GetMouseButtonUp 、GetMouseButtonDown、GetMouseButton input.GetMouseButtonDown和 input.GetMouseButtonUp 能够分别监听鼠标的按下和松开事件,GetMouseButton长按响应,值得注意的是,这三个方法需要传入参数,0表示左键,1表示右键,2表示中间键 比如我们可以在代码中这样写,来

    2024年02月03日
    浏览(38)
  • 蓝牙遥控器 – 将手机模拟为键盘、鼠标、翻页笔、遥控器

    简介: 一直在寻找将手机模拟为鼠标和键盘的软件,对于有两部手机的人来说,这会使旧手机变废为宝,将其用作主力机的键盘,用来编辑文档写写东西还是非常方便的,一方面,备用机的整个手机屏幕都是键盘,双手操持打字,速度快很多,另一方面,主力机上面没有了虚

    2024年02月13日
    浏览(42)
  • 【Unity入门】15.鼠标输入和键盘输入

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢   (1) Input类     Unity的 Input类提供了许多监听用户输入的方法 ,比如我们常见的鼠标,键盘,手柄等。我们可以用Input类的接口来获取用户的输入信息     下面我们会调用几个常用的

    2024年02月09日
    浏览(38)
  • Unity Input输入类-鼠标键盘检测

    当你开发Unity游戏时,与用户的输入交互是非常重要的。Unity提供了丰富的输入类来帮助你获取用户的输入,并做出相应的响应。在本文中,我将会向你介绍Unity中的输入类,包括Input、KeyCode、MouseButton和Touch等。 Input类 Input类是Unity中最基础的输入类,它可以获取各种类型的输

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包