一个应用要和用户进行交互,用户的输入方式也是很丰富的。比如有键盘按键,鼠标,虚拟摇杆,手柄,触摸屏等。Unity为了将这些输入统一方便管理,于是有了Input类。这个类中有一些重要的常用API。
1、获取虚拟轴操作信息,Horizontal和Vertical。
所谓虚拟轴,就是将鼠标或者键盘的操作,应为Horizontal或Vertical,或者其他,这样子就可以有一对多的映射关系。比如Fire1这个虚拟按键名字,那么具体可以映射为空格键和鼠标左键点击。在edit-->Project Setting--> Input 下有非常多的输入设置里进行编辑。
两个常用的虚拟轴API:
- Input.GetAxisRaw
通过坐标轴名称返回一个不使用平滑滤波器的虚拟坐标值。
当在游戏运行的时候,按下你设置好的键盘就会返回 1和-1这两个值。
function Update () {
var speed : float = Input.GetAxisRaw("Horizontal") * Time.deltaTime;
transform.Rotate (0, speed, 0);
}
- Input.GetAxis
当按下你设置的键则会返回一个类似加速度的值 0.1-->0.3 -->0.1然后将会依次减少..类似刹车和开车.
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public float speed = 10.0F;
public float rotationSpeed = 100.0F;
void Update() {
float translation = Input.GetAxis("Vertical") * speed;
float rotation = Input.GetAxis("Horizontal") * rotationSpeed;
translation *= Time.deltaTime;
rotation *= Time.deltaTime;
transform.Translate(0, 0, translation);
transform.Rotate(0, rotation, 0);
}
}
2、获得键盘
Input.GetKey(KeyCode.A)
Input.GetKeyDown(KeyCode.A)
Input.GetKeyUp(KeyCode.A)
3、获取鼠标
Input.mousePosition // 鼠标位置
Input.GetMouseButton 获取按钮
4、获取某个映射后的虚拟按键
Input.GetButton("Fire1")
5、获取触摸信息
- API:GetTouch(int index)
- 属性:touchCount
- 属性:Touch[] touches
(1)Input.touches结构
![](https://img.haomeiwen.com/i13721461/0c2c96b0fce08f15.png)
利用这几个结构体信息,可以判断出在触摸上的操作。
通常的操作有:点击、单指滑动、长按时间判断,双指放大缩小等。
a、判断长按短按,使用示例:
//当一根手指触摸,则进入if分支
if (Input.touchCount == 1)
{
//记录触摸
Touch touch = Input.GetTouch(0);
//如果触摸刚开始,则进入if分支
if (touch.phase == TouchPhase.Began)
{
//设置bool触摸为真,且记录时间
newTouch = true;
touchTime = Time.time;
}
else if (touch.phase == TouchPhase.Stationary)//如果触摸静止,则进入该分支
{
//当bool触摸为真,且触摸时间大于等于2秒
if (newTouch == true && (Time.time - touchTime) >= 2.0f)
{
//手指静止长按大于2秒时的操作处理
}
}
else if (touch.phase == TouchPhase.Moved)
{
if (newTouch == true && (Time.time - touchTime) >= 2.0f)
{
//长按大于2秒并有滑动时的操作处理
}
//水平上下旋转
Vector2 deltaPos = touch.deltaPosition;
TargetTrans.Rotate(Vector3.down * deltaPos.x, Space.World);
TargetTrans.Rotate(Vector3.right * deltaPos.y, Space.World);
}
else
{
//设置bool触摸为假
newTouch = false;
}
}
b、结合上虚拟轴的使用,可以更方便地判断当前是左滑动屏幕还是右滑动屏幕
//单点触摸 判断手指滑动 同时排除按住屏幕的情况
if (1 == Input.touchCount && Input.GetMouseButton(0) == false)
{
Touch touch = Input.GetTouch(0);
Vector2 deltaPos = touch.deltaPosition;
float XX = Input.GetAxis("Mouse X");
float YY = Input.GetAxis("Mouse Y");
//判断左右滑动的距离与上下滑动距离大小
if (Mathf.Abs(XX) >= Mathf.Abs(YY))
{
//单指向左滑动情况
if (XX < 0)
{
//TargetTrans.Rotate(Vector3.up, 45 * Time.deltaTime, Space.World);
TipText.text = "单指向左滑动";
}
//单指向右滑动情况
if (XX > 0)
{
//TargetTrans.Rotate(-Vector3.up, 45 * Time.deltaTime, Space.World);
TipText.text = "单指向右滑动";
}
}
}
Touch newTouch1 = Input.GetTouch(0);
if (newTouch1.phase == TouchPhase.Ended)
{
//触摸结束
}
c、判断双指缩放示例
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
//第2点刚开始接触屏幕, 只记录,不做处理
if (newTouch2.phase == TouchPhase.Began)
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
//计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
//两个距离之差,为正表示放大手势, 为负表示缩小手势
float offset = newDistance - oldDistance;
//放大因子, 一个像素按 0.01倍来算(100可调整)
float scaleFactor = offset / 100f;
Vector3 localScale = transform.localScale;
Vector3 scale = new Vector3(localScale.x + scaleFactor,
localScale.y + scaleFactor,
localScale.z + scaleFactor);
//最小缩放到 0.3 倍
if (scale.x > 0.3f && scale.y > 0.3f && scale.z > 0.3f)
{
transform.localScale = scale;
}
//记住最新的触摸点,下次使用
oldTouch1 = newTouch1;
oldTouch2 = newTouch2;
其他参考:
https://blog.csdn.net/weixin_38745092/article/details/80320972
http://t.zoukankan.com/QG-whz-p-4399405.html
https://blog.csdn.net/aiyan1111111/article/details/52816133?_t_t_t=0.6321927157416025
网友评论