Unity3D游戏开发之键盘操纵杆和游戏手柄输入实现详解.docx
- 文档编号:23047401
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:12
- 大小:219.02KB
Unity3D游戏开发之键盘操纵杆和游戏手柄输入实现详解.docx
《Unity3D游戏开发之键盘操纵杆和游戏手柄输入实现详解.docx》由会员分享,可在线阅读,更多相关《Unity3D游戏开发之键盘操纵杆和游戏手柄输入实现详解.docx(12页珍藏版)》请在冰豆网上搜索。
Unity3D游戏开发之键盘操纵杆和游戏手柄输入实现详解
Unity3D游戏开发之键盘、操纵杆和游戏手柄输入实现详解
输入桌面
Unity支持键盘、操纵杆和游戏手柄输入。
可以在输入管理器(InputManager)中创建虚拟轴和按钮,终端用户可以在简洁美观的配置对话框中配置键盘。
您可以设置操纵杆、手柄、键盘和鼠标,然后通过简单的脚本界面访问所有设置。
在脚本中,所有虚拟轴都按照名称访问。
在创建之时,所有工程都有以下默认的输入轴:
1、水平线(Horizontal)和垂直线(Vertical)映射至w、a、s、d和方向键。
2、Fire1、Fire2、Fire3分别映射至Control、Option(Alt)和Command键。
3、MouseX和MouseY映射至鼠标移动增量。
4、WindowShakeX和WindowShakeY对应窗口的移动。
添加新的输入轴
如需添加新的虚拟轴,转到编辑(Edit)->工程设置(ProjectSettings)->输入(Input)菜单。
也可在这里更改每个轴的设置。
每个轴可以对应操纵杆、鼠标的两个按钮或两个键盘按键。
名称(Name)
用来在脚本中检查该轴的字符串名称。
描述名称(DescriptiveName)
配置(Configuration)对话框输入选项卡中显示的正名称,用于独立构建。
描述负名称(DescriptiveNegativeName)
配置(Configuration)对话框输入选项卡中显示的负名称,用于独立构建。
负按钮(NegativeButton)
用于在负方向移动轴。
正按钮(PositiveButton)
用于在正方向移动轴。
备选负按钮(NegativeButton)
用来在负方向移动轴的备选按钮。
备选正按钮(AltPositiveButton)
用来在正方向移动轴的备选按钮。
重力(Gravity)
在没有按任何按钮时,轴下降到0的每秒单位速度。
死亡(Dead)
模拟死区的大小。
所有在这个范围内的模拟设备值将映射为0。
灵敏度(Sensitivity)
轴向目标值移动的每秒单位速度。
该功能仅用于数码设备。
捕捉(Snap)
如果启用,按下相反方向的按钮时,轴值将自动归零。
反向(Invert)
如果启用,按下负按钮(NegativeButton)将提供正值,反之亦然。
类型(Type)
控制此轴的输入类型。
轴(Axis)
连接设备的轴将控制这个轴。
操纵杆(JoyNum)
连接操纵杆将控制这个轴。
这些设置可用来微调输入的外观和感觉。
他们在编辑器均带有工具提示。
使用脚本中的输入轴
从像这样的脚本,可以查询当前状态,如下所示:
value=Input.GetAxis(“Horizontal”);
轴值在-1到1之间。
中间位置为0。
这是在操纵杆输入和键盘输入的情况下。
但是,鼠标增量和WindowShake增量是指鼠标或视窗在最后一帧移动的距离。
这意味着,当用户快速移动鼠标时,它可能大于1或小于-1。
您可以创建多个名称相同的轴。
在获得输入轴时,绝对值最大的轴将被返回。
这使得为一种以上输入设备指定同一个轴名称成为可能。
例如,为键盘输入创建一个轴,并且为操纵杆创建另一根名称相同的轴。
如果用户使用操纵杆,输入将来自操纵杆,否则,输入将来自键盘。
有了这种方法,在编写脚本时,您无需再考虑输入的来源。
文章出处【狗刨学习网】
按钮名称
要映射一个键到一个轴,您必须在检视器中的正按钮(PositiveButton)或负按钮(NegativeButton)属性中输入按键名称。
按键名称遵循以下惯例:
1、标准键:
“a”、”b”、”c”、…
2、数字键:
”1″、”2″、”3″、…
3、方向键:
“上(up)”、“下(down)”、“左(left)”、“右(right)”
4、小键盘键:
”[1]”、”[2]”、”[3]”、”[+]”、”[=]”
5、修改键:
”rightshift”、”leftshift”、”rightctrl”、”leftctrl”、”rightalt”、”leftalt”、”rightcmd”、”leftcmd”
6、鼠标按钮:
”mouse0″、”mouse1″、”mouse2″,…
7、操纵杆按钮(从任意操纵杆):
”joystickbutton0″、”joystickbutton1″、”joystickbutton2″、…
8、操纵杆按钮(从指定操纵杆):
”joystick1button0″、”joystick1button1″、”joystick2button0″、…
9、特殊键:
”backspace”、”tab”、”return”、”escape”、”space”、”delete”、”enter”、”insert”、”home”、”end”、”pageup”、”pagedown”
10、功能键:
”f1″、”f2″、”f3″、…
在脚本界面和检视器中,用来识别按键的名称是一样的。
value=Input.GetKey(“a”);
移动输入
在iOS和Android平台,输入类别可以让您访问触摸屏、加速度计及地理/位置输入。
通过iOS键盘可提供移动设备键盘访问。
多点触控屏幕
iPhone和iPodTouch设备最多可同时追踪屏幕的五个触点。
您可以访问Input.touches属性数组,检索最后一帧每个触点的状态。
Android设备对于追踪的触点数量没有统一限制。
相反,它根据设备的而有所不同,某些老旧设备可能是两点,而最新的设备可以到五点。
每个触点都以一个Input.Touch数据结构表示:
手指索引(fingerId)
每次触摸的唯一指数。
位置(position)
触摸在屏幕中的位置。
增量位置(deltaPosition)
最后一帧以来的屏幕位置变化。
增量时间(deltaTime)
最后一次状态变化以来的经过的时间。
点击数(tapCount)
iPhone/iPad屏幕可以分辨用户的快速触摸。
这个计数器可以让您知道用户在不移动手指的情况下触摸屏幕的次数。
Android设备不会计算触摸的次数,因此,这个字段始终为1。
阶段(phase)
描述所谓的触摸“阶段(phase)”或状态。
它有助于确定用户是否刚开始触摸,是否用户移动手指,是否用户刚刚抬起手指。
阶段主要分为以下几个部分:
开始(Began)
手指刚刚接触屏幕。
移动(Moved)
手指在屏幕上移动。
静止(Stationary)
手指触摸屏幕,但自最后一帧以来并未移动。
结束(Ended)
手指离开屏幕,是触控的最后一个阶段。
取消(Canceled)
系统已取消触控跟踪,例如,用户将设备接触面部或同时超过5个触摸点。
这是触控的最后一个阶段。
下面是一个用户轻触屏幕即射出光线的脚本示例:
1.varparticle:
GameObject;
2.functionUpdate(){
3. for(vartouch:
TouchinInput.touches){
4. if(touch.phase==TouchPhase.Began){
5. //Constructarayfromthecurrenttouchcoordinates
6. varray=Camera.main.ScreenPointToRay(touch.position);
7. if(Physics.Raycast(ray)){
8. //Createaparticleifhit
9. Instantiate(particle,transform.position,transform.rotation);
10. }
11. }
12. }
13.}
鼠标模拟
除原生的触摸支持以外,UnityiOS/Android还提供鼠标模拟。
您可以使用标准输入类中的鼠标功能。
加速度计
在移动设备移动的过程中,内置的加速度计报告在三维空间三个主要轴上的线性加速度改变。
硬件将直接报告每根轴的加速度作为重力值。
值为1.0代表所给出的轴的负载约为+1g,而-1.0则代表-1g。
如果设备垂直放置(Home键位于下方)于身体正前方,那么X轴在右边是正值,Y轴在上方是正值,Z轴则在指向您本人的一方为正值。
可以访问Input.acceleration属性,检索加速度计值。
以下是使用加速度计移动对象的脚本示例:
1.varspeed=10.0;
2.functionUpdate(){
3. vardir:
Vector3=Vector3.zero;
4.
5. //weassumethatthedeviceisheldparalleltotheground
6. //andtheHomebuttonisintherighthand
7.
8. //remapthedeviceaccelerationaxistogamecoordinates:
9. // 1)XYplaneofthedeviceismappedontoXZplane
10. // 2)rotated90degreesaroundYaxis
11. dir.x=-Input.acceleration.y;
12. dir.z=Input.acceleration.x;
13.
14. //clampaccelerationvectortotheunitsphere
15. if(dir.sqrMagnitude>1)
16. dir.Normalize();
17.
18. //Makeitmove10meterspersecondinsteadof10metersperframe...
19. dir*=Time.deltaTime;
20.
21. //Moveobject
22. transform.Translate(dir*speed);
23.}
低通过滤器
加速度计读数可能被颠簸和噪音影响。
在信号中应用低通滤波器有助于使其更平滑,并去除高频噪音。
以下脚本展示了如何将低通滤波器应用到加速度计读数:
1.varAccelerometerUpdateInterval:
float=1.0/60.0;
2.varLowPassKernelWidthInSeconds:
float=1.0;
3.
4.privatevarLowPassFilterFactor:
float=AccelerometerUpdateInterval/LowPassKernelWidthInSeconds;//tweakable
5.privatevarlowPassValue:
Vector3=Vector3.zero;
6.functionStart(){
7. lowPassValue=Input.acceleration;
8.}
9.
10.functionLowPassFilterAccelerometer():
Vector3{
11. lowPassValue=Mathf.Lerp(lowPassValue,Input.acceleration,LowPassFilterFactor);
12. returnlowPassValue;
13.}
LowPassKernelWidthInSeconds的值越大,过滤值在当前输入样本中汇集的速度越慢(反之亦然)。
在获取加速度计读数时,我希望它能尽可能精确,我该怎么做?
读取Input.acceleration变量并不等于采样硬件。
简而言之,Unity以60Hz的频率采样硬件,并将结果储存到变量中。
事实上,事情并非如此简单——在大量CPU负荷的情况下,加速度计采样不会以相同的时间间隔发生。
因此,系统可能一帧报告两个样本,而下一帧又只有一个样本。
您可以访问加速度计在每帧执行的所有测量。
以下代码将举例说明最后一帧收集的所有加速度计事件的简单平均数:
1.varperiod:
float=0.0;
2.varacc:
Vector3=Vector3.zero;
3.for(varevnt:
iPhoneAccelerationEvent iniPhoneInput.accelerationEvents){
4. acc+=evnt.acceleration*evnt.deltaTime;
5. period+=evnt.deltaTime;
6.}
7.if(period>0)
8. acc*=1.0/period;
9.returnacc;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Unity3D 游戏 开发 键盘 操纵杆 手柄 输入 实现 详解