Unity3D游戏开发之观察视角的实现
发表于2017-06-07
前面介绍了跟随视角和自由视角的实现,其实自由视角也可以用到第一人称视角上面,这里我就不细说了,接下来要给大家介绍的是观察视角的实现。
相信大家在玩游戏的时候都会或多或少遇到这么个情况:得到了一件宝物,需要仔细观察宝物,这里有两种实现方法:1、拖拽宝物,视角不变,这个就是简单的用鼠标拖动物体的操作了,这部分放到之后我们再细说;2、物体不动,视角围绕物体进行转动
我们下面要实现的就是第二种方法,话不多说,先上代码:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 using
UnityEngine;
using
System.Collections;
/**
* 备注:本脚本必须赋予主镜头
*/
public
class
CameraController : MonoBehaviour
{
public
Transform target;
//主相机要围绕其旋转的物体
public
float
distance = 7.0f;
//主相机与目标物体之间的距离
private
float
eulerAngles_x;
private
float
eulerAngles_y;
private
float
trans_x;
private
float
trans_y;
//水平滚动相关
public
int
distanceMax = 10;
//主相机与目标物体之间的最大距离
public
int
distanceMin = 3;
//主相机与目标物体之间的最小距离
public
float
xSpeed = 70.0f;
//主相机水平方向旋转速度
//垂直滚动相关
public
int
yMaxLimit = 60;
//最大y(单位是角度)
public
int
yMinLimit = -60;
//最小y(单位是角度)
public
float
ySpeed = 70.0f;
//主相机纵向旋转速度
//滚轮相关
public
float
MouseScrollWheelSensitivity = 1.0f;
//鼠标滚轮灵敏度(备注:鼠标滚轮滚动后将调整相机与目标物体之间的间隔)
public
LayerMask CollisionLayerMask;
float
i = 0;
void
Start()
{
Vector3 eulerAngles =
this
.transform.eulerAngles;
//当前物体的欧拉角
this
.eulerAngles_x = eulerAngles.y;
this
.eulerAngles_y = eulerAngles.x;
this
.trans_y = 0;
this
.trans_x = 0;
}
void
LateUpdate()
{
if
(
this
.target !=
null
&& Input.GetMouseButton(1))
{
this
.eulerAngles_x += (Input.GetAxis(
"Mouse X"
) *
this
.xSpeed) * 0.02f;
this
.eulerAngles_y -= (Input.GetAxis(
"Mouse Y"
) *
this
.ySpeed) * 0.02f;
this
.eulerAngles_y = ClampAngle(
this
.eulerAngles_y, (
float
)
this
.yMinLimit, (
float
)
this
.yMaxLimit);
Quaternion quaternion = Quaternion.Euler(
this
.eulerAngles_y,
this
.eulerAngles_x, (
float
)0);
this
.distance = Mathf.Clamp(
this
.distance - (Input.GetAxis(
"Mouse ScrollWheel"
) * MouseScrollWheelSensitivity), (
float
)
this
.distanceMin, (
float
)
this
.distanceMax);
//从目标物体处,到当前脚本所依附的对象(主相机)发射一个射线,如果中间有物体阻隔,则更改this.distance(这样做的目的是为了不被挡住)
RaycastHit hitInfo =
new
RaycastHit();
if
(Physics.Linecast(
this
.target.position,
this
.transform.position,
out
hitInfo,
this
.CollisionLayerMask))
{
this
.distance = hitInfo.distance - 0.05f;
}
Vector3 vector = ((Vector3)(quaternion *
new
Vector3((
float
)0, (
float
)0,-
this
.distance))) +
this
.target.position;
//更改主相机的旋转角度和位置
this
.transform.rotation = quaternion;
this
.transform.position = vector;
}
if
(Input.GetMouseButton(2))
{
this
.trans_y = (Input.GetAxis(
"Mouse Y"
) *
this
.ySpeed / 2) * 0.02f;
this
.trans_x = (Input.GetAxis(
"Mouse X"
) *
this
.xSpeed / 2) * 0.02f;
this
.transform.Translate(Vector3.right *
this
.trans_x);
this
.transform.Translate(Vector3.up *
this
.trans_y);
}
}
//把角度限制到给定范围内
public
float
ClampAngle(
float
angle,
float
min,
float
max)
{
while
(angle < -360)
{
angle += 360;
}
while
(angle > 360)
{
angle -= 360;
}
return
Mathf.Clamp(angle, min, max);
}
}
其实逻辑都是非常简单的,主要就是先获取鼠标移动得到的旋转量,然后根据被观察的物体的位置进行相机下一个位置的预测计算,然后更新相机的姿态和位置即可。
Unity3D游戏开发系列: