萌熊跑酷项目-手势控制
手势五种状态
public static class Consts {
//事件名字
public const string E_ExitScenes = "E_ExitScenes";//ScenesArgs
public const string E_EnterScenes = "E_EnterScenes";//ScenesArgs
public const string E_StartUp = "E_StartUp";
public const string E_EndGame = "E_EndGame";
//model名字
//view名字
public const string V_PlayerMove = "V_PlayerMove";
public const string V_PlayerAnim = "V_PlayerAnim";
}
//输入手势
public enum InputDirection {
NULL,
Right,
Left,
Down,
Up
}
手势判断
判断过程如图最上图
x方向的位移距离大于y轴方向的距离 时,左右移动 x>0向右,x<o向左
x方向的位移距离小于y轴方向的距离 时,上下移动 y>0向上,y<o向下
InputDirection m_inputDir = InputDirection.NULL;
bool activeInput = false;//鼠标是否按下
Vector3 m_mousePos;//鼠标按下的位置信息
int m_nowIndex=1;
int m_targetIndex=1;
float m_xDistance;
float m_yDistance;
bool m_IsSlider = false;
float m_SlideTime;
//获取输入
void GetInputDirection() {
//手势识别
m_inputDir = InputDirection.NULL;
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)
{
if (Mathf.Abs(dir.x)>Mathf.Abs(dir.y)&&dir.x>0)
{
m_inputDir = InputDirection.Right;
}
else if (Mathf.Abs(dir.x) > Mathf.Abs(dir.y) && dir.x < 0)
{
m_inputDir = InputDirection.Left;
}
else if (Mathf.Abs(dir.x) < Mathf.Abs(dir.y) && dir.y > 0)
{
m_inputDir = InputDirection.Up;
}
else if (Mathf.Abs(dir.x) < Mathf.Abs(dir.y) && dir.y < 0)
{
m_inputDir = InputDirection.Down;
}
activeInput = false;
}
}
//键盘识别
if (Input.GetKeyDown(KeyCode.W)||Input.GetKeyDown(KeyCode.Space))
{
m_inputDir = InputDirection.Up;
}
else if (Input.GetKeyDown(KeyCode.S))
{
m_inputDir = InputDirection.Down;
}
else if (Input.GetKeyDown(KeyCode.A))
{
m_inputDir = InputDirection.Left;
}
else if (Input.GetKeyDown(KeyCode.D))
{
m_inputDir = InputDirection.Right;
}
}
更新位置信息
角色在中时,m_nowIndex为1,左边时为0,右边时为2,用于指代角色所在赛道位置,赛道间距为2
根据GetInputDirection()完成m_inputDir更新, 之后完成m_nowIndex等的值更新,最后发送消息SendMessage实现动画播放
/// <summary>
/// 更新位置信息
/// </summary>
void UpdatePosition() {
GetInputDirection();
switch (m_inputDir)
{
case InputDirection.NULL:
break;
case InputDirection.Right:
if (m_targetIndex<2)
{
m_targetIndex++;
m_xDistance = 2;
SendMessage("AnimManager",m_inputDir);
}
break;
case InputDirection.Left:
if (m_targetIndex>0)
{
m_targetIndex--;
m_xDistance = -2;
SendMessage("AnimManager",m_inputDir);
}
break;
case InputDirection.Down:
if (m_IsSlider==false)
{
m_IsSlider = true;
m_SlideTime = 0.733f;
SendMessage("AnimManager", m_inputDir);
}
break;
case InputDirection.Up:
if (m_cc.isGrounded)
{
m_yDistance = m_jumpValue;
SendMessage("AnimManager", m_inputDir);
}
break;
default:
break;
}
}
更新完成位置后,真正实现位置移动
//移动
void MoveControl() {
//左右移动
if (m_targetIndex!=m_nowIndex)
{
float move = Mathf.Lerp(0,m_xDistance,m_moveSpeed*Time.deltaTime);
transform.position += new Vector3(move,0,0);
m_xDistance -= move;
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;
default:
break;
}
}
}
if (m_IsSlider)
{
m_SlideTime -= Time.deltaTime;
if (m_SlideTime<0)
{
m_IsSlider = false;
m_SlideTime = 0;
}
}
}
动画播放
AnimManager总体动画控制,实现在PlayMove中使用发送消息控制动画播放,降低耦合
public class PlayerAnim : View {
Animation anim;
Action PlayAnim;
public override string Name
{
get
{
return Consts.V_PlayerAnim;
}
}
private void Awake()
{
anim = GetComponent<Animation>();
PlayAnim = PlayRun;
}
private void Update()
{
if (PlayAnim!=null)
{
PlayAnim();
}
}
void PlayRun() {
anim.Play("run");
}
void PlayLeft() {
anim.Play("left_jump");
//normalizedTime动画播放进度,,,切换回向前跑的动画
if (anim["left_jump"].normalizedTime>0.95f)
{
PlayAnim = PlayRun;
}
}
void PlayRight() {
anim.Play("right_jump");
if (anim["right_jump"].normalizedTime>0.95f)
{
PlayAnim = PlayRun;
}
}
void PlayRoll()
{
anim.Play("roll");
if (anim["roll"].normalizedTime > 0.95f)
{
PlayAnim = PlayRun;
}
}
void PlayJump()
{
anim.Play("jump");
if (anim["jump"].normalizedTime > 0.95f)
{
PlayAnim = PlayRun;
}
}
public void AnimManager(InputDirection dir) {
switch (dir)
{
case InputDirection.NULL:
break;
case InputDirection.Right:
PlayAnim = PlayRight;
break;
case InputDirection.Left:
PlayAnim = PlayLeft;
break;
case InputDirection.Down:
PlayAnim = PlayRoll;
break;
case InputDirection.Up:
PlayAnim = PlayJump;
break;
default:
break;
}
}
public override void HandleEvent(string name, object data)
{
}
}
最终效果
屏幕上滑动或者键盘WASD控制位移移动,并播放对应的动画
图中向左移动,并播放向左移动动画