Unity3D游戏开发之观察视角的实现

发表于2017-06-07
评论1 1.9k浏览

前面介绍了跟随视角和自由视角的实现,其实自由视角也可以用到第一人称视角上面,这里我就不细说了,接下来要给大家介绍的是观察视角的实现。

相信大家在玩游戏的时候都会或多或少遇到这么个情况:得到了一件宝物,需要仔细观察宝物,这里有两种实现方法:1、拖拽宝物,视角不变,这个就是简单的用鼠标拖动物体的操作了,这部分放到之后我们再细说;2、物体不动,视角围绕物体进行转动

我们下面要实现的就是第二种方法,话不多说,先上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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游戏开发系列:

Unity3D游戏开发之Unity3D编辑器总览

Unity3D游戏开发之地形(Terrain)的创建

Unity3D游戏开发之Animator组件的应用

Unity3D游戏开发之Unity脚本的简单运用

Unity3D游戏开发之GameObject的操作

Unity3D游戏开发之第三人称摄像机的简单实现(跟随视角,自由视角)

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论