U4S1L5——手柄输入

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Gamepad                            //手柄类
Gamepad.current //获取当前可用手柄
StickControl //摇杆类
gamepad.leftStick.ReadValue() //左摇杆方向向量
gamepad.rightStick.ReadValue() //右摇杆方向向量
gamepad.leftStickButton //左摇杆按键
gamepad.rightStickButton //右摇杆按键
gamepad.dpad.up //方向键上键
gamepad.dpad.down //方向键下键
gamepad.dpad.left //方向键左键
gamepad.dpad.right //方向键右键
gamePad.buttonNorth //右侧按键上方按键
gamePad.buttonSouth //右侧按键下方按键
gamePad.buttonWest //右侧按键左方按键
gamePad.buttonEast //右侧按键右方按键
gamepad.startButton //开始键
gamepad.selectButton //选择键
gamePad.leftShoulder //左肩键
gamePad.rightShoulder //右肩键
gamePad.leftTrigger //左扳机键
gamePad.rightTrigger //右扳机键

获取当前手柄

1
2
3
Gamepad gamepad = Gamepad.current;
if (gamepad != null)
return;

手柄摇杆

  • 左摇杆

    1
    2
    3
    4
    void Update()
    {
    print("左摇杆:" + Gamepad.current.leftStick.ReadValue());
    }
  • 右摇杆

    1
    2
    3
    4
    void Update()
    {
    print("右摇杆:" + Gamepad.current.rightStick.ReadValue());
    }
  • 摇杆按下抬起按住

    和鼠标按键的情况一样,摇杆的按键也是使用ButtonControl

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void Update()
    {
    if (Gamepad.current.leftStickButton.wasPressedThisFrame)
    {
    print("左摇杆按下");
    }
    if (Gamepad.current.leftStickButton.wasReleasedThisFrame)
    {
    print("左摇杆抬起");
    }
    if (Gamepad.current.leftStickButton.isPressed)
    {
    print("左摇杆按住");
    }
    if (Gamepad.current.rightStickButton.wasPressedThisFrame)
    {
    print("右摇杆按下");
    }
    if (Gamepad.current.rightStickButton.wasReleasedThisFrame)
    {
    print("右摇杆抬起");
    }
    if (Gamepad.current.rightStickButton.isPressed)
    {
    print("右摇杆按住");
    }
    }

手柄方向键

对应手柄上4个方向键,和鼠标按键的情况一样,方向键也是使用ButtonControl,都有按下、抬起、按住,这里只演示按下

  • 手柄上键

    有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamepad = Gamepad.current;
    if (gamepad.dpad.up.wasPressedThisFrame)
    {
    print("上键按下");
    }
    }
  • 手柄下键

    有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamepad = Gamepad.current;
    if (gamePad.dpad.down.wasPressedThisFrame)
    {
    print("下键按下");
    }
    }
  • 手柄左键

    有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamepad = Gamepad.current;
    if (gamePad.dpad.left.wasPressedThisFrame)
    {
    print("左键按下");
    }
    }
  • 手柄右键

    有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamepad = Gamepad.current;
    if (gamePad.dpad.right.wasPressedThisFrame)
    {
    print("右键按下");
    }
    }

手柄右侧按键

值得一提的是,主流的游戏主机厂商,它们的手柄右侧布局都有所不同:
任天堂与微软的手柄右侧按键上XY,AB布局是相反的,而索尼使用的图标是:x ○ △ □

  • 任天堂switch:image
  • 微软Xbox系列:image
  • 索尼Playstation系列:​image

所有手柄右侧按键通用的API

Unity 提供了一个通用的API,用北南西东方向(上北下南左西右东)来指代所有手柄右侧不同的四个键
和鼠标按键的情况一样,右侧按键也是使用ButtonControl,都有按下、抬起、按住,这里只演示按下

  • 手柄右侧上方按键(北)

    指的是:任天堂手柄的X键,微软手柄的Y键,索尼手柄的△键
    都有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamePad = Gamepad.current;
    if (gamePad.buttonNorth.wasPressedThisFrame)
    {
    print("任天堂手柄的X键或微软手柄的Y键或索尼手柄的△键按下");
    }
    }
  • 手柄右侧下方按键(南)

    指的是:任天堂手柄的B键,微软手柄的A键,索尼手柄的x键
    都有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamePad = Gamepad.current;
    if (gamePad.buttonSouth.wasPressedThisFrame)
    {
    print("任天堂手柄的B键或微软手柄的A键或索尼手柄的x键按下");
    }
    }
  • 手柄右侧左方按键(西)

    指的是:任天堂手柄的Y键,微软手柄的X键,索尼手柄的□键
    都有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamePad = Gamepad.current;
    if (gamePad.buttonWest.wasPressedThisFrame)
    {
    print("任天堂手柄的Y键或微软手柄的X键或索尼手柄的□键按下");
    }
    }
  • 手柄右侧右方按键(东)

    指的是:任天堂手柄的A键,微软手柄的B键,索尼手柄的○键
    都有按下、抬起、按住,这里只演示按下

    1
    2
    3
    4
    5
    6
    7
    8
    void Update()
    {
    Gamepad gamePad = Gamepad.current;
    if (gamePad.buttonEast.wasPressedThisFrame)
    {
    print("任天堂手柄的A键或微软手柄的B键或索尼手柄的○键按下");
    }
    }

与名字对应的手柄右侧按键API

使用名字来监听手柄右侧按键也可以,但是要注意各个手柄厂商布局不同带来的问题,例如图标不同,XYAB排布不同等
因此,不建议使用这个API
和鼠标按键的情况一样,右侧按键也是使用ButtonControl,都有按下、抬起、按住,这里只演示按下

索尼手柄按键

1
2
3
4
5
6
7
8
//○
gamePad.circleButton
//△
gamePad.triangleButton
//□
gamePad.squareButton
//X
gamePad.crossButton

微软手柄按键

注意!任天堂的XYAB按键布局和微软是不同的,它们的XY和AB键位置是颠倒的,而该API使用的是微软的布局,因此不适用于任天堂的布局!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Update()
{
Gamepad gamePad = Gamepad.current;
if (gamePad.xButton.wasPressedThisFrame)
{
print("X键按下");
}
if (gamePad.yButton.wasPressedThisFrame)
{
print("Y键按下");
}
if (gamePad.aButton.wasPressedThisFrame)
{
print("A键按下");
}
if (gamePad.bButton.wasPressedThisFrame)
{
print("b键按下");
}
}

手柄中央按键

注意,这里的手柄中央按键一般仅指用于游戏的两个中央按键!如下图:

imageimageimage

剩余的按键属于主机系统使用的按键,一般游戏里用不到

和鼠标按键的情况一样,中央按键也是使用ButtonControl,都有按下、抬起、按住,这里只演示按下

由于历史原因,中央右侧的按键一般就是start键,而中央左侧的按键就是select键

1
2
3
4
5
6
7
8
9
10
11
12
void Update()
{
Gamepad gamePad = Gamepad.current;
if (Gamepad.current.startButton.wasPressedThisFrame)
{
print("开始键按下");
}
if (Gamepad.current.selectButton.wasPressedThisFrame)
{
print("选择键按下");
}
}

手柄肩部按键(扳机键)

和鼠标按键的情况一样,中央按键也是使用ButtonControl,都有按下、抬起、按住,这里只演示按下

  • 这里的肩键 Shoulder​ 指的是:靠向手柄正面一侧的肩键,即:任天堂的 L R 键,微软的 LB RB 键,索尼的 L1 R1 键
  • 这里的扳机键 Trigger​ 指的是:靠向手柄背面一侧,且更像扳机的键,即:任天堂的 ZL ZR 键,微软的 LT RT 键,索尼的 L2 R2 键
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Update()
{
Gamepad gamePad = Gamepad.current;
if (gamePad.leftShoulder.wasPressedThisFrame)
{
print("左侧肩键按下");
}
if (gamePad.rightShoulder.wasPressedThisFrame)
{
print("右侧肩键按下");
}
if (gamePad.leftTrigger.wasPressedThisFrame)
{
print("左侧扳机键按下");
}
if (gamePad.rightTrigger.wasPressedThisFrame)
{
print("右侧扳机键按下");
}
}