HOME
BLOG
Unity 输入系统
9月 09 2022

游戏输入介绍

| 概念

键盘按键、鼠标点击等

打开背包、角色移动等 ; 点击触摸屏

为了交互

| 常见场景

PC:键盘鼠标摇杆

平板 / 手机:屏幕输入,实际响应的多为 UI 元素

主机其他:手柄、摇杆

VR:VR眼镜、VR手柄等


键盘输入

| 键盘输入检测

键盘按下: Input.GetKeyDown(KeyCode.A)

按键弹起: Input.GetKeyUp(KeyCode.A)

键盘按下持续中(按住): Input.GetKey(KeyCode.A)

演示:

public class L4_2Demo : MonoBehaviour
{
    public string AttackKeyName;
    private float attackValue = 0;

    void Update()
    {

        #region 按键检测
        // 只有第一次按下的那一帧有效
        //if (Input.GetKeyDown(KeyCode.A))
        //{
        //    print("按了个A");
        //}

        //// 只有第一次按下的那一帧有效
        //if (Input.GetKeyDown(AttackKeyName))
        //{
        //    print("攻击");
        //}

        //// 只有第一次按下的那一帧有效
        //if (Input.GetKeyUp(KeyCode.A))
        //{
        //    print("弹起了个A");
        //}

        //// 持续有效
        //if (Input.GetKey(KeyCode.A))
        //{
        //    print("持续按A");
        //}
        #endregion

        // 蓄力Demo
        // 按下
        // 按下中
        // 弹起
        if (Input.GetKeyDown(AttackKeyName))
        {
            print("开始蓄力");
            attackValue = 0;
        }

        if (Input.GetKey(AttackKeyName))
        {
            print("蓄力中");
            attackValue += Time.deltaTime;
        }

        if (Input.GetKeyUp(AttackKeyName))
        {
            print("发动攻击: "+ attackValue);
        }
    }
}

鼠标输入

| 鼠标输入检测

0:左键;1:右键

鼠标按下: Input.GetMouseButtonDown(0)

鼠标抬起: Input.GetMouseButtonUp(0)

鼠标按住: Input.GetMouseButton(0)

鼠标当前坐标: Input.mousePosition

演示:

public class L4_3Demo : MonoBehaviour
{
    void Update()
    {
        // 0: left ; 1: right
        //if (Input.GetMouseButtonDown(0))
        //{
        //    print("左键按下");
        //}
        //if (Input.GetMouseButtonUp(0))
        //{
        //    print("左键弹起");
        //}
        //if (Input.GetMouseButton(0))
        //{
        //    print("左键按住");
        //}

        // 鼠标位置
        // 并不是游戏中的位置
        if (Input.GetMouseButtonDown(0))
        {
            print(Input.mousePosition);
        }
    }
}

InputManager

| 介绍

Unity 提供的输入管理器

进入路径:Edit -> ProjectSettings -> InputManager

| 设置参数

主要用到Name等

| 主要使用方法

Input.GetAxis("Horizontal") :有平滑过渡

Input.GetAxisRaw("Horizontal") :只能是-1,0,1

演示:

public class L4_4Demo : MonoBehaviour
{
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        transform.Translate(new Vector3(h, v));

        float wheel = Input.GetAxis("Mouse ScrollWheel");
        print(wheel);
    }
}

案例:小球移动

| 介绍

让小球在平台上左右移动即可

向左:A

向右:D

| 实现

演示:

public class L4_5Demo : MonoBehaviour
{
    // 每秒移动多少米 - 常规情况下
    public float Speed = 1;

    void Update()
    {
        // 移动
        Move();
    }

    /// <summary>
    /// 移动
    /// </summary>
    void Move()
    {
        // 获取玩家的输入状况
        float horizontal = Input.GetAxis("Horizontal");
        //float vertical = Input.GetAxis("Vertical");
        // 根据输入得到一个移动方向
        Vector3 dir = new Vector3(horizontal, 0, 0);
        // 位移 你的帧率越快 需要单帧移动速度越慢
        transform.Translate(dir * Time.deltaTime * Speed);
    }
}

案例:小球跳跃

| 介绍

空格 小球会跳起来

落地后会出现一定 回弹

| 实现

演示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class L4_5Demo : MonoBehaviour
{
    // 刚体
    //private Rigidbody2D rigidbody_2D;     改名
    private new Rigidbody2D rigidbody2D; // 加new

    // 是否在地面上
    private bool isOnGround = true;

    // 每秒移动多少米 - 常规情况下
    public float Speed = 1;
    public float JumpPower = 10;

    private void Start()
    {
        rigidbody2D = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 移动
        Move();
        // 跳跃
        Jump();
    }

    /// <summary>
    /// 移动
    /// </summary>
    void Move()
    {
        // 获取玩家的输入状况
        float horizontal = Input.GetAxis("Horizontal");
        //float vertical = Input.GetAxis("Vertical");
        // 根据输入得到一个移动方向
        Vector3 dir = new Vector3(horizontal, 0, 0);
        // 位移 你的帧率越快 需要单帧移动速度越慢
        transform.Translate(dir * Time.deltaTime * Speed);
        //rigidbody2D.MovePosition((dir * Time.deltaTime * Speed) + transform.position); 也可以这种方法
    }
    /// <summary>
    /// 跳跃
    /// </summary>
    void Jump()
    {
        // 如果 玩家 按了空格 并且在地面上,则跳跃
        if (Input.GetKeyDown(KeyCode.Space) && isOnGround)
        {
            rigidbody2D.AddForce(Vector2.up * JumpPower);
        }
    }

    // 碰撞进入
    private void OnCollisionEnter2D(Collision2D collision)
    {
        // 判断一下 是不是接触了地面
        if(collision.gameObject.tag == "Ground")
        {
            isOnGround = true;
        }
    }

    // 碰撞退出
    private void OnCollisionExit2D(Collision2D collision)
    {
        // 判断一下 是不是离开了地面
        if (collision.gameObject.tag == "Ground")
        {
            isOnGround = false;
        }
    }
}


👾森木清树👾

Unity Study