
要实现角色的手势移动端交互,可以采用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;
}
}
网友评论