unity TopDown角色移动控制

角色看向鼠标方向
角色保持世界坐标移动
角色八方向移动动画
idle ,走路,跑步,冲刺切换

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Game
{
    public class CharacterController : MonoBehaviour
    {
        float inputX;
        float inputY;
        Vector2 centerScreenPos;
        [Tooltip("加速度")]
        public float vel_Speed=10f;
        Transform mTransfrom;
        public float rotateSpeed = 1000;
        private static int VEL_X = Animator.StringToHash("VelX");
        private static int VEL_Z = Animator.StringToHash("VelZ");
        Animator Animator;

        public enum moveType
        {
            walk,
            run,
            sprint,
        }
        public moveType currentMoveType = moveType.walk;

        private void Awake()
        {
            Animator = GetComponent<Animator>();
            centerScreenPos = new Vector2(Screen.width / 2.0f, Screen.height / 2.0f);
            mTransfrom = transform;
        }

        private void Update()
        {
            inputX = Input.GetAxis("Horizontal");
            inputY = Input.GetAxis("Vertical");

            Locomotion();
        }

        private void Locomotion()
        {
            //角色朝向鼠标
            Vector2 mousePos = Input.mousePosition;
            Vector2 dir = mousePos - centerScreenPos;
            //计算角度
            float angle = VectorAngle(dir, Vector2.up);


            //Quaternion targetQua = Quaternion.LookRotation(new Vector3(dir.x, 0, dir.y));
            //mTransfrom.rotation = Quaternion.RotateTowards(mTransfrom.rotation, targetQua, 1000 * Time.deltaTime);

            float moveX = 0;
            float moveZ = 0;
            float targerAngle = 0;
            float moveSpeed = 0.5f;//walk
            switch (currentMoveType)
            {
                case moveType.walk:
                    break;
                case moveType.run:
                    moveSpeed = 0.8f;
                    break;
                case moveType.sprint:
                    moveSpeed = 1f;
                    break;
                default:
                    break;
            }
            

            #region 方向判断
            if (angle > -22.5 && angle <= 22.5)
            {
                //1              
                targerAngle = 0;
                moveX = inputX == 0 ? 0 : inputX > 0 ? moveSpeed : -moveSpeed;
                moveZ = inputY == 0 ? 0 : inputY > 0 ? moveSpeed : -moveSpeed;
            }
            else if (angle > 22.5 && angle <= 67.5)
            {
                #region 右上
                //2
                targerAngle = 45;
                if (inputX == 0 && inputY == 0)
                {
                    //idle
                    moveX = 0;
                    moveZ = 0;
                }
                else if (inputX == 0 && inputY > 0)
                {
                    //前移
                    moveX = -moveSpeed;
                    moveZ = moveSpeed;
                }
                else if (inputX == 0 && inputY < 0)
                {
                    //后退
                    moveX = moveSpeed;
                    moveZ = -moveSpeed;
                }
                else if (inputX > 0 && inputY == 0)
                {
                    //右移
                    moveX = moveSpeed;
                    moveZ = moveSpeed;
                }
                else if (inputX > 0 && inputY > 0)
                {
                    //右前移
                    moveX = 0;
                    moveZ = moveSpeed;
                }
                else if (inputX > 0 && inputY < 0)
                {
                    //右后移
                    moveX = moveSpeed;
                    moveZ = 0;
                }
                else if (inputX < 0 && inputY == 0)
                {
                    //左移
                    moveX = -moveSpeed;
                    moveZ = -moveSpeed;
                }
                else if (inputX < 0 && inputY > 0)
                {
                    //左上移
                    moveX = -moveSpeed;
                    moveZ = 0;
                }
                else if (inputX < 0 && inputY < 0)
                {
                    //左下移
                    moveX = 0;
                    moveZ = -moveSpeed;
                }
                #endregion
            }
            else if (angle > 67.5 && angle <= 112.5)
            {
                //3
                targerAngle = 90;
                moveX = inputY == 0 ? 0 : inputY > 0 ? -moveSpeed : moveSpeed;
                moveZ = inputX == 0 ? 0 : inputX > 0 ? moveSpeed : -moveSpeed;
            }
            else if (angle > 112.5 && angle <= 157.5)
            {
                //4
                #region 右下
                targerAngle = 135;

                if (inputX == 0 && inputY == 0)
                {
                    //idle
                    moveX = 0;
                    moveZ = 0;
                }
                else if (inputX == 0 && inputY > 0)
                {
                    //前移

                    moveZ = -moveSpeed;
                    moveX = -moveSpeed;
                }
                else if (inputX == 0 && inputY < 0)
                {
                    //后退

                    moveZ = moveSpeed;
                    moveX = moveSpeed;
                }
                else if (inputX > 0 && inputY == 0)
                {
                    //右移

                    moveZ = moveSpeed;
                    moveX = -moveSpeed;
                }
                else if (inputX > 0 && inputY > 0)
                {
                    //右前移
                    moveZ = 0;
                    moveX = -moveSpeed;
                }
                else if (inputX > 0 && inputY < 0)
                {
                    //右后移
                    moveZ = moveSpeed;
                    moveX = 0;
                }
                else if (inputX < 0 && inputY == 0)
                {
                    //左移                    
                    moveZ = -moveSpeed;
                    moveX = moveSpeed;
                }
                else if (inputX < 0 && inputY > 0)
                {
                    //左上移
                    moveZ = -moveSpeed;
                    moveX = 0;
                }
                else if (inputX < 0 && inputY < 0)
                {
                    //左下移

                    moveZ = 0;
                    moveX = moveSpeed;
                }
                #endregion
            }
            else if (angle > -157.5 && angle <= -112.5)
            {
                //6
                #region 左下                
                targerAngle = -135;

                if (inputX == 0 && inputY == 0)
                {
                    //idle
                    moveX = 0;
                    moveZ = 0;
                }
                else if (inputX == 0 && inputY > 0)
                {
                    //前移
                    moveX = moveSpeed;
                    moveZ = -moveSpeed;
                }
                else if (inputX == 0 && inputY < 0)
                {
                    //后退
                    moveX = -moveSpeed;
                    moveZ = moveSpeed;
                }
                else if (inputX > 0 && inputY == 0)
                {
                    //右移
                    moveX = -moveSpeed;
                    moveZ = -moveSpeed;
                }
                else if (inputX > 0 && inputY > 0)
                {
                    //右前移
                    moveX = 0;
                    moveZ = -moveSpeed;
                }
                else if (inputX > 0 && inputY < 0)
                {
                    //右后移
                    moveX = -moveSpeed;
                    moveZ = 0;
                }
                else if (inputX < 0 && inputY == 0)
                {
                    //左移
                    moveX = moveSpeed;
                    moveZ = moveSpeed;
                }
                else if (inputX < 0 && inputY > 0)
                {
                    //左上移
                    moveX = moveSpeed;
                    moveZ = 0;
                }
                else if (inputX < 0 && inputY < 0)
                {
                    //左下移
                    moveX = 0;
                    moveZ = moveSpeed;
                }
                #endregion
            }
            else if (angle > -112.5 && angle <= -67.5)
            {
                //7
                targerAngle = -90;
                moveZ = inputX == 0 ? 0 : inputX > 0 ? -moveSpeed : moveSpeed;
                moveX = inputY == 0 ? 0 : inputY > 0 ? moveSpeed : -moveSpeed;
            }
            else if (angle > -67.5 && angle <= -22.5)
            {
                //8
                targerAngle = -45;
                #region 左上


                if (inputX == 0 && inputY == 0)
                {
                    //idle
                    moveX = 0;
                    moveZ = 0;
                }
                else if (inputX == 0 && inputY > 0)
                {
                    //前移

                    moveZ = moveSpeed;
                    moveX = moveSpeed;
                }
                else if (inputX == 0 && inputY < 0)
                {
                    //后退

                    moveZ = -moveSpeed;
                    moveX = -moveSpeed;
                }
                else if (inputX > 0 && inputY == 0)
                {
                    //右移

                    moveZ = -moveSpeed;
                    moveX = moveSpeed;
                }
                else if (inputX > 0 && inputY > 0)
                {
                    //右前移
                    moveZ = 0;
                    moveX = moveSpeed;
                }
                else if (inputX > 0 && inputY < 0)
                {
                    //右后移
                    moveZ = -moveSpeed;
                    moveX = 0;
                }
                else if (inputX < 0 && inputY == 0)
                {
                    //左移                    
                    moveZ = moveSpeed;
                    moveX = -moveSpeed;
                }
                else if (inputX < 0 && inputY > 0)
                {
                    //左上移
                    moveZ = moveSpeed;
                    moveX = 0;
                }
                else if (inputX < 0 && inputY < 0)
                {
                    //左下移

                    moveZ = 0;
                    moveX = -moveSpeed;
                }
                #endregion
            }
            else if (angle > 157.5 || angle < 157.5)
            {
                //5
                targerAngle = 180;
                moveX = inputX == 0 ? 0 : inputX > 0 ? -moveSpeed : moveSpeed;
                moveZ = inputY == 0 ? 0 : inputY > 0 ? -moveSpeed : moveSpeed;
            }
            #endregion

            //旋转
            mTransfrom.eulerAngles = new Vector3(0, targerAngle, 0);

            //让动画过渡有个缓冲
            float currentVel_X = Animator.GetFloat(VEL_X);
            float currentVel_Z = Animator.GetFloat(VEL_Z);

            float velx = Mathf.Lerp(currentVel_X,moveX,vel_Speed*Time.deltaTime);
            float velz = Mathf.Lerp(currentVel_Z, moveZ, vel_Speed * Time.deltaTime);
            Animator.SetFloat(VEL_X, velx);
            Animator.SetFloat(VEL_Z, velz);
        }

        float VectorAngle(Vector2 from, Vector2 to)
        {
            float angle;

            Vector3 cross = Vector3.Cross(from, to);
            angle = Vector2.Angle(from, to);
            return cross.z < 0 ? -angle : angle;
        }
    }
}

动画混合树
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值