您的位置:首页 > 移动开发 > Unity3D

Unity3d热门基础之常用API之Input使用详解

2017-11-07 20:19 453 查看

Input

包装了输入功能的类,可以读取输入管理器中设置的按键, 以及访问移动设备的多点触控或加速感应数据。

•建议在Update中监测用户的输入。

引入

Ø  什么是 Input 类

•包装了输入功能的类,可以读取输入管理器中设置的按键, 以及访问移动设备的多点触控或加速感应数据。


•建议在Update中监测用户的输入

鼠标输入

Ø  获取鼠标输入

•当指定的鼠标按钮被按下时返回true

    bool result=Input.GetMouseButton(0);    

•在用户按下指定鼠标按键的第一帧返回true

    bool result= Input. GetMouseButtonDown(0);
  

•在用户释放指定鼠标按键的第一帧返回true

    bool result= Input. GetMouseButtonUp(0); 


•按钮值设定:

0对应左键 ,
1对应右键 , 2对应中键。  

 

输入管理器(虚拟轴)

InputManager(输入管理器):

      Edit—>ProjectSettings—>Input

使用脚本通过虚拟轴名称获取自定义键的输入。

作用:玩家可以在游戏启动时根据个人喜好对虚拟轴进行修改。

用虚拟按钮绑定按键

 

水平负方向2个按钮left和a,正方向2个按钮right和d,可修改

Type可选择键盘鼠标输入

Axis可修改X轴方向Y轴方向滚轮等

默认绑定最多4个按键,若还想多,就再弄一个同名字的虚拟轴。

若修改的名称格式不对,光标移开会自己清除,照着默认格式写。

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) ,

--鼠标移动和滚轮(Mouse Movement),

--摇杆(Jo
b4b0
ystick Axis) 。

•Axis:设备的输入轴(摇杆,鼠标,手柄等)

•*Joy Num:设置使用哪个摇杆。默认是接收所有摇杆的输 入。仅用于输入轴和非按键。

键盘输入

Ø  获取键盘输入

•当通过名称指定的按键被用户按住时返回true

    bool result=Input.GetKey(KeyCode.A); 


•当用户按下指定名称按键时的那一帧返回true

    bool result=Input. GetKeyDown(KeyCode.A); 


•在用户释放给定名称按键的那一帧返回true

    bool result=Input.GetKeyUp(KeyCode.A); 


练习1:瞄准镜

重点:   lerp的应用

 

/// <summary>

/// 镜头缩放

/// </summary>

public class CameraZoom : MonoBehaviour

{

    privatebool isFar = true;

 

    privateCamera camera;

    privatevoid Start()

    {

       camera = GetComponent<Camera>();

    }

 

    private void Update1()

    {

        if(Input.GetMouseButtonDown(1))

        {//按下鼠标右键

            isFar = !isFar;//改变状态

           if (isFar)

           {   //拉远   20 -->  60

               camera.fieldOfView = 60;

           }

           else

           {

               //拉近   60 -->  20

               camera.fieldOfView = 20;

           }

        }

    }

    

    private void Update2()

    {

        if(Input.GetMouseButtonDown(1))

        {//按下鼠标右键

           isFar = !isFar;//改变状态

        }

        //每帧执行

        if(isFar)

       {   //拉远   20 -->  60

           if (camera.fieldOfView < 60)

               camera.fieldOfView += 2;

        }

       else

        {

           //拉近   60 -->  20

           if (camera.fieldOfView > 20)

               camera.fieldOfView -= 2;

        }

    }

 

    //插值 Lerp:根据比例返回起点/终点之间的数值。

    private void Update3()

    {

        if(Input.GetMouseButtonDown(1))

        {//按下鼠标右键

           isFar = !isFar;//改变状态

        }

        //每帧执行

        if(isFar)

       {   //拉远   20 -->  60

           //起点向终点无限接近、终点与比例不变

           //现象:由快到慢

           camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, 60, 0.1f);

        }

       else

        {

           //拉近   60 -->  20

           camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, 20, 0.1f);

        }

    }

 

    //多个缩放等级60     50  20

    publicint[] zoomLevel;

    privateint index;

    privatevoid Update()

    {

        if(Input.GetMouseButtonDown(1))

        {//按下鼠标右键

           //如果当前索引小于最大索引   ? 索引增加 :   返回第一个索引

           //index = index < zoomLevel.Length - 1 ? index + 1 : 0;

           index = (index + 1) % zoomLevel.Length;// 周期性的变化

        }

       camera.fieldOfView = Mathf.Lerp(camera.fieldOfView, zoomLevel[index],0.1f);

 

        //虚拟按钮             真实按键

        if(Input.GetKey(KeyCode.W))

        {

           transform.Translate(0, 0, 1);

        }

    }

}

练习2:飞机 (移动+限制边界)

Ø  键盘垂直输入使飞机前后移动,

Ø  键盘水平输入使飞机左右移动。

using UnityEngine;

using System.Collections;

public class plane : MonoBehaviour

{

    publicfloat speed = 5;

    privatevoid Update()

    {   //a -1负方向   0  1d正方向

       float horDirection = Input.GetAxis("Horizontal");

       float verDirection = Input.GetAxis("Vertical");

        if(horDirection != 0 || verDirection != 0)

        {

           Movement(horDirection, verDirection);

        }

    }

    publicvoid Movement(float x,float z)

    {

        x*= Time.deltaTime * speed;

        z*= Time.deltaTime * speed;

//限制范围:世界坐标-->屏幕坐标

       LimitPosion(ref x);

       transform.Translate(x, 0, z);

    }

    privatefloat LimitPosion(ref float x)

    {

       Vector3 screenPoint =Camera.main.WorldToScreenPoint(transform.position);

        //如果到了最左边还想向左移动停 如果到了最右边还想向右移动停  
x<0表示负方向,若没这个条件,会成为死循环,永远卡在x=0

       if(screenPoint.x <=0 && x < 0 ||screenPoint.x>=Screen.width && x>0)//不要写==0,写的太死了

           x=0;

        //如果到了最上面,还想向上走,则从下边出来    
在世界坐标系中,上是z,在屏幕坐标系上是y

       if(screenPoint.y>Screen.height)

           screenPoint.y = 0;

       if(screenPoint.y <0)

           screenPoint.y = Screen.height;

        //屏幕坐标-->世界坐标-->作用到物体

       transform .position = Camera.main.ScreenToWorldPoint(screenPoint);

       return x;

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: