Unity3D自学笔记——脚本开发的输入与控制

来源:互联网 发布:练车软件下载 编辑:程序博客网 时间:2024/06/07 17:44

键盘的输入与控制

public static bool GetButton(string buttonName);
当InputManager设置的buttonName键被按下返回true,若一直按着按键不放,则一直返回true。在项目中尽量使用GetButton,以免后期代码过多,导致按键混乱造成不必要的麻烦。

Input.GetButton("Fire1")

public static bool GetButtonDown(string buttonName);
当InputManager设置的buttonName键被按下瞬间返回true,在整过按键操作中只会返回一次true。

public static bool GetButtonUp(string buttonName);
当InputManager设置的buttonName键被释放返回true。

 bool key;    bool keyDown;    bool keyUp;    // Update is called once per frame    void Update () {        key = Input.GetButton("Jump");        keyDown = Input.GetButtonDown("Jump");        keyUp = Input.GetButtonUp("Jump");        if (keyDown)        {            this.transform.localScale = transform.localScale + Vector3.one;        }        if (key)        {            this.transform.Rotate(Vector3.up, 45 * Time.deltaTime);        }        if(keyUp)        {            this.transform.localScale = transform.localScale - Vector3.one;        }    }

public static bool GetKey(string name);
当键盘的name按键被按下返回true。

Input.GetKey("up")

public static bool GetKey(KeyCode key);
根据KeyCode获得键盘name

Input.GetKey(KeyCode.UpArrow)

public static float GetAxis(string axisName);
根据坐标轴名称返回虚拟坐标系中的值。返回值在-1 到 1之间,轴名称为InputManger里每个轴的Name属性,如Horizontal, Vertical。Gravity代表从-1或1回到0的速度,Sensitivity代表从0到-1或1的速度,默认都为3,值越大速度越快。Snap若被勾选,则按下相方向键,立刻归0,若为勾选,则根据Gravity速度返回至0。如角色控制一般都勾选Snap,赛车游戏则根据情况勾选。

 bool key;    bool keyDown;    float axis;    // Update is called once per frame    void Update () {        axis = Input.GetAxis("Mouse X");        this.transform.position = new Vector3(axis, 0, 0);    }

public static float GetAxisRaw(string axisName);
根据坐标轴名称返回虚拟坐标系中的值。键盘和控制器取值范围在-1…1之间,此时输入没有使用平滑。键盘输入必然会是-1、0或1。

鼠标的输入与控制

MonoBehaviro
参见 MonoBehaviro Input 输入

光线投射
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

origin : 射线起始点
direction:射线方向
hitInfo:射到物体上的信息
maxDistance : 射线最大长度
layerMask:物体层级遮罩,不设置则打到所有物体
这里写图片描述

例1:物体撞击地面前减速

public float rayDistance = 4f;    void Update()    {        Ray testRay = new Ray(transform.position, Vector3.down);        RaycastHit hitInfomation;        //射线撞击到GUI元素或Collider        if (Physics.Raycast(testRay,out hitInfomation, rayDistance))        {            //撞击到地面            if (hitInfomation.collider.name == "Plane")            {                //减速                transform.GetComponent<Rigidbody>().drag = 8f;            }        }        Debug.DrawRay(transform.position, Vector3.down * rayDistance, Color.red);    }

例2:利用RayCast监测鼠标点击

    public Camera myCamera = null;    void Update()    {        if (!Input.GetMouseButtonDown(0))            return;        //镜头的点转换为射线        Ray r = myCamera.ScreenPointToRay(Input.mousePosition);        RaycastHit hit;        if(Physics.Raycast(r, out hit, 1000))        {            if(hit.collider.name == "Cube")            {                Debug.Log("Mouse Click");            }        }    }

Space 空间类型

World Space:世界坐标系的位置
Screen Space:屏幕空间,2维空间,Z轴为0
Viewport Space:2维空间,(0,0) 到 (1,1)

Camera.ScreenPointToRay
返回一条从镜头到Screen的射线
Camera.ViewportPointToRay
返回一条从镜头到Viewport的射线

例3:利用鼠标拖拽移动物体

 public Camera myCamera = null;    public float depth = 10f;    void OnMouseEnter()    {        transform.localScale = transform.localScale + Vector3.one;    }    void OnMouseExit()    {        transform.localScale = transform.localScale - Vector3.one;    }    void OnMouseOver()    {        transform.Rotate(Vector3.up, 45 * Time.deltaTime);    }    void OnMouseDrag()    {        //MoveObject();        MoveObjectFixdepth();    }    void MoveObject()    {        Ray r = myCamera.ScreenPointToRay(Input.mousePosition);        RaycastHit hit;        if(Physics.Raycast(r, out hit, 1000f, 1))        {            this.transform.position = new Vector3(hit.point.x, hit.point.y + 0.5f, hit.point.z);            Debug.DrawLine(r.origin, hit.point, Color.red);        }    }    void MoveObjectFixdepth()    {        Vector3 mouseScreen = Input.mousePosition;        mouseScreen.z = depth;        Vector3 mouseWorld = myCamera.ScreenToWorldPoint(mouseScreen);        this.transform.position = mouseWorld;    }
0 0
原创粉丝点击