闲鱼技术01 发表于 2022-1-10 12:34

Unity输入系统

一:Input输入对象

二:Touch输入对象

三:飞机案例讲解

四:本章总结与练习

<hr/>一:Input输入对象

       Unity提供的Input可以负责获取用户大部分的输入,如键盘,鼠标,加速计,陀螺仪,按钮等,Input在外部输入系统和Unity内部之间架起了一座桥梁,常见的函数如下表所示:


1:获取鼠标点击,其中Fire1表示左键,Fire2表示右键,Fire3表示鼠标滚轮。Input.mousePosition是一个三维的坐标,用于获取当前鼠标的像素坐标。像素坐标的坐标系是以屏幕左下角为(0,0)点,右上角为(Screen.width,Screen.height)。
        if(Input.GetButton("Fire1")){
                Debug.Log(“Fire1");
                Debug.Log(Input.mousePosition);
        }
        if(Input.GetButtonDown("Fire1")){
                Debug.Log("Fire1 Down");
        }
        if(Input.GetButtonUp("Fire1")){
                Debug.Log("Fire1 Up");
        }
      我们也可以使用GetMouseButton方法、GetMouseButtonDown方法、GetMouseButtonUp方法来监听鼠标的点击,传入的参数为0,1,2,其中0代表鼠标左键,1代表右键,2代表中间滚轮。
2:anyKey变量与anyKeyDown
anyKey用来监听当前是否有按键按下,不管什么按键都会触发,若按住键不放则一直触发。
anyKeyDown也能监听当前是否有按键按下,若按住键不放只会在按住的时候触发一次,之后就不会触发,直到松开再次按下便能触发。
3:inputString变量
变量inputString返回键盘在这一帧中输入的字符串,在返回的字符串中只包含有ASCII码的字符串。若没有则为一个空串。可用如下代码进行测试,
void Update()
    {
                if(Input.inputString !="")
                {
                        Debug.Log(Input.inputString);
                }
        }
4:GetAxis方法和GetAxisRaw方法
GetAxis方法和GetAxisRaw方法都是获取虚拟轴的方法。在游戏的开发过程中,经常会在屏幕中添加一些2D的虚拟轴,可以通过触控或者鼠标事件改变虚拟轴的值来控制场景中的游戏对象。如下代码所示。
using UnityEngine;
using System.Collections;
public class TouchDemo : MonoBehaviour {
        // Update is called once per frame
        void Update () {
                Debug.Log(Input.GetAxis("Horizontal"));//-1~1
                Debug.Log(Input.GetAxis(“Vertical"));//-1~1
      float h = Input.GetAxisRaw ("Horizontal");
                   float v = Input.GetAxisRaw ("Vertical");
                   this.transform.Rotate (0,h,0);
                   this.transform.Rotate (v,0,0);
                  //this.transform.Translate (h,0,v);
      }
}
       如果以上GetAxis换成GetAxisRaw就只有-1、0、1,而上面的值都是在-1~1之间变化。关于Axis的名称可以在Unity中查看,如下图所示:
5:GetKey方法、GetKeyDown方法、GetKeyUp方法
这3种方法用于监听键盘上的按键的状态,其他跟上面差不多,代码如下。
        void Update () {
                if(Input.GetKey("up")){
                        Debug.Log("up key");
                }
                if(Input.GetKeyDown(KeyCode.UpArrow)){//可以用键码 键名”up”的键码就是UpArrow
                        Debug.Log("up key down");
                }
                if(Input.GetKeyUp(KeyCode.UpArrow)){
                        Debug.Log("up key up ");
                }
        }


6:输入管理器
输入管理器可以设置项目的各种输入操作,设置的目的为:
(1)让开发人员在脚本中通过轴名称使用输入,降低程序的耦合性
(2)游戏玩家自定义游戏输入按键,提高玩家的满意度,玩家可以自己更换按钮。
具体属性介绍:

[*]Axes:设置当前项目中的所有输入轴,size为数量,下面是具体的每个
[*]Name:名称
[*]Descriptive Name:轴的正向描述
[*]Descriptive Negative Name:反向描述
[*]Negative Button:反向按钮,会给轴发送一个负值
[*]Positive Button:正向按钮,会给轴发送一个正值
[*]Alt Negative Button:备选反向按钮,会给轴发送一个负值
[*]Alt Positive Button:备选正向按钮,会给轴发送一个正值
[*]Gravity:重力,输入复位的速度
[*]Dead:阀值,任何小于该值的输入值都会被视为0,用于摇杆
[*]Sensitivity:灵敏度
[*]Snap对齐,如果启用该设置,当收到反向的输入信号时候,轴的数值会立即设置为0,仅用于鼠标和键盘输入。
[*]Invert反转:启用该参数可以让正向按钮发送负值,反向按钮发送正值
[*]Type:类型,对于所有的按钮,都应该设置为Key/Mouse类型,对于鼠标移动和滚轮,应设置为MouseMovement,摇杆设置为摇杆轴JoystickAxis,用户移动窗口设置为窗口移动WindowMovement
[*]Axis:轴
[*]JoyNum:设置使用哪个摇杆,默认接受所有的摇杆输入
二:Touch输入对象

       Unity Remote 是一种应用程序,它允许您使用设备远程控制 Unity 中的工程。这对快速开发非常有用,因为您无需在每次更改之后重新编译工程并将其部署到设备。
       如何使用Unity remote?
       (如果是UnityRemote4,则必须连接的Unity必须是4.5版本以上)
一. Android版
       首先应该确保安装了最新的 Android SDK(这对于在设备上设置端口转发非常必要)。
然后,使用 USB 连接线连接设备与电脑,并启动Unity Remote 应用程序。
在 Unity 编辑器中按下播放 (Play) 时,设备将充当远程控制,并将加速计和触摸输入事件传到正在运行的游戏中。
■使用步骤:
1,手机端下载 Unity Remote.apk。(可在Google Play下载,或在自己手机对应的应用商店下载)。
2,确保手机和电脑正常连接。(手机USB连接必须开启【允许调试】模式)。
3,手机端运行 Unity Remote.apk。运行后出现一个黑色的、带有unity logo的画面。
4,在电脑端打开 Unity。(如果是Remote4,请在Edit->Project Settings->Editor下的Unity Remote下选择Any Android Device。(这个选项是针对项目的,所以换其它项目的时候必须要重新设定))。
5,在电脑端运行游戏,可以看到手机和电脑是同步运行的了!
Touch分析

(1)新建一个场景,创建一个小球,设置位置为初始位置。同时调整摄像机位置为z=-20;
(2)创建一个脚本命名为TouchTest,将其挂在到主摄像机之上,脚本代码如下:
public class TouchTest : MonoBehaviour {
        public GameObject ball;        private float lastDis = 0;
        private float cameraDis=-20f;
        public float ScaleDump=0.1f;
        // Use this for initialization        void Start () {
        }
    // Update is called once per frame        void Update () {
                if (Input.touchCount == 1) {
                        Touch t = Input.GetTouch (0);
                        if (t.phase == TouchPhase.Moved) {
                                ball.transform.Rotate (Vector3.right, Input.GetAxis ("Mouse Y"), Space.World);
                                ball.transform.Rotate (Vector3.up, -1 * Input.GetAxis ("Mouse X"), Space.World);
                        }
                }else if (Input.touchCount > 1) {
                        Touch t1 = Input.GetTouch (0);
                        Touch t2 = Input.GetTouch (1);
                        if (t2.phase == TouchPhase.Began) {
                                lastDis = Vector2.Distance (t1.position, t2.position);
                        }else {
                                if (t1.phase == TouchPhase.Moved && t2.phase == TouchPhase.Moved) {
                                        float dis = Vector2.Distance (t1.position,t2.position);
                                        if (Mathf.Abs (dis - lastDis) > 1) {
                                                cameraDis += (dis - lastDis) * ScaleDump;
                                                cameraDis = Mathf.Clamp (cameraDis,-40,-5);
                                                lastDis = dis;
                                        }
                                }
                        }
                }
        }        void LateUpdate(){
                this.transform.position = new Vector3 (0,0,cameraDis);
        }
}
三:飞机案例讲解

       本案例我们需要实现以下功能,飞机向前飞行,当我们按下键盘上的ASWD或者上下左右键,飞机能够转向并且发生倾斜。当松开键盘之后,飞机回归原来的位置。通过此案例,让大家掌握欧拉角以及物体的旋转控制。
(1)将项目所用到的飞机以及模型资源导入到Unity工程中。
(2)选中飞机模型,airPlane.FBX,将其拖拽到场景之中。
(3)为飞机模型添加纹理。
(4)为飞机添加RigidBody同时取消UseGravity重力作用。
(5) 将制作好的地形,调整合适的位置,进行添加。
(6)下面开始编写飞机控制脚本AirControl。
using UnityEngine;
using System.Collections;
public class AirControl : MonoBehaviour {
        // Use this for initialization
        private Transform m_transform;//保存Transform实例
        public float speed=0.06f;   //飞行速度
        private float rotationz=0.0f;//绕Z轴旋转量
        public float rotateSpeed_AxisZ=45f;//Z轴旋转角度
        public float rotationSpeed_AxisY=20f;//Y轴旋转角度
        void Start () {
                m_transform = this.transform;
                //this.gameObject.GetComponent<Rigidbody> ().useGravity = false;
        }
// Update is called once per frame
        void Update () {
      //向前移动
        m_transform.Translate (new Vector3(0,0,speed*Time.deltaTime*0.01f));
        //找到螺旋桨,让螺旋桨转起来
        GameObject.Find ("propeller").transform.Rotate (new Vector3(0,1000*Time.deltaTime,0));
                //获取飞机绕Z轴的旋转量
                rotationz = m_transform.eulerAngles.z;
                if (Input.GetKey (KeyCode.A)) {
                        if(rotationz<=45 || rotationz>=315)
                        {
                                //飞机向左倾斜
                                m_transform.Rotate(new Vector3(0,0,(Timespan class="p">.deltaTime*rotateSpeed_AxisZ)),Space.Self);
                        }
                        m_transform.Rotate(new Vector3(0,-Time.deltaTime*30,0),Space.World);
                }else if (Input.GetKey (KeyCode.D)) {
                        if(rotationz<=45 || rotationz>=315)
                        {
                                //飞机向右倾斜
                                m_transform.Rotate(new Vector3(0,0,-(Time.deltaTime*rotateSpeed_AxisZ)),Space.Self);
                        }
                                m_transform.Rotate(new Vector3(0,Time.deltaTime*30,0),Space.World);
                }else {
                        BackToBalance();
                }
        }
void BackToBalance()        {
                if (rotationz <= 180) {
                        if(rotationz-0<=2)
                        {
                                m_transform.Rotate(new Vector3(0,0,Time.deltaTime*-1));
                        }else{
                                m_transform.Rotate(new Vector3(0,0,Time.deltaTime*-40));
                        }
                }if (rotationz > 180) {
                        if(360-rotationz<=2)
                        {
                                m_transform.Rotate(new Vector3(0,0,Time.deltaTime*1));
                        }else{
                                m_transform.Rotate(new Vector3(0,0,Time.deltaTime*40));
                        }
                }
        }
}
四:本章总结与练习

       将刚才的飞机案例,修改为通过手机触摸实现,当玩家触摸飞机的左半侧时候飞机左转,触摸屏幕的右半侧时候飞机右转。没有触摸事件发生时候恢复平衡状态。
页: [1]
查看完整版本: Unity输入系统