程序设计基础
登录
< 返回教程列表

3.3 输入 Input

知识介绍

using UnityEngine;

public class InputDemo : MonoBehaviour
{
    private void Update()
    {
        // ============== 键盘 ==============
        // 按下瞬间
        if (Input.GetKeyDown(KeyCode.Space))
            Debug.Log("空格被按下");
        // 持续按住
        if (Input.GetKey(KeyCode.A))
            Debug.Log("A 键按住中");
        // 抬起瞬间
        if (Input.GetKeyUp(KeyCode.Space))
            Debug.Log("空格被抬起");

        // ============== 鼠标 ==============
        // 0=左键, 1=右键, 2=中键
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 mPos = Input.mousePosition;  // 屏幕像素坐标
            Debug.Log($"鼠标点击屏幕位置:{mPos}");
        }

        // ============== 轴 Input(WSAD / 方向键 / 手柄摇杆)==============
        float h = Input.GetAxis("Horizontal");   // A/-1 ~ D/+1(平滑)
        float v = Input.GetAxis("Vertical");     // S/-1 ~ W/+1
        // 无平滑版本(用在跳跃等需要立即响应的情况)
        float hRaw = Input.GetAxisRaw("Horizontal");

        // ============== 跳跃按钮 ==============
        if (Input.GetButtonDown("Jump"))         // 默认对应空格
            Debug.Log("跳!");
    }
}

最常用:WSAD 控制角色移动

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    public float speed = 5f;

    private void Update()
    {
        float h = Input.GetAxis("Horizontal");   // A/D
        float v = Input.GetAxis("Vertical");     // W/S

        // 方向向量
        Vector3 dir = new Vector3(h, 0, v);
        // 归一化(防止斜着走更快)
        if (dir.magnitude > 1) dir.Normalize();

        // 世界坐标移动
        // transform.position += dir * speed * Time.deltaTime;

        // 本地坐标移动(根据自身朝向)
        transform.Translate(dir * speed * Time.deltaTime, Space.Self);
    }
}

例题

例题: 第一人称视角鼠标旋转(X 轴控制左右,Y 轴控制上下)。

using UnityEngine;

public class MouseLook : MonoBehaviour
{
    public float mouseSens = 100f;
    public Transform playerBody;  // 玩家身体(用于左右旋转)

    private float xRotation = 0f;

    private void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;  // 锁定鼠标到屏幕中央
    }

    private void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSens * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSens * Time.deltaTime;

        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);  // 限制上下不超过90°

        transform.localRotation = Quaternion.Euler(xRotation, 0, 0);  // 相机上下看
        playerBody.Rotate(Vector3.up * mouseX);                       // 身体左右转
    }
}

练习题

  1. 实现一个简单的 WASD 移动脚本:挂到 Cube 上,WSAD 控制上下左右(XZ 平面)移动,速度 5。

  2. 扩展第1题:按住 Left Shift 时速度变 10(加速跑),松开恢复。

  3. 按 J 键让 Cube 向上跳(给位置 Y + 5 的瞬间位置变化,不用物理),注意冷却 1 秒不能连续跳。

  4. 实现鼠标右键拖拽旋转物体:按住右键拖动时,根据鼠标 X 轴偏移让物体绕 Y 轴旋转。

  5. 实现"按 1 切换第一人称 / 第三人称":场景中有两个 Camera,按 1 启用主相机、禁用另一个,按 2 反过来。