赞
踩
unity为满足跨平台需求支持多种输入方式,比较常见的有触屏、摇杆、鼠标、按键。
虽然unity可以直接在代码中直接指定某个按键的功能,但我们最好使用按键管理器来为项目配置输入操作。这是不仅是为了更好的统一管理,还是因为unity提供了更简单可控的配置方案,并且可以直接使用unity自带的输入设置工具提供给用户自行配置。当程序打包完成后,用户也可以在程序启动器的button setting处配置。但要使用这个功能,需要在项目打包的时候设置启动器。
在Edit->project setting -> input 处可以对按键细节进行设置:
扩展size ,即可添加按键配置。
Name:名称,调用或在外部设置的时候需要使用该名
Negative Button :缺省值为-1的按键
Positive Button :缺省值为1的按键
Alt Negative Button :备用的缺省值为-1的按键
Alt Positive Button :备用的缺省值为1的按键
Dead: 输入阈值, 触摸或者摇杆大于这个值才会触发输入
Gravity:表示松开按键时,从端点1或-1返回缺省值0时的速度
Sensitivity:按下按键时,从缺省值0到1或-1时的速度
Snap: 当触发反向操作时,当前值是否立即归零
Invet:是否取反值
Type:预设输入设备类型,可选键盘与鼠标按键、手柄、鼠标移动
Axis:装置选择,例如一个手柄有两个十字键两个摇杆,那么可以在这里设置当前设定作用于哪个装置
Joy Num: 手柄编号。指定连接的哪个设备
需要说明的是,在输入管理器中设置的输入基本上都是返回-1 - 1 区间的值。这比返回true false要好很多,因为优化输入体验的时候,比如我们希望根据按压力度来调整跳跃距离,又或者我们希望根据摇杆的摇摆程度来控制车辆的方向盘,都比较合适
获取鼠标位置:
Input.mousePosition
点击事件:
鼠标按键ID:左键0,右键1,滚轮2
保持按下为true,随帧率多次触发:Input.GetMouseButton(0)
按下为true,只触发一次 :Input.GetMouseButtonDown(0)
释放为true,只触发一次:Input.GetMouseButtonUp(0)
//例:
void Update() {
//获取位置
Debug.Log("当前鼠标位置",Input.mousePosition);
//点击
if(Input.GetMouseButton(0))
Debug.Log("点击");
}
场景中的鼠标事件:
与unity生命周期或是碰撞检测器的使用方法类似,但物体必须拥有碰撞检测组件collider,
OnMouseEnter(){}
OnMouseOver(){}
OnMouseExit(){}
OnMouseDown(){}
OnMouseUp(){}
OnMouseDrag(){}
OnMouseUpAsButton(){}
例:
void Update() {
}
void OnMouseEnter(){
Debug.Log("鼠标进入了区域");
}
触摸控制略有特殊,因为涉及到多点控制。
Input.multiTouchEnabled //允许多点触控
Input.simulateMouseWithTouches
Input.touchCount //多点总数
Input.touches //多个记录触控点
Input.touchSupported
Input.GetTouch()
Touch myTouch = Input.touches[0]//获取当前第一个触点
myTouch.fingerId//触点id
myTouch.deltaPosition//触点移动距离
myTouch.deltaTime//触点经过时间
myTouch.tapCount//触点点击次数
myTouch.phase//触点状态
例:
private void Update()
{
//判断当前是否有触点
if (Input.touchCount > 0)
{
Debug.Log("当前触点总数为:"+ Input.touchCount);
//获取第一个触点0,1就是第二个
Touch myTouch = Input.touches[0];
//fingerId用来辨别触点身份
Debug.Log("第一个触点的唯一id是:"+myTouch.fingerId) ;
//实时反馈当前触点位置与最先触碰时的位置距离
Debug.Log("当前触点移动了距离:"+myTouch.deltaPosition);
//实时反馈当前触点位置与最先触碰时的时间
Debug.Log("当前触点距离首次触碰时间经过了:"+myTouch.deltaTime );
//触点对象并不是手指抬起后立刻销毁,如果手指在同一位置快速点击,属于同一Touch对象
//点击屏幕的次数
Debug.Log("当前触点点击次数为:"+myTouch.tapCount );
//当前触点的状态
//Began 触碰开始,Moved 触碰后移动,Stationary触碰后不动,Ended 手指离开,Canceled 取消状态
Debug.Log("当前触点状态为:"+myTouch.phase );
}
}
返回-1到1之间的float值:Input.GetAxis() 、
返回定点值-1,0,1或者摇杆的位置:Input.GetAxisRaw()
保持为true,随帧率触发:Input.GetButton(“a”)
按下为true,只触发一次:Input.GetButtonDown("")
释放为true,只触发一次:Input.GetButtonUp("")
点击为true,否则为false:Input.GetKey()
例:
void Update() {
//直接输入Key值
if (Input.GetKey("up"))
//通过KeyCode类输入Key值
if (Input.GetKey(KeyCode.UpArrow))
//直接输入键盘按键名
if(Input.GetKey("a"))
//数字按键
if(Input.GetKey("1"))
//小键盘
if(Input.GetKey("[1]"))
//功能键
if(Input.GetKey("left shift"))
//鼠标 backspace
if(Input.GetKey("mouse 0"))
//特殊
if(Input.GetKey("backspace"))
}
拖拽事件需要实现相关的事件接口。这个是我做的中间件脚本。可以方便的通过代码设置在指定物体上,通过委托直接赋予行为。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class mDragEvent : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
public delegate void OnBeginDrag_delegate(PointerEventData eventData);
public event OnBeginDrag_delegate OnBeginDrag_event;
public delegate void OnDrag_delegate(PointerEventData eventData);
public event OnDrag_delegate OnDrag_event;
public delegate void OnEndDrag_delegate(PointerEventData eventData);
public event OnEndDrag_delegate OnEndDrag_event;
void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
{
Debug.Log("start");
OnBeginDrag_event?.Invoke(eventData);
}
void IDragHandler.OnDrag(PointerEventData eventData)
{
Debug.Log("drag");
OnDrag_event?.Invoke(eventData);
}
void IEndDragHandler.OnEndDrag(PointerEventData eventData)
{
Debug.Log("end");
OnEndDrag_event?.Invoke(eventData);
}
}
点击事件需要实现相关的事件接口。这个是我做的中间件脚本。可以方便的通过代码设置在指定物体上,通过委托直接赋予行为。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class mPointerEvent : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerExitHandler
{
public delegate void OnPointerClick_delegate(PointerEventData eventData);
public event OnPointerClick_delegate OnPointerClick_evnet;
public delegate void OnPointerDown_delegate(PointerEventData eventData);
public event OnPointerDown_delegate nPointerDown_evnet;
public delegate void OnPointerEnter_delegate(PointerEventData eventData);
public event OnPointerEnter_delegate OnPointerEnter_evnet;
public delegate void OnPointerExit_delegate(PointerEventData eventData);
public event OnPointerExit_delegate OnPointerExit_evnet;
public delegate void OnPointerUp_delegate(PointerEventData eventData);
public event OnPointerUp_delegate OnPointerUp_evnet;
void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
{
if(OnPointerClick_evnet != null){
this.OnPointerClick_evnet(eventData);
}
}
void IPointerDownHandler.OnPointerDown(PointerEventData eventData)
{
if(nPointerDown_evnet != null){
this.nPointerDown_evnet(eventData);
}
}
void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData)
{
if(OnPointerEnter_evnet != null){
this.OnPointerEnter_evnet(eventData);
}
}
void IPointerExitHandler.OnPointerExit(PointerEventData eventData)
{
if(OnPointerExit_evnet != null){
this.OnPointerExit_evnet(eventData);
}
}
void IPointerUpHandler.OnPointerUp(PointerEventData eventData)
{
if(OnPointerUp_evnet != null){
this.OnPointerUp_evnet(eventData);
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。