unity第三人称人物移动,实现人物的边行走边旋转

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

//This script requires you to have setup your animator with 3 parameters, "InputMagnitude", "InputX", "InputZ"
//With a blend tree to control the inputmagnitude and allow blending between animations.
[RequireComponent(typeof(CharacterController))]
public class MovementInput : MonoBehaviour
{

    public float InputX;
    public float InputZ;
    public Vector3 desiredMoveDirection;
    public bool blockRotationPlayer;
    public float desiredRotationSpeed;
    public Animator anim;
    public float Speed;
    public float moveSpeed;
    public float allowPlayerRotation;
    public Camera cam;
    public CharacterController controller;
    public bool isGrounded;
    private float verticalVel;
    private Vector3 moveVector;

    // Use this for initialization
    void Start()
    {
        anim = this.GetComponent<Animator>();
        cam = Camera.main;
        controller = this.GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        InputMagnitude();
        //解决人物不受重力的问题
        isGrounded = controller.isGrounded;
        if (isGrounded)
        {
            verticalVel -= 0;
        }
        else
        {
            verticalVel -= 2;
        }
        moveVector = new Vector3(0,verticalVel,0);
        controller.Move(moveVector);
        
    }

    private void PlayerMoveAndRotation()
    {
        float InputX = anim.GetFloat("InputX");
        float InputZ = anim.GetFloat("InputZ");
        Vector3 desiredForward = cam.transform.right;//获取camera的前轴向,和右轴向,让character旋转完后正(背)对摄像机,根据用户输入值大小判断负值则转到反方向
        Vector3 desiredRight = cam.transform.forward;
        desiredMoveDirection = desiredForward * InputX + desiredRight * InputZ;
        if (blockRotationPlayer==false)
        {
            transform.localRotation = Quaternion.Slerp(transform.localRotation,Quaternion.LookRotation(desiredMoveDirection),desiredRotationSpeed);
        }q
        controller.SimpleMove(desiredMoveDirection*moveSpeed);
    }

    private void InputMagnitude()
    {
        float InputX = Input.GetAxis("Horizontal");
        float InputZ = Input.GetAxis("Vertical");
        anim.SetFloat("InputX", InputX);
        anim.SetFloat("InputZ", InputZ);
        float inputMagnitude = (new Vector3(InputX, 0, InputZ)).sqrMagnitude;
        anim.SetFloat("InputMagnitude",inputMagnitude);
        if (inputMagnitude>allowPlayerRotation) //在这里判断输入值不为0,才改变character的旋转值,防止character旋转方向变成(0,0,0)
        {
            PlayerMoveAndRotation();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Icecoldless/article/details/81839773