Unity对于手柄的支持

今天来谈谈关于Unity手柄的支持

一、首先我们先要搞清楚从哪开始进行控制:

二、接着来看看它里面的属性:

Name:【按键名】该键的名称,可以在脚本编程中直接引用他。比如:Input.GetButtonDown(“Jump”);

Descriptive Name:【描述名】在游戏的独立机构中的配置对话框中,当控制值为正时候所显示的名称。默认空白。

Negative Descriptive Name:【负描述】在游戏的独立机构中的配置对话框中,当控制值为负的时候所显示的名称。

Nagative Button:【负向按钮】玩家按下这个按钮来让被控制物体向负方向运动。

Positive Button:【正向按钮】玩家按下这个按钮让被控制物体向正方向运动。

Alt Negative Button: 玩家可以使用的备选负向按钮,比如方向键和WASD

Alt Positive Button:玩家可以使用的备选争相按钮。

Gravity:【重力】如果玩家停止输入,该轴将恢复到空挡或0速度,其单位为单位每秒。

Dead:【盲区】可以用在模拟控制。在模拟控制器上,在这个范围内的任何值都会映射到空档不会提供任何输入。

Sensitivity:【灵敏度】可以用于数字控制,他是该轴向给定得值移动的速度。正负都可,单位为单位每秒。

Snap:【对齐】如果选中,可以确保在同时按下正向和负向按钮时候该轴的值为空挡。

Invert:【反转】迅速交换正向和负向控制键。

Type:【类型】该键对应的输入设备类型。可以为Key,MouseButton,MouseMove,JoystickAxis,或Window Movement。

Axis:【轴】这个控制方式有该输入设备的哪条轴指挥。这可受不同游戏手柄影响。

JoyNum:【操作杆编号】多个操作杆在机器上市后,决定哪个哪个操作杆控制给定的轴。可以选择从所有的操作杆接受输入,或是为其制定一个特定的。

三、Input类的实现方式:

GetAxis();返回制定轴得值。

GetButton():如果制定的按钮按下,返回True。

GetKey():如果制定按键按下返回True。

GetMouseButton():制定鼠标按钮按下返回True。

ResetInputAxis():使用这个函数可以重置虽有输入,并把他们护肤到空挡或0.

anyKey:任意键按下返回True。比如:按任意键继续。

MousePisition:使用向量来保存鼠标在屏幕上当前位置。屏幕左下角映射为(0,0);

四、OK,了解了从哪控制后,那么现在开始我们就要实现怎么控制它!

这里我们以市面上常用的北通手柄为例,来进行探讨:

如图,是手柄上所有键位介绍,那么接下来我们就开始测试这些键位在Unity中都是对应的哪些值,不多说,直接上代码

using UnityEngine;
using System.Collections;
using System;
 
 
/// <summary>
/// 测试游戏手柄键值
/// </summary>
public class PlayerJoystickClass : MonoBehaviour
{
    private string currentButton;//当前按下的按键
 
    // Use this for initialization 
    void Start()
    {
 
    }
    // Update is called once per frame 
    void Update()
    {
        var values = Enum.GetValues(typeof(KeyCode));//存储所有的按键
        for (int x = 0; x < values.Length; x++)
        {
            if (Input.GetKeyDown((KeyCode)values.GetValue(x)))
            {
                currentButton = values.GetValue(x).ToString();//遍历并获取当前按下的按键
            }
        }
    }
    // Show some data 
    void OnGUI()
    {
        GUI.TextArea(new Rect(0, 0, 250, 40), "Current Button : " + currentButton);//使用GUI在屏幕上面实时打印当前按下的按键
    }
}

将测试出来的键值打印到面板上面
测试出来的结果如下:

LT/L2:JoystickButton8
RT/R2:JoystickButton9
LB/L1:JoystickButton6
RB/R2:JoystickButton7
A:JoystickButton0
B:JoystickButton1
X:JoystickButton3
Y:JoystickButton4
Back:JoystickButton10
Start:JoystickButton11
Menu:JoystickButton12
左轴按下:JoystickButton13
右轴按下:JoystickButton14

五、现在键值都出来了,那接下来的事情就简单多了,Unity获取对按键的处理无非就这几种:

  1         if (Input.GetKey(KeyCode.A))
            {
                //获取到键后的操作
            }
  2       if (Input.GetKeyDown(KeyCode.A))
            {
                //获取到键并按下后的操作
            }
  3         if (Input.GetKeyUp(KeyCode.A))
            {
                //获取到键并抬起后的操作
            }

在此强烈建议使用第三种,因为本人亲测前两种或触发多次操作,很蛋疼

六、上面的只是介绍了按键的操作,但是这是手柄呀,他是有摇杆的,那么这些轴需要怎么操作呢,别急,接下来我们就开始收拾他

北通手柄上面的轴有四处(以上面的图片为例)

轴向比较特殊,需要自己进行添加设置(Unity中的轴向一般都是水平和垂直轴)

 

1、左轴

2、右轴

3、十字键轴

4、LT/L1/RT/R1所在的轴

现在知道这些轴向了,直接使用API方法

因为Input.GetAxis("")返回的是一个(-1,1)的范围值,所以我们根据这个值可以判定按键的方向

if (Input.GetAxis("自定义的轴向名字") > 0 && Input.GetAxis("自定义的轴向名字") < 1)
        {
            //此处是轴向为正向时的操作
        }
if (Input.GetAxis("自定义的轴向名字") < 0 && Input.GetAxis("自定义的轴向名字") > -1)
        {
            //此处是轴向为负向时的操作
        }

七、自我小结:

 在适配手柄操作时,主要的注意点就是按键值和轴向的匹配,不同的手柄有时对应的键值也会不一样,所以各位看官,上述的只是一个参考,具体的还需要以你项目中使用的实际手柄为准,最好是能准备几套方案已做到更好的玩家体验!

### 如何在 Unity 中创建或集成无人机控制手柄 #### 设计思路 为了实现在Unity中创建或集成无人机控制手柄的功能,应当采用基于动作(Action)的设计理念。这意味着不再关注具体哪个按键被按下,而是定义一系列的动作来代表不同的飞行指令,比如上升、下降、前进等[^1]。 #### 创建自定义输入系统 首先,在Unity项目中引入新的输入系统包。这一步骤确保了可以利用最新的API特性来进行更灵活的操作处理。安装完成后,配置Input Actions Asset文件,其中每一个action对应着特定的行为模式,例如起飞降落、方向调整等。 ```csharp using UnityEngine; using UnityEngine.InputSystem; public class DroneController : MonoBehaviour { private PlayerInput playerInput; void Start() { playerInput = GetComponent<PlayerInput>(); // 绑定事件到相应的函数上 playerInput.onActionTriggered += HandleOnActionTriggered; } private void HandleOnActionTriggered(InputAction.CallbackContext context) { var action = context.action.name; switch (action) { case "TakeOff": TakeOff(); break; case "Land": Land(); break; default: AdjustFlightDirection(action); break; } } private void TakeOff() { /* 实现起飞逻辑 */ } private void Land() { /* 实现降落逻辑 */ } private void AdjustFlightDirection(string direction) { /* 调整飞行方向 */ } } ``` #### 集成物理控制器支持 考虑到实际应用环境中可能涉及到VR设备的支持,因此还需要考虑如何让这些外部硬件如Oculus Touch或者HTC Vive的手势识别功能参与到游戏中去。当玩家做出某些预设手势时,程序应该能够捕捉并转换为对应的命令发送给虚拟世界内的对象[^2]。 #### 用户界面反馈机制 最后但同样重要的一点是在UI层面上给予足够的提示信息帮助用户理解当前状态以及下一步该如何操作。无论是通过屏幕上的文字说明还是声音效果都可以极大地提升用户体验感。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值