手势识别控制
- 判断手势滑动的长度的x的绝对值和y的绝对值
- 键盘识别省略
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
public class PlayMove : View
{
#region 字段
//水平移动和手势控制
CharacterController m_cc;
float speed = 20f;
InputDirection inputDir=InputDirection.NULL;
bool activeInput = false;//是否按下鼠标
Vector3 m_mousePos;//记录鼠标按下的位置
//水平移动
int m_NowIndex=1;//当前主角所在位置的下标
int m_TargetIndex = 1;//即将移动的位置下标 0 最左 1中级 2右边
float m_XDistance;//水平移动的偏移量
float moveSpeed = 13f;//水平移动的速度
//向上跳
float m_YDistance;//向上移动的偏移量
float gravity = 9.8f;//下降的重力
float m_jumpValue=5f;//向上移动的大小
#region 属性
public override string Name
{
get
{
return Const.V_PlayerMove;
}
}
public float Speed
{
get
{
return speed;
}
set
{
speed = value;
if (speed > m_MaxSpeed)
{
speed = m_MaxSpeed;
}
}
}
#endregion
#region 移动
/// <summary>
/// 移动的协程
/// </summary>
/// <returns></returns>
IEnumerator UpdateAction()
{
while (true)
{
if (gm.IsPlay && !gm.IsPause)
{
UpdateUI();//更新UI
m_YDistance -= gravity * Time.deltaTime;
m_cc.Move((transform.forward * Speed + new Vector3(0, m_YDistance, 0)) * Time.deltaTime);
MoveController();
UpdatePosition();
UpdateSpeed();
}
#region 水平移动的限制,防止速度过快穿过道路
if (transform.position.x >= 2)
{
transform.position = new Vector3(2, transform.position.y, transform.position.z);
m_NowIndex = 2;
}
if (transform.position.x <= -2)
{
transform.position = new Vector3(-2, transform.position.y, transform.position.z);
m_NowIndex = 0;
}
#endregion
yield return 0;
}
}
/// <summary>
/// 获取手势输入
/// </summary>
void GetInputDirection()
{
inputDir = InputDirection.NULL;
#region 手势输入
if (Input.GetMouseButtonDown(0))
{
activeInput = true;
m_mousePos = Input.mousePosition;//记录鼠标按下的位置信息
}
if (Input.GetMouseButton(0) && activeInput)
{
Vector3 dir = Input.mousePosition - m_mousePos;//滑动长度
if (dir.magnitude > 20)
{
//如果 X>Y 就按照X来算,在进行判断X是否是大于0.大于0为右
if (Mathf.Abs(dir.x) > Mathf.Abs(dir.y) && dir.x > 0)
{
inputDir = InputDirection.Right;
}
else if (Mathf.Abs(dir.x) > Mathf.Abs(dir.y) && dir.x < 0)
{
inputDir = InputDirection.Left;
}
else if (Mathf.Abs(dir.x) < Mathf.Abs(dir.y) && dir.y > 0)
{
inputDir = InputDirection.Up;
}
else if (Mathf.Abs(dir.x) < Mathf.Abs(dir.y) && dir.y < 0)
{
inputDir = InputDirection.Down;
}
activeInput = false;
}
}
#endregion
#region 键盘识别
if (Input.GetKeyDown(KeyCode.W)||Input.GetKeyDown(KeyCode.Space))
{
inputDir = InputDirection.Up;
}
else if (Input.GetKeyDown(KeyCode.A))
{
inputDir = InputDirection.Left;
}
else if (Input.GetKeyDown(KeyCode.D))
{
inputDir = InputDirection.Right;
}
else if (Input.GetKeyDown(KeyCode.S))
{
inputDir = InputDirection.Down;
}
#endregion
}
/// <summary>
/// 更新主角的位置信息(水平移动)
/// 设置下标的值,不移动
/// </summary>
void UpdatePosition()
{
GetInputDirection();
switch (inputDir)
{
case InputDirection.NULL:
break;
case InputDirection.Right:
if (m_TargetIndex < 2 )//判断水平移动的目标下标,
{
m_TargetIndex++;//目标下标自加
m_XDistance = 2;//主角需要移动到的位置为2
Game.Instance.sound.PlayEffect(Clip.uiHuangDong);
SendMessage("AnimManager",inputDir);//播放动画
}
break;
case InputDirection.Left:
if (m_TargetIndex >0 )
{
m_TargetIndex--;
m_XDistance = -2;
Game.Instance.sound.PlayEffect(Clip.uiHuangDong);
SendMessage("AnimManager", inputDir);
}
break;
case InputDirection.Up:
if (m_cc.isGrounded)//判断是否在地面
{
m_YDistance = m_jumpValue;//在地面就对Y轴的偏移量进行赋值
Game.Instance.sound.PlayEffect(Clip.uiJump);
SendMessage("AnimManager", inputDir);
}
break;
case InputDirection.Down:
if (!m_isSlider)//判断是否是滑动
{
m_isSlider = true;
m_SliderTime = 0.733f;//对滑动时间进行赋值
Game.Instance.sound.PlayEffect(Clip.uiSlider);
SendMessage("AnimManager", inputDir);
}
break;
}
}
/// <summary>
/// 更新主角的位置信息 水平移动
/// </summary>
void MoveController()
{
//左右移动
if (m_NowIndex!=m_TargetIndex)//判断主角的所在的位置下标是否和目标下标一致
{
//需要移动的距离 使用插值运算
float move = Mathf.Lerp(0, m_XDistance, moveSpeed * Time.deltaTime);
transform.position += new Vector3(move, 0, 0);//移动
m_XDistance -= move;//因为主角是在时刻移动的,如果不对m_XDistance进行限制,主角会一直向左或向右移动
//判断是否到了目标点,因为插值运算和面的变化会很慢 强制到目标点
if (Mathf.Abs(m_XDistance) < 0.05f)
{
m_XDistance = 0;
m_NowIndex = m_TargetIndex;
switch (m_NowIndex)
{
case 0:
transform.position = new Vector3(-2, transform.position.y, transform.position.z);
break;
case 1:
transform.position = new Vector3(0, transform.position.y, transform.position.z);
break;
case 2:
transform.position = new Vector3(2, transform.position.y, transform.position.z);
break;
}
}
}
//进行滑动限定,防止一直滑动
if (m_isSlider)
{
m_SliderTime -= Time.deltaTime;
if (m_SliderTime < 0)
{
m_isSlider = false;
m_SliderTime = 0;
}
}
}
/// <summary>
/// 更新速度,随着距离的增加速度增加
/// </summary>
void UpdateSpeed()
{
m_SpeedAddCount += Speed * Time.deltaTime;//S=V*T
if (m_SpeedAddCount > m_SpeedAddDis)
{
m_SpeedAddCount = 0;
Speed += m_SpeedAddRate;
}
}
/// <summary>
/// 更新UI
/// </summary>
void UpdateUI()
{
//更新距离
DistanceArgs e = new DistanceArgs()
{
distance = (int)transform.position.z
};
SendEvent(Const.E_UpdateDistance,e);//发送更新距离的事件
}
#endregion
#region 事件回调函数
public override void RegisterAttentionEvenr()
{
}
public override void HandleEvent(string name, object data = null)
{
}
#endregion
有需要学习视频的欢迎关注微信公众号