600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Unity3D第三人称Camera视角旋转实现

Unity3D第三人称Camera视角旋转实现

时间:2023-08-09 13:38:08

相关推荐

Unity3D第三人称Camera视角旋转实现

Unity3D第三人称Camera视角旋转,实现对player观察的实现,效果图如下(player and Scene 有点lou):

内容知识总结:

Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在-1到1之间。脚本如下:

using UnityEngine;using System.Collections;public class example : MonoBehaviour {//水平速度public float HorizontalSpeed = 2.0F;//垂直速度public float VerticalSpeed = 2.0F;void Update() {//水平方向float h = HorizontalSpeed * Input.GetAxis("Mouse X");//垂直方向float v = VerticalSpeed * Input.GetAxis("Mouse Y");//旋转transform.Rotate(v, h, 0);}}

欧拉角eulerAngles:该值是Vector3类型的值,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该值最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本

float mY = 5.0;void Update () {mY += Input.GetAxis("Horizontal");transform.eulerAngles =new Vector3(0,mY, 0);}

插值:所谓插值是指在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插值的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插值方法,即线性插值Lerp,球形插值SLerp。插值的方法很简单,只要我们给出初始和结束的状态、时间就可以了我们来看下面的脚本:

void Rotating (float horizontal, float vertical){// Create a new vector of the horizontal and vertical inputs.Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);// Create a rotation based on this new vector assuming that up is the global y axis.Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);// Create a rotation that is an increment closer to the target rotation from the player's rotation.Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);// Change the players rotation to this new rotation.rigidbody.MoveRotation(newRotation);}

接下来就是具体实现过程:

using UnityEngine;using System.Collections;public class moveCamera : MonoBehaviour{//观察目标public Transform Target;//观察距离public float Distance = 5F;//旋转速度private float SpeedX = 240;private float SpeedY = 120;//角度限制private float MinLimitY = 5;private float MaxLimitY = 180;//旋转角度private float mX = 0.0F;private float mY = 0.0F;//鼠标缩放距离最值private float MaxDistance = 10;private float MinDistance = 1.5F;//鼠标缩放速率private float ZoomSpeed = 2F;//是否启用差值public bool isNeedDamping = true;//速度public float Damping = 10F;private Quaternion mRotation;void Start(){//初始化旋转角度mX = transform.eulerAngles.x;mY = transform.eulerAngles.y;}void LateUpdate(){//鼠标右键旋转if (Target != null && Input.GetMouseButton(1)){//获取鼠标输入mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;//范围限制mY = ClampAngle(mY, MinLimitY, MaxLimitY);//计算旋转//我们可以通过Quaternion.Euler()方法将一个Vector3类型的值转化为一个四元数//,进而通过修改Transform.Rotation来实现相同的目的mRotation = Quaternion.Euler(mY, mX, 0);//根据是否插值采取不同的角度计算方式if (isNeedDamping){transform.rotation = Quaternion.Lerp(transform.rotation, mRotation, Time.deltaTime * Damping);}else{transform.rotation = mRotation;}//处理同时按下鼠标右键和方向控制键/* if (Target.GetComponent<NoLockiVew_Player>().State == NoLockiVew_Player.PlayerState.Walk){Target.rotation = Quaternion.Euler(new Vector3(0, mX, 0));}*/}//鼠标滚轮缩放Distance -= Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;Distance = Mathf.Clamp(Distance, MinDistance, MaxDistance);//重新计算位置Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;//设置相机的角度和位置if (isNeedDamping){transform.position = Vector3.Lerp(transform.position, mPosition, Time.deltaTime * Damping);}else{transform.position = mPosition;}}//角度限制private float ClampAngle(float angle, float min, float max){if (angle < -360) angle += 360;if (angle > 360) angle -= 360;return Mathf.Clamp(angle, min, max);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。