萌熊跑道(五)主角的移动控制

手势识别控制

  • 判断手势滑动的长度的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

有需要学习视频的欢迎关注微信公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值