Unity Android触屏点击事件处理

1、获取屏幕输入

新建脚本TouchInput,添加到MainCamera(主摄像机)上

登录后复制


public class TouchInput : MonoBehaviour
{
    public LayerMask touchInputMask;  //声明层级,射线只与设定的层级进行检测
    private Camera myCamera;          //声明摄像机

    private List<GameObject> touchList = new List<GameObject>();    //保存当前按下的物体,需要用List进行动态添加
    private GameObject[] touchesOld; //保存上一次按下的物体,不需要动态添加,与当前按下的物体比较,判断哪些物体取消了点击
    private RaycastHit hit;
    void Start()
    {
        myCamera = GetComponent<Camera>();
    }
    void Update()
    {
        if (Input.touchCount > 0)   //如果存在触屏输入
        {
            //初始化touchesOld,并保存上一帧按下的所有按键
            touchesOld = new GameObject[touchList.Count];
            touchList.CopyTo(touchesOld);
            touchList.Clear();  //清空列表,用于获取新的输入,保存当前按下的物体

            foreach (Touch touch in Input.touches)  //遍历所有的屏触屏输入
            {
                Ray ray = myCamera.ScreenPointToRay(touch.position);    //从触屏的地方发射射线

                if (Physics.Raycast(ray, out hit, touchInputMask))
                {
                    GameObject recipient = hit.transform.gameObject;    //获取射线碰撞的物体
                    touchList.Add(recipient);     //将该物体加入当前触碰列表

                    if (touch.phase == TouchPhase.Began)    //判断触屏的类型,如果为刚刚接触屏幕
                    {
                        //发送委托,调用物体OnTouchDown的方法
                        recipient.SendMessage("OnTouchDown", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                    if (touch.phase == TouchPhase.Ended)    //判断触屏的类型,如果手指离开屏幕
                    {
                        //发送委托,调用物体OnTouchUp的方法
                        recipient.SendMessage("OnTouchUp", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                    //如果长按屏幕或在屏幕上滑动
                    if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved)    
                    {
                        //发送委托,调用物体OnTouchStay的方法
                        recipient.SendMessage("OnTouchStay", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                    if (touch.phase == TouchPhase.Canceled) //如果手指数量超过追踪上线,或用脸等平面接触屏幕
                    {
                        //发送委托,调用物体OnTouchExit的方法
                        recipient.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
            foreach (GameObject g in touchesOld)    //遍历上一帧点击的物体
            {
                if (!touchList.Contains(g))         //如果列表中不包含上一帧的物体
                {
                    //那么委托调用物体的OnTouchExit方法,该物已经取消点击
                    g.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
                }
            }
        }
    }
}

新建脚本Button

登录后复制


public class Button : MonoBehaviour
{
    public Color defaultColor;	//默认颜色
    public Color selectedColor;	//点击后的颜色
    private Material mat;
    private void Start()
    {
        mat = gameObject.GetComponent<Renderer>().material;
    }
    private void OnTouchDown()
    {
        mat.color = selectedColor;
    }
    private void OnTouchUp()
    {
        mat.color = defaultColor;
    }
    private void OnTouchStay()
    {
        mat.color = selectedColor;
    }
    private void OnTouchExit()
    {
        mat.color = defaultColor;
    }
}

添加几个Cube,将Button添加到Cube上

android unity 点击屏幕 unity手机触屏_ide


设置每个Cube的颜色

Build到手机后的运行结果

android unity 点击屏幕 unity手机触屏_ide_02

2、拖动效果

这里的Slider并不是UnityUI中的Slider

是使用基本物体拼装成的Slider

这里使用了3D物体中的Quad和Cube

android unity 点击屏幕 unity手机触屏_Unity_03


android unity 点击屏幕 unity手机触屏_Unity_04


然后可以在 Slider上创建一个BoxCollider 来限制Button的移动

android unity 点击屏幕 unity手机触屏_List_05

新建脚本Slider

登录后复制


public class Slider : MonoBehaviour
{
    public Transform button;
    private Vector3 targetPos;
    private void Start()
    {
        targetPos = button.position;
    }
    private void Update()
    {
        button.position = Vector3.Lerp(button.position, targetPos, Time.deltaTime * 10f);
    }
    void OnTouchStay(Vector3 point)
    {
        targetPos = new Vector3(point.x, targetPos.y, targetPos.z);
    }
}

然后将Button添加到Button上

运行后就能拖动Button

接下来是显示数据,添加一个3DText设为Slider的子物体,并调整到合适的位置和大小

新建脚本Slider,添加到Slider上

登录后复制


public class Slider : MonoBehaviour
{
    public Transform knbo;
    public TextMesh textMesh;
    private Vector3 targetPos;

    private float sliderPercent;
    private float sliderLength;

    private void Start()
    {
        sliderLength = gameObject.GetComponent<BoxCollider>().size.x - 0.4f;
        targetPos = knbo.position;
    }
    private void Update()
    {
        knbo.position = Vector3.Lerp(knbo.position, targetPos, Time.deltaTime * 10f);
		//计算slider的比例
        sliderPercent = Mathf.Clamp01((knbo.localPosition.x + sliderLength / 2) / sliderLength);
													//保留一位小数
        textMesh.text = string.Format(sliderName + ": " + "{0:F1}", sliderPercent);	
    }
    public float GetSliderPercent()
    {
        return sliderPercent;
    }
    void OnTouchStay(Vector3 point)
    {
        targetPos = new Vector3(point.x, targetPos.y, targetPos.z);
    }
}

android unity 点击屏幕 unity手机触屏_android unity 点击屏幕_06

   

   

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空