我是靠谱客的博主 矮小小甜瓜,最近开发中收集的这篇文章主要介绍Unity人物第三人称移动下面是详细设置,完整代码在最下方一、玩家设置二、摄像机设置三、结合摄像机Y轴转动,调整玩家Y轴转动四、完整代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

下面是详细设置,完整代码在最下方

一、玩家设置

1、首先在角色身上添加脚本PlayerController,添加的其它组件有CapsuleCollider,Rigidbody、Animator。

2、获取横轴和纵轴的组成的向量

// 获取轴使用Input.GetAxisRaw方法,平滑过渡通过代码来完成
// 由于未对输入进行平滑处理,键盘输入将始终为 -1、0 或 1。 如果您想自己完成键盘输入的所有平滑处理,这非常有用。
Vector2 input = new Vector2(Input.GetAxisRaw(GameConsts.HORIZONTAL_AXIS), Input.GetAxisRaw(GameConsts.VERTICAL_AXIS));
// 获取向量的标准化向量【向量的模为1】,没啥意义习惯这样做
Vector2 inputDir = input.normalized;

3、得到当前由纵轴和横轴所形成向量的相对于世界前方的角度夹角

float targetRotation = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg;

4、判断玩家有没有移动【如果玩家么有移动就不要执行转向了,不然默认朝向世界正前方】

        if (inputDir != Vector2.zero)
        {
            // 【上面使用Input.GetAxisRaw,在这里过渡】平滑过渡玩家当前朝向
            transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothTime);
            // 设置动画
            animator.SetFloat(GameConsts.SPEED_PARAMETER, 1, 0.2f, Time.deltaTime);

            // 【使用变换组件移动】根据动画参数平滑过渡到最大速度
            // transform.Translate(transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER), Space.World);
            // 【使用刚体组件移动】根据动画参数平滑过渡到最大速度
            PlayerRigidbody.MovePosition(transform.position + transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER));
        }
        else
        {
            animator.SetFloat(GameConsts.SPEED_PARAMETER, 0, 0.2f, Time.deltaTime);
        }

二、摄像机设置

1、添加脚本CameraController,获取并累加/减鼠标横向和纵向的偏移量

// 累加/减存储鼠标的位移量(由于Y轴增加默认尽头下移,所以用-=)
        mouseX += Input.GetAxis(GameConsts.MOUSE_X);
        mouseY -= Input.GetAxis(GameConsts.MOUSE_Y);

2、摄像机加上鼠标的累计位移角度

// 摄像机加上鼠标的累计位移角度
        transform.eulerAngles = new Vector3(mouseY, mouseX, 0);

3、设置摄像机位置,distance为摄像机与跟随目标的距离【因为摄像机到角色的向量为角色位置减去摄像机位置,所以下方代码的意思为摄像机在玩家的正后方,距离为distance】

可以通过调整摄像机跟随目标调整摄像机的高度

// 设置摄像机位置
        transform.position = followTarget.position - transform.forward * distance;

三、结合摄像机Y轴转动,调整玩家Y轴转动

1、玩家转动角度加上摄像机转动角度

float targetRotation = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg + followCamera.eulerAngles.y;

四、完整代码

PlayerController.cs

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [Header("玩家平滑移动到指定角度的近似时间")]
    public float smoothTime = 0.2f;

    [Header("玩家速度")]
    public float playerSpeed = 5f;

    /// <summary>
    /// 玩家平滑移动到指定角度的瞬时速度,由Mathf.SmoothDampAngle()自动填充值
    /// </summary>
    private float currentVelocity;

    private Animator animator;
    private Rigidbody PlayerRigidbody;

    /// <summary>
    /// 跟随玩家的摄像机
    /// </summary>
    private Transform followCamera;

    private void Awake()
    {
        animator = GetComponent<Animator>();
        PlayerRigidbody = GetComponent<Rigidbody>();
        followCamera = Camera.main.transform;
    }

    private void Update()
    {
        Vector2 input = new Vector2(Input.GetAxisRaw(GameConsts.HORIZONTAL_AXIS), Input.GetAxisRaw(GameConsts.VERTICAL_AXIS));
        Vector2 inputDir = input.normalized;
        float targetRotation = Mathf.Atan2(input.x, input.y) * Mathf.Rad2Deg + followCamera.eulerAngles.y;

        // 如果移动了
        if (inputDir != Vector2.zero)
        {
            // 平滑过渡玩家当前朝向
            transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothTime);
            // 设置动画
            animator.SetFloat(GameConsts.SPEED_PARAMETER, 1, 0.2f, Time.deltaTime);

            // 【使用变换组件移动】根据动画参数平滑过渡到最大速度
            // transform.Translate(transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER), Space.World);
            // 【使用刚体组件移动】根据动画参数平滑过渡到最大速度
            PlayerRigidbody.MovePosition(transform.position + transform.forward * playerSpeed * Time.deltaTime * animator.GetFloat(GameConsts.SPEED_PARAMETER));
        }
        else
        {
            animator.SetFloat(GameConsts.SPEED_PARAMETER, 0, 0.2f, Time.deltaTime);
        }
    }
}

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
    [Header("摄像机相对玩家的距离")]
    public float distance = 10f;

    private float mouseX;
    private float mouseY;

    /// <summary>
    /// 摄像机跟随目标
    /// </summary>
    private Transform followTarget;

    private void Awake()
    {
        followTarget = GameObject.FindWithTag(GameConsts.PLAYER_TAG).transform.Find(GameConsts.FOLLOW);
    }

    private void Update()
    {
        // 累加/减存储鼠标的位移量(由于Y轴增加默认尽头下移,所以用-=)
        mouseX += Input.GetAxis(GameConsts.MOUSE_X);
        mouseY -= Input.GetAxis(GameConsts.MOUSE_Y);
        // 摄像机加上鼠标的累计位移角度
        transform.eulerAngles = new Vector3(mouseY, mouseX, 0);
        // 设置摄像机位置
        transform.position = followTarget.position - transform.forward * distance;
    }
}

最后

以上就是矮小小甜瓜为你收集整理的Unity人物第三人称移动下面是详细设置,完整代码在最下方一、玩家设置二、摄像机设置三、结合摄像机Y轴转动,调整玩家Y轴转动四、完整代码的全部内容,希望文章能够帮你解决Unity人物第三人称移动下面是详细设置,完整代码在最下方一、玩家设置二、摄像机设置三、结合摄像机Y轴转动,调整玩家Y轴转动四、完整代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部