21.Input输入

  1. 21.Unity重要组件和API-Input
    1. 21.1 知识点
      1. 输入相关内容一般是写在Update中的
      2. 鼠标在屏幕位置
        1. mousePosition方法 鼠标在屏幕的位置
      3. 检测鼠标输入
        1. 鼠标输入相关 可以用来检测 发射子弹 控制摄像机转动 等
        2. GetMouseButtonDown方法 鼠标按下的一瞬间返回true
        3. GetMouseButtonUp方法 鼠标抬起的一瞬间返回true
        4. GetMouseButton方法 鼠标长按按下抬起的过程返回true
        5. mouseScrollDelta方法 中键滚动返回Vector2,只改变y值
      4. 检测键盘输入
        1. 键盘输入相关 可以用来检测 按一个键释放一个技能 切换武器 等
        2. GetKeyDown方法 键盘按下的一瞬间返回true
        3. GetKeyUp方法 键盘抬起的一瞬间返回true
        4. GetKey方法 键盘长按按下抬起的过程返回true
      5. 检测默认轴输入
        1. 打开ProjectSetting查看和修改默认轴
        2. GetAxis方法 返回传入的虚拟轴的值,返回值在-1到1之间
        3. GetAxisRaw方法 返回传入的虚拟轴的值,返回值只会是-1、0、1
      6. 其它输入相关
        1. anyKey方法 是否有任意键或鼠标长按
        2. inputString静态变量 返回这一瞬间输入的键盘字符串值
        3. anyKeyDown方法 是否有任意键或鼠标按下
      7. 手柄输入相关
        1. GetJoystickNames方法 得到连接的手柄的所有按钮名字
        2. GetButtonDown方法 某一个手柄键按下
        3. GetButtonUp方法 某一个手柄键抬起
        4. GetButton方法 某一个手柄键长按
      8. 移动设备触摸相关
        1. touches静态变量 返回上一瞬间触摸对象数组
        2. Touch类中的position变量 返回触摸对象位置
        3. Touch类中的deltaPosition变量 返回触摸对象相对上次位置的变化
        4. touchCount静态变量 这一瞬间屏幕的触摸次数
        5. multiTouchEnabled静态变量 是否启用多点触控
      9. 重力感应相关
        1. gyro静态变量 - 返回陀螺仪(重力感应)
        2. Gyroscope类中的enabled变量 是否开启陀螺仪
        3. Gyroscope类中的gravity变量 返回重力加速度向量
        4. Gyroscope类中的rotationRate变量 旋转速度
        5. Gyroscope类中的attitude变量 陀螺仪当前的旋转四元数
      10. 总结
    2. 21.2 知识点代码
    3. 21.3 练习题
      1. 使用之前的坦克预设体,用WASD键控制坦克的前景后退,左右转向
      2. 在上一题的基础上,鼠标左右移动控制炮台的转向
    4. 21.4 练习题代码

21.Unity重要组件和API-Input


21.1 知识点

输入相关内容一般是写在Update中的

鼠标在屏幕位置

mousePosition方法 鼠标在屏幕的位置

// 鼠标当前的像素坐标位置。(只读)
// 屏幕坐标的原点是在屏幕的左下角,往右是X轴正方向,往上是Y轴正方向。
// 返回值是Vector3,但是只有x和y有值,z始终为0,因为屏幕本来就是2D的,不存在Z轴。
print(Input.mousePosition);

检测鼠标输入

鼠标输入相关 可以用来检测 发射子弹 控制摄像机转动 等

GetMouseButtonDown方法 鼠标按下的一瞬间返回true

// 在用户按下给定鼠标按钮的帧期间返回true。
// 0表示左键,1表示右键,2表示中键。
// 只在按下的这一瞬间进入一次。
if (Input.GetMouseButtonDown(0))
{
    print("鼠标左键按下了");
}

GetMouseButtonUp方法 鼠标抬起的一瞬间返回true

// 在用户释放给定鼠标按钮的帧期间返回true。
// 0表示左键,1表示右键,2表示中键。
if (Input.GetMouseButtonUp(0))
{
    print("鼠标左键抬起了");
}

GetMouseButton方法 鼠标长按按下抬起的过程返回true

// 返回是否按下了给定的鼠标按钮。
// 就是当按住按键不放时会一直进入这个判断。
if (Input.GetMouseButton(1))
{
    print("右键按下");
}

mouseScrollDelta方法 中键滚动返回Vector2,只改变y值

// 当前的鼠标滚动增量。(只读)
// 返回值的y:-1表示往下滚,0表示没有滚,1表示往上滚。
// 我们鼠标中键滚动会改变其中的Y值。
print("中键滚动" + Input.mouseScrollDelta);

检测键盘输入

键盘输入相关 可以用来检测 按一个键释放一个技能 切换武器 等

GetKeyDown方法 键盘按下的一瞬间返回true

// 在用户开始按下指定键的帧期间返回true。
if (Input.GetKeyDown(KeyCode.W))
{
    print("W键按下");
}

// 传入字符串的重载。
// 这里传入的字符串不能是大写的,不然会报错,只能传入小写字符串。
if (Input.GetKeyDown("q"))
{
    print("q按下");
}

GetKeyUp方法 键盘抬起的一瞬间返回true

// 在用户释放指定键的帧期间返回true。
if (Input.GetKeyUp(KeyCode.W))
{
    print("W键抬起");
}

GetKey方法 键盘长按按下抬起的过程返回true

// 在用户按下指定键时返回true。
// 就是当按住按键不放时会一直进入这个判断。
if (Input.GetKey(KeyCode.W))
{
    print("W键长按");
}

检测默认轴输入

打开ProjectSetting查看和修改默认轴

  • 我们学习鼠标、键盘输入主要是用来控制玩家,比如旋转、位移等等。所以Unity提供了更方便的方法来帮助我们控制对象的位移和旋转。


GetAxis方法 返回传入的虚拟轴的值,返回值在-1到1之间

// 返回由axisName标识的虚拟轴的值。
// 我们默认的GetAxis方法是有渐变的,会从-1到0到1之间渐变,会出现小数。
// 键盘AD按下时返回-1到1之间的变化,相当于得到这个值就是我们的左右方向,我们可以通过它来控制对象左右移动或者左右旋转。
float horizontal = Input.GetAxis("Horizontal");
print(horizontal);

// 键盘SW按下时返回-1到1之间的变化,得到这个值就是我们的上下方向,我们可以通过它来控制对象上下移动或者上下旋转。
print(Input.GetAxis("Vertical"));

// 鼠标横向移动时,-1到1表示左右移动。
print(Input.GetAxis("Mouse X"));

// 鼠标竖向移动时,-1到1表示下上移动。
print(Input.GetAxis("Mouse Y"));

GetAxisRaw方法 返回传入的虚拟轴的值,返回值只会是-1、0、1

// 返回由axisName标识的虚拟轴的值(未应用平滑过滤)。
// GetAxisRaw方法和GetAxis使用方式相同,只不过它的返回值只会是-1、0、1,不会有中间值。
print(Input.GetAxisRaw("Fire1"));

其它输入相关

anyKey方法 是否有任意键或鼠标长按

// 当前是否有任何键或鼠标按钮处于按下状态?(只读)
if (Input.anyKey)
{
    print("有一个键长按");
}

inputString静态变量 返回这一瞬间输入的键盘字符串值

// 返回该帧输入的键盘输入。(只读)
print(Input.inputString);

anyKeyDown方法 是否有任意键或鼠标按下

// 在用户按任意键或鼠标按钮后的第一帧返回true。(只读)
if (Input.anyKeyDown)
{
    print("有一个键按下");
    // 这一帧的键盘输入
    print(Input.inputString);
}

手柄输入相关

GetJoystickNames方法 得到连接的手柄的所有按钮名字

// 获取与在输入管理器中配置的轴的索引对应的输入设备名称的列表。
string[] joystickNamesArrays = Input.GetJoystickNames();

GetButtonDown方法 某一个手柄键按下

// 在用户按下由button

Name标识的虚拟按钮的帧期间返回true。
if (Input.GetButtonDown("Jump"))
{
    // 某一键按下时的逻辑处理
}

GetButtonUp方法 某一个手柄键抬起

// 在用户释放由buttonName标识的虚拟按钮的第一帧返回true。
if (Input.GetButtonUp("Jump"))
{
    // 某一键抬起时的逻辑处理
}

GetButton方法 某一个手柄键长按

// 当按住buttonName标识的虚拟按钮时,返回true。
if (Input.GetButton("Jump"))
{
    // 某一键长按时的逻辑处理
}

移动设备触摸相关

touches静态变量 返回上一瞬间触摸对象数组

// 返回表示上一帧中所有触摸状态的对象列表。(只读)(分配临时变量)。
Touch[] touchesArray = Input.touches;
Touch t1 = Input.touches[0];

Touch类中的position变量 返回触摸对象位置

// 触摸在屏幕空间中的位置(像素坐标)。
print(Input.touches[0].position);

Touch类中的deltaPosition变量 返回触摸对象相对上次位置的变化

// 自上次像素坐标更改以来的位置增量。
print(Input.touches[0].deltaPosition);

touchCount静态变量 这一瞬间屏幕的触摸次数

// 触摸次数。保证在整个帧期间不会更改。(只读)
if (Input.touchCount > 0)
{
    Touch t2 = Input.touches[0];
    // 位置
    print(t2.position);
    // 相对上次位置的变化
    print(t2.deltaPosition);
}

multiTouchEnabled静态变量 是否启用多点触控

// 该属性指示系统是否处理多点触控。
Input.multiTouchEnabled = false;

重力感应相关

gyro静态变量 - 返回陀螺仪(重力感应)

// 返回默认陀螺仪。
Gyroscope gyroscope = Input.gyro;

Gyroscope类中的enabled变量 是否开启陀螺仪

// 设置或检索该陀螺仪的启用状态。
// 必须开启才能正常使用。
Input.gyro.enabled = true;

Gyroscope类中的gravity变量 返回重力加速度向量

// 返回以设备参考系表示的重力加速度矢量。
print(Input.gyro.gravity);

Gyroscope类中的rotationRate变量 旋转速度

// 返回设备陀螺仪测量的旋转速率。
print(Input.gyro.rotationRate);

Gyroscope类中的attitude变量 陀螺仪当前的旋转四元数

// 返回设备的姿态(即在空间中的方向)。
// 用这个角度信息来控制场景上的一个3D物体受到重力影响,手机怎么动它就怎么动。
print(Input.gyro.attitude);

总结

  • Input类提供大部分和输入相关的内容,包括鼠标、键盘、触屏、手柄、重力感应等。
  • 对于我们目前来说,鼠标和键盘是必须掌握的核心知识,必须记住鼠标键盘输入相关的API。

21.2 知识点代码

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

public class Lesson21_输入相关Input : MonoBehaviour
{
    void Update()
    {
        #region 注意:输入相关内容肯定是写在Update中的

        #endregion

        #region 知识点一 鼠标在屏幕位置

        //mousePosition方法 鼠标在屏幕的位置
        //鼠标当前的像素坐标位置。(只读)
        //屏幕坐标的原点 是在 屏幕的左下角  往右是X轴正方向 往上时Y轴正方向
        //返回值时Vector3 但是只有 x和y有值 z一直是0 是因为屏幕本来就是2D的 不存在Z轴
        print(Input.mousePosition);

        #endregion

        #region 知识点二 检测鼠标输入

        //鼠标输入相关 可以用来检测 发射子弹 控制摄像机转动 等

        //GetMouseButtonDown方法 鼠标按下的一瞬间 返回 true
        //在用户按下给定鼠标按钮的帧期间返回 true。
        //0左键 1右键 2中键
        //只在按下的这一瞬间 进入一次
        if (Input.GetMouseButtonDown(0))
        {
            print("鼠标左键按下了");
        }

        //GetMouseButtonUp方法 鼠标抬起的一瞬间 返回 true
        //在用户释放给定鼠标按钮的帧期间返回 true。
        //0左键 1右键 2中键
        if (Input.GetMouseButtonUp(0))
        {
            print("鼠标左键抬起了");
        }

        //GetMouseButton方法 鼠标长按按下抬起的过程 返回 true
        //返回是否按下了给定的鼠标按钮。
        //就是 当按住按键不放时 会一直进入 这个判断
        if (Input.GetMouseButton(1))
        {
            print("右键按下");
        }

        //mouseScrollDelta方法 中键滚动 返回Vector2 只改变y值
        //当前的鼠标滚动增量。(只读)
        //返回值的 y -1往下滚  0没有滚  1往上滚
        //我们鼠标中键滚动 会改变其中的Y值
        print("中键滚动" + Input.mouseScrollDelta);

        #endregion

        #region 知识点三 检测键盘输入

        //键盘输入相关 可以用来检测 按一个键释放一个技能 切换武器 等

        //GetKeyDown方法 键盘按下的一瞬间 返回 true
        //在用户开始按下 name 标识的键的帧期间返回 true。
        if (Input.GetKeyDown(KeyCode.W))
        {
            print("W键按下");
        }
        //传入字符串的重载
        //这里传入的 字符串 不能是大写的 不然会报错
        //只能传入小写字符串
        if (Input.GetKeyDown("q"))
        {
            print("q按下");
        }

        //GetKeyUp方法 键盘抬起的一瞬间 返回 true
        //在用户释放 name 标识的键的帧期间返回 true。
        if (Input.GetKeyUp(KeyCode.W))
        {
            print("W键抬起");
        }

        //GetKey方法 键盘长按按下抬起的过程 返回 true
        //在用户按下 name 标识的键时返回 true。
        //就是 当按住按键不放时 会一直进入 这个判断
        if (Input.GetKey(KeyCode.W))
        {
            print("W键长按");
        }

        #endregion

        #region 知识点四 检测默认轴输入

        //我们学习鼠标 键盘输入 主要是用来
        //控制玩家 比如 旋转 位移等等
        //所以Unity提供了 更方便的方法 来帮助我们控制 对象的 位移和旋转

        //GetAxis方法 返回传入的虚拟轴的值 返回值float在-1到1之间
        //返回由 axisName 标识的虚拟轴的值。
        //我们默认的 GetAxis方法 是有渐变的 会总 -1~0~1之间 渐变 会出现小数
        //键盘AD按下时 返回 -1到1之间的变换
        //相当于 得到得这个值 就是我们的 左右方向 我们可以通过它来控制 对象左右移动 或者左右旋转
        float horizontal = Input.GetAxis("Horizontal");
        print(horizontal);
        //键盘SW按下时 返回 -1到1之间的变换
        //得到得这个值 就是我们的 上下方向 我们可以通过它来控制 对象上下移动 或者上下旋转
        print(Input.GetAxis("Vertical"));
        //鼠标横向移动时 -1 到 1 左 右
        print(Input.GetAxis("Mouse X"));
        //鼠标竖向移动时  -1 到 1 下 上
        print(Input.GetAxis("Mouse Y"));


        //GetAxisRaw方法 返回传入的虚拟轴的值 返回值只会是 -1 0 1
        //返回由 axisName 标识的虚拟轴的值(未应用平滑过滤)。
        //GetAxisRaw方法 和 GetAxis使用方式相同
        //只不过 它的返回值 只会是 -1 0 1 不会有中间值
        print(Input.GetAxisRaw("Fire1"));

        #endregion

        #region 知识点五 其它输入相关

        //anyKey方法 是否有任意键或鼠标长按
        //当前是否有任何键或鼠标按钮处于按下状态?(只读)
        if (Input.anyKey)
        {
            print("有一个键长按");
        }

        //inputString静态变量 返回这一瞬间输入的键盘字符串值
        //返回该帧输入的键盘输入。(只读)
        print(Input.inputString);

        //anyKeyDown方法 是否有任意键或鼠标按下
        //在用户按任意键或鼠标按钮后的第一帧返回 true。(只读)
        if (Input.anyKeyDown)
        {
            print("有一个键 按下");
            //这一帧的键盘输入
            print(Input.inputString);
        }

        //手柄输入相关

        //GetJoystickNames方法 得到连接的手柄的所有按钮名字
        //获取与在输入管理器中配置的轴的索引对应的输入设备名称的列表。
        string[] joystickNamesArrays = Input.GetJoystickNames();

        //GetButtonDown方法 某一个手柄键按下
        //在用户按下由 buttonName 标识的虚拟按钮的帧期间返回 true。
        if (Input.GetButtonDown("Jump"))
        {

        }

        //GetButtonUp方法 某一个手柄键抬起
        //在用户释放由 buttonName 标识的虚拟按钮的第一帧返回 true。
        if (Input.GetButtonUp("Jump"))
        {

        }

        //GetButton方法 某一个手柄键长按
        //当按住 buttonName 标识的虚拟按钮时,返回 true。
        if (Input.GetButton("Jump"))
        {

        }

        //移动设备触摸相关

        //touches静态变量 返回上一瞬间触摸对象数组
        //返回表示上一帧中所有触摸状态的对象列表。(只读)(分配临时变量)。
        Touch[] touchesArray = Input.touches;
        Touch t1 = Input.touches[0];

        //Touch类中的position变量 返回触摸对象位置
        //触摸在屏幕空间中的位置(像素坐标)。
        print(Input.touches[0].position);

        //Touch类中的deltaPosition变量 返回触摸对象相对上次位置的变化
        //自上次像素坐标更改以来的位置增量。
        print(Input.touches[0].deltaPosition);

        //touchCount静态变量 这一瞬间屏幕的触摸次数
        //触摸次数。保证在整个帧期间不会更改。(只读)
        if (Input.touchCount > 0)
        {
            Touch t2 = Input.touches[0];
            //位置
            print(t2.position);
            //相对上次位置的变化
            print(t2.deltaPosition);
        }

        //multiTouchEnabled静态变量 是否启用多点触控
        //该属性指示系统是否处理多点触控。
        Input.multiTouchEnabled = false;

        //重力感应相关

        //gyro静态变量 返回陀螺仪(重力感应)
        //返回默认陀螺仪。
        Gyroscope gyroscope =  Input.gyro;

        //Gyroscope类中的enabled变量 是否开启陀螺仪
        //设置或检索该陀螺仪的启用状态。
        //必须开启 才能正常使用
        Input.gyro.enabled = true;

        //Gyroscope类中的gravity变量 返回重力加速度向量
        //返回以设备参考系表示的重力加速度矢量。
        print(Input.gyro.gravity);

        //Gyroscope类中的rotationRate变量 旋转速度
        //返回设备陀螺仪测量的旋转速率。
        print(Input.gyro.rotationRate);

        //Gyroscope类中的attitude变量 陀螺仪当前的旋转四元数 
        //返回设备的姿态(即在空间中的方向)。
        //比如 用这个角度信息 来控制 场景上的一个3D物体受到重力影响
        //手机怎么动 它怎么动
        print(Input.gyro.attitude);

        #endregion
    }

    //总结
    //Input类 提供大部分和输入相关的内容
    //鼠标、键盘、触屏、手柄、重力感应
    //对于我们目前来说
    //鼠标、键盘 是必须掌握的核心知识
    //必须记住 鼠标键盘输入相关的API 
}

21.3 练习题

使用之前的坦克预设体,用WASD键控制坦克的前景后退,左右转向

// 使用之前的坦克预设体,用WASD键控制坦克的前景后退,左右转向
// 会用到Transform当中的位移、自转相关知识点以及键盘输入相关知识点

// 可以利用默认轴向
// Input.GetAxis("Horizontal"); 水平方向 -1到1之间的值,0就是没有按下
// Input.GetAxis("Vertical"); 竖直方向 -1到1之间的值,0就是没有按下

// ws键 控制位移
// 这公式是:前进方向 * 速度 * 时间 * 当前是否移动(-1~1相当于正向还是反向的感觉,不按就不动0)
this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical"));

// ad键 控制 左右转向
// 这公式是:转动的轴 * 速度 * 时间 * 当前是否移动(-1~1相当于正向还是反向的感觉,不按就不动0)
this.transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime * Input.GetAxis("Horizontal"));

在上一题的基础上,鼠标左右移动控制炮台的转向

// 在上一题的基础上,鼠标左右移动控制炮台的转向
// 会用到鼠标输入相关
// Input.GetAxis("Mouse X");
// 这公式是:转动的轴 * 速度 * 时间 * 当前是否移动(-1~1相当于正向还是反向的感觉,不按就不动0)
head.Rotate(Vector3.up * headRotateSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));

21.4 练习题代码

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

public class Lesson21_练习题 : MonoBehaviour
{
    public float moveSpeed = 10;
    public float rotateSpeed = 10;

    public Transform head;
    public float headRotateSpeed = 50;

    void Update()
    {
        #region 练习题一
        //1.使用之前的坦克预设体,用WASD键控制坦克的前景后退,左右转向

        //会用到
        //Transform当中的 位移 自转 相关知识点
        //键盘输入 相关知识点

        //可以利用默认轴向
        //Input.GetAxis("Horizontal"); 水平方向 -1到1之间的值 0就是没有按下
        //Input.GetAxis("Vertical");  竖直方向 -1到1之间的值 0就是没有按下

        //ws键 控制位移
        // 这公式 是 : 前进方向 * 速度 * 时间 * 当前是否移动(-1~1 相当于 正向还是反向的感觉 不按就不动 0)
        this.transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical"));

        //ad键 控制 左右转向
        // 这公式 是 : 转动的轴 * 速度 * 时间 * 当前是否移动(-1~1 相当于 正向还是反向的感觉 不按就不动 0)
        this.transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime * Input.GetAxis("Horizontal"));

        #endregion

        #region 练习题二
        //2.在上一题的基础上,鼠标左右移动控制炮台的转向

        //会用到
        //鼠标输入相关 
        //Input.GetAxis("Mouse X");
        // 这公式 是 : 转动的轴 * 速度 * 时间 * 当前是否移动(-1~1 相当于 正向还是反向的感觉 不按就不动 0)
        head.Rotate(Vector3.up * headRotateSpeed * Time.deltaTime * Input.GetAxis("Mouse X"));

        #endregion

    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏