美文网首页
【Vuforia】013-角色的交互:双击与长按

【Vuforia】013-角色的交互:双击与长按

作者: lijianfex | 来源:发表于2018-11-20 08:26 被阅读11次

要实现角色的手势移动端交互,可以采用EasyTouch 插件,当然也可以自己使用原生的API实现。
EasyTouch 插件:教学视频推荐

本次采用原生的方式

1、为了检测是否触碰到角色,我们需要 为 角色添加 组件 Capsule Collider
2、双击检测:
//双击
    public bool IsDoubleTouch()
    {
        
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            if (Input.GetTouch(0).tapCount == 2)
            {
                return true;
            }
        }
        return false;
    }

Input.touchCount == 1判断是否一根手指按下,Input.GetTouch(0).phase == TouchPhase.Began :判定按下的手指的状态出是 刚开始Input.GetTouch(0).tapCount == 2 :判断该手指是否连续按下两次

3、长按检测

长按,需要记录按下的时间,按下一定时间后才是有效的长按,同时我们也要判断首次按下,所以声明变量
isFirstTouch :是否首次按下;touchTime : 记录按下的时刻,用来计算按下时间长度

//长按
public bool IsLongTouch()
    {
        
        if (Input.touchCount == 1)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                isFirstTouch = true;
                touchTime = Time.time;
            }
            else if (touch.phase == TouchPhase.Stationary)
            {
                if (isFirstTouch && Time.time - touchTime > 1f)
                {
                    isFirstTouch = false;
                    return true;
                }
            }
            else
            {
                isFirstTouch = false;
            }
        }
        return false;
    }

touch.phase == TouchPhase.Stationary: 表示是否一直按下的状态


销毁

在按下后,从相机屏幕空间,按下的位置发射射线检测,检测碰撞到角色后,触发双击或长按销毁
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;

void Update()
    {
        //销毁
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                if(hitInfo.collider.gameObject.layer==LayerMask.NameToLayer("AIXI"))
                {
                    if (IsDoubleTouch())//双击角色销毁
                    {
                        Destroy(hitInfo.collider.gameObject);
                    }

                    if (IsLongTouch())//长按销毁
                    {
                        Destroy(hitInfo.collider.gameObject);
                    }
                }            

                
            }
        }

    }

完整代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 手的交互功能
/// </summary>
public class TouchTap : MonoBehaviour
{
    private float touchTime;
    private bool isFirstTouch;

    void Update()
    {
        //销毁
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                if(hitInfo.collider.gameObject.layer==LayerMask.NameToLayer("AIXI"))
                {
                    if (IsDoubleTouch())//双击角色销毁
                    {
                        Destroy(hitInfo.collider.gameObject);
                    }

                    if (IsLongTouch())//长按销毁
                    {
                        Destroy(hitInfo.collider.gameObject);
                    }
                }            

                
            }
        }

    }

    //双击
    public bool IsDoubleTouch()
    {
        
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            if (Input.GetTouch(0).tapCount == 2)
            {
                return true;
            }
        }
        return false;
    }


    //长按
    public bool IsLongTouch()
    {
        
        if (Input.touchCount == 1)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                isFirstTouch = true;
                touchTime = Time.time;
            }
            else if (touch.phase == TouchPhase.Stationary)
            {
                if (isFirstTouch && Time.time - touchTime > 1f)
                {
                    isFirstTouch = false;
                    return true;
                }
            }
            else
            {
                isFirstTouch = false;
            }
        }
        return false;
    }
}

相关文章

网友评论

      本文标题:【Vuforia】013-角色的交互:双击与长按

      本文链接:https://www.haomeiwen.com/subject/wedafqtx.html