Unity 使用按键控制角色运动

创建角色

创建一个脚本PlayerController

创建控制器,使用boolean值

 

 

 

 脚本

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

public class PlayerController : MonoBehaviour
{
    //向量
    Vector3 dir = new Vector3();
    //horizontal上一帧变量
    float horizontalDirection = 0f;
    //vertical上一帧变量
    float verticalDirection = 0f;
    //向量x值
    float x = 0f;
    //向量z值
    float z = 0f;
    //转向时旋转速度大小
    float reduce = 0.1f;
    //按键时 向量x的值
    float xDirection = 0f;
    //按键时 向量z的值
    float zDirection = 0f;

    
    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    //判断horizontal是否处在按下阶段
    bool isHorizontalMotion(float horizontal){
        if ((horizontalDirection >= 0f && ((horizontalDirection < horizontal) || horizontal < 0))  ||
        (horizontalDirection <= 0f && ((horizontalDirection > horizontal) || horizontal > 0)) ||
        (horizontal == 1.00f || horizontal == -1.00f))
        {
            return true;
        }else{
            return false;
        }
    }

    //判断vertical是否处在按下阶段
    bool isVerticalMotion(float vertical){
        if ((verticalDirection >= 0f && ((verticalDirection < vertical) || vertical < 0))  ||
        (verticalDirection <= 0f && ((verticalDirection > vertical) || vertical > 0)) ||
        (vertical == 1.00f || vertical == -1.00f))
        {
            return true;
        }else{
            return false;
        }
    }

    //horizontal进行旋转
    void horizontalRotate(float horizontal, float vertical){
        z = dir[2];
        xDirection = dir[0];
        if (vertical == 0f)
        {
            if (z < reduce && z > -reduce)
            {
                z = 0f;
            }
            if (z > 0f)
            {
                z = z - reduce;
            }
            if (z < 0f)
            {
                z = z + reduce;
            }
        }
        if (horizontal > 0)
        {
            xDirection = xDirection + reduce;
        }
        if (horizontal < 0)
        {
            xDirection = xDirection - reduce;
        }
        if (xDirection > 1.00f)
        {
            xDirection = 1.00f;
        }else if(xDirection < -1.00f){
            xDirection = -1.00f;
        }
        dir.Set(xDirection, 0, z);
    }

    //vertical进行旋转
    void verticalRotate(float horizontal, float vertical){
        x = dir[0];
        zDirection = dir[2];
        if (horizontal == 0f)
        {
            if (x < reduce && x > -reduce)
            {
                x = 0f;
            }
            if (x > 0f)
            {
                x = x - reduce;
            }
            if (x < 0f)
            {
                x = x + reduce;
            }
        }
        if (vertical > 0)
        {
            zDirection = zDirection + reduce;
        }
        if (vertical < 0)
        {
            zDirection = zDirection - reduce;
        }
        if (zDirection > 1.00f)
        {
            zDirection = 1.00f;
        }else if(zDirection < -1.00f){
            zDirection = -1.00f;
        }
        dir.Set(x, 0, zDirection);
    }

    //跑步
    void run(){
        //播放跑步动画
        animator.SetBool("isRun", true);
        //朝向前方移动
        transform.Translate(Vector3.forward * 2 * Time.deltaTime);
        
    }

    private Animator animator;
    // Update is called once per frame
    void Update()
    {

        //水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //垂直轴
        float vertical = Input.GetAxis("Vertical");

        //播放跑步动画
        animator.SetBool("isRun", false);
        if (isHorizontalMotion(horizontal))
        {
            //按键时 x轴旋转
            horizontalRotate(horizontal, vertical);
            run();
        }
        if (isVerticalMotion(vertical))
        {
            //按键时 y轴旋转
            verticalRotate(horizontal, vertical);
            if(!isHorizontalMotion(horizontal))
            {
                run();
            }
        }
        
        horizontalDirection = horizontal;
        verticalDirection = vertical;

        //面向向量
        transform.rotation = Quaternion.LookRotation(dir);
    }

}

然后我们运行时还是会感觉有一点过渡衔接不自然,我们可以更改动画器参数里的设置

 

 当然设为0的话是没有过渡的动画,类似于硬直,所以按照自己的意愿来调试。

猜你喜欢

转载自blog.csdn.net/ssl267422/article/details/129093244