Unity 输入系统
游戏输入介绍
| 概念
键盘按键、鼠标点击等
打开背包、角色移动等 ; 点击触摸屏
为了交互
| 常见场景
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;
}
}
}