我是靠谱客的博主 矮小小甜瓜,最近开发中收集的这篇文章主要介绍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轴转动四、完整代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复