今天给大家分享一个简单的Unity第三人称视角下玩家控制器和相机控制器的脚本编写方法。
效果如下:
一、实现原理
主要分三部分实现:人物旋转、人物移动、相机旋转。
1.人物移动:
首先获取到人物水平和垂直移动的参数:
inputH = Input.GetAxis("Horizontal");//获取水平/垂直移动参数
inputV = Input.GetAxis("Vertical");
因为人物移动的方向跟摄像头一致,所以需要根据摄像头的方向轴来确定玩家的移动方向,然后移动玩家人物刚体组件:
moveDir = mCamera.TransformDirection(inputH, 0, inputV);//人物移动朝向
rigid.MovePosition(transform.position + new Vector3(moveDir.x,0,moveDir.z) * wSpeed * Time.fixedDeltaTime);//移动人物
2.相机旋转:
首先获取鼠标水平/垂直移动参数,再使相机跟随人物,更新旋转:
mouseX += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;//更新鼠标水平/垂直移动参数
mouseY += Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
transform.position = body.position;//相机跟随人物移动
transform.rotation = Quaternion.Euler(mouseY, mouseX, 0);//相机旋转
3.人物旋转:
首先由水平/垂直移动的参数计算得到旋转角度:
float targetRotation = (Mathf.Atan2(inputH, inputV) * Mathf.Rad2Deg + mCamera.eulerAngles.y
这里注意人物旋转要基于当下相机的方向,如果只是基于人物模型方向,会发生人物移动与人物旋转方向不一致的情况,如下图,人物倒退地相机前走:
得到角度后利用Mathf.SmoothDampAngle()函数较为丝滑地旋转人物:
transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref currentVelocity, smoothTime, rSpeed, Time.deltaTime);
二、物体层级
物体层级如下:
玩家组件挂载在人物预制体上,并创建RigidBody和Collider等组件。再创建一个空物体,坐标与玩家人物相同,将MainCamera作为子物体,并调节相机位置。
三、完整代码
PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
private Rigidbody rigid;//玩家刚体
private Animator animator;//玩家动画机
public Transform mCamera;//相机组件
private Vector3 moveDir;//人物移动方向
private float currentVelocity = 1;//目前的转向速度(SmoothDampAngle函数的返还参数)
private float smoothTime = 0.1f;//完成平滑的时间(SmoothDampAngle函数的参数)
public float wSpeed;//移动速度
public float rSpeed;//旋转速度
public float jPower;//跳跃力度
private float inputH;//水平移动参数
private float inputV;//垂直移动参数
private bool isMove;//是否移动
private bool isRun;//是否奔跑
private bool isGround;//是否在地面上
void Start()
{
rigid = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
}
void Update()
{
}
private void FixedUpdate()
{
inputH = Input.GetAxis("Horizontal");//获取水平/垂直移动参数
inputV = Input.GetAxis("Vertical");
animator.SetFloat("inputH", inputH);//更新动画机参数
animator.SetFloat("inputV", Mathf.Abs(inputV));
animator.SetBool("isMove", isMove);
animator.SetBool("isRun", isRun);
if(Input.GetKeyDown(KeyCode.Space))
{
isGround = false;
animator.CrossFade("Jump", 0.1f);
rigid.AddForce(0, jPower, 0);//给刚体向上的力
}//更新跳跃动画
if (inputH != 0 || inputV != 0)
{
isMove = true;
transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, (Mathf.Atan2(inputH, inputV) * Mathf.Rad2Deg + mCamera.eulerAngles.y), ref currentVelocity, smoothTime, rSpeed, Time.deltaTime);
}//改变人物朝向
else
{
isMove = false;
}//更新移动状态
if (Input.GetKey(KeyCode.LeftShift))
{
wSpeed = 6;
isRun = true;
}//更新奔跑状态
else
{
wSpeed = 3;
isRun = false;
}
moveDir = mCamera.TransformDirection(inputH, 0, inputV);
rigid.MovePosition(transform.position + new Vector3(moveDir.x,0,moveDir.z) * wSpeed * Time.fixedDeltaTime);//移动人物
}
private void OnCollisionEnter(Collision collision)
{
if(!isGround)
{
if(collision.gameObject.CompareTag("Ground"))
{
isGround = true;
}
}//判断是否接地
}
}
CameraController.cs文章来源:https://www.toymoban.com/news/detail-457778.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
public Transform body;//玩家人物组件
public float maxY = 40;//相机旋转上界限
public float minY = -10;//相机旋转下界限
public float xSpeed = 250;//相机纵向旋转速度
public float ySpeed = 125;//相机横向旋转速度
private float mouseX;//鼠标水平移动参数
private float mouseY;//鼠标垂直移动参数
void Start()
{
}
void Update()
{
mouseX += Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;//更新鼠标水平/垂直移动参数
mouseY += Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
mouseY = clampAngle(mouseY);
transform.position = body.position;//相机跟随人物移动
transform.rotation = Quaternion.Euler(mouseY, mouseX, 0);//相机旋转
}
private float clampAngle(float angle)
{
if (angle < -360)
{
angle += 360;
}
if (angle > 360)
{
angle -= 360;
}
return Mathf.Clamp(angle, minY, maxY);
}//控制相机上下旋转角度
}
欢迎大家在评论区交流学习~文章来源地址https://www.toymoban.com/news/detail-457778.html
到了这里,关于Unity 第三人称 玩家控制器+相机控制器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!