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