Unity - 相机跟随

Posted chenzirong1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity - 相机跟随相关的知识,希望对你有一定的参考价值。

相机跟随的几种方式

1. 单纯的相机固定跟随

相机保持与目标对象一定的相对距离,跟随目标对象发生移动

技术图片

 将脚本挂载到指定的 Camera 上,并给 Target 字段赋值一个跟随的目标对象

技术图片

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class CameraFollow_A : MonoBehaviour
 6 {
 7     public Transform target; //目标对象
 8     private Vector3 offset; //距离差
 9 
10     void Start()
11     {
12         offset = target.position - this.transform.position;
13     }
14 
15     void Update()
16     {
17         this.transform.position = target.position - offset;
18     }
19 }

2. 带有旋转角度的相机固定跟随

这一种方法在第一种相机跟随的基础上,添加了相机跟随的角度

技术图片

 同样挂载到指定的 Camera 上,相机将按照指定角度跟随目标对象

技术图片

 可以通过调节 Speed 字段的值,调整相机跟随的平滑度

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class CameraFollow_B : MonoBehaviour
 6 {
 7     private Transform target; //目标对象
 8     private Vector3 offset = new Vector3(0, 7, -6); //相机与目标对象的相对位置
 9     private Vector3 pos;
10     public float speed = 2; //旋转的平滑速度
11 
12     void Start()
13     {
14         //利用标签Tag锁定所要跟随的目标对象
15         target = GameObject.FindGameObjectWithTag("Player").transform;
16     }
17 
18     void Update()
19     {
20         pos = target.position + offset;
21         this.transform.position = Vector3.Lerp(this.transform.position, pos, speed * Time.deltaTime); //调整相机与目标对象的距离
22         Quaternion angel = Quaternion.LookRotation(target.position - this.transform.position); //获取旋转角度
23         this.transform.rotation = Quaternion.Slerp(this.transform.rotation, angel, speed * Time.deltaTime);
24     }
25 }

3. 第三人称相机跟随

相机始终以第三人称视角看向目标对象,并进行跟随

技术图片

 同样将脚本挂载到指定的 Camera 上,相机将始终以第三人称视角跟随目标对象

 技术图片

 通过 DistanceUp / DistanceAway 字段调整相机角度

通过 Smooth 字段调节相机移动的平滑程度

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class CameraFollow_C : MonoBehaviour
 6 {
 7     public Transform target; //目标对象
 8 
 9     public float distanceUp = 8f; //相机与目标对象竖直方向的距离
10     public float distanceAway = 10f; //相机与目标对象前后方向的距离
11     public float smooth = 10f; //移动平滑值
12 
13     void Update()
14     {
15         // 通过鼠标轴控制相机的远近
16         if ((Input.mouseScrollDelta.y < 0 && Camera.main.fieldOfView >= 3) || 
17             Input.mouseScrollDelta.y > 0 && Camera.main.fieldOfView <= 80)
18         {
19             Camera.main.fieldOfView += Input.mouseScrollDelta.y * Time.deltaTime;
20         }
21     }
22 
23     void LateUpdate()
24     {
25         //更新相机的位置
26         Vector3 disPos = target.position + Vector3.up * distanceUp - target.forward * distanceAway;
27         transform.position = Vector3.Lerp(transform.position, disPos, Time.deltaTime * smooth);
28         //更新相机的角度
29         transform.LookAt(target.position);
30     }
31 }

4. 鼠标控制相机旋转和缩放

通过鼠标控制相机围绕目标对象上下左右的旋转、视角的缩放

技术图片

 将脚本挂载到指定的 Camera 上,给 Target 字段赋值一个目标对象

技术图片

 按住鼠标左键控制相机的旋转,中键滚轮控制相机视角的缩放

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class CameraFollow_D : MonoBehaviour
 6 {
 7     public Transform target; //目标对象
 8     private Vector3 Rotion_Transform;
 9     private new Camera camera;
10 
11     void Start()
12     {
13         camera = GetComponent<Camera>();
14         Rotion_Transform = target.position;
15     }
16 
17     void Update()
18     {
19         Rotate();
20         Scale();
21     }
22 
23     //相机的上下左右旋转
24     private void Rotate()
25     {
26         var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
27         var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
28         if (Input.GetKey(KeyCode.Mouse0))
29         {
30             transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
31             transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
32         }
33     }
34 
35     //相机的视角缩放
36     private void Scale()
37     {
38         if (Input.GetAxis("Mouse ScrollWheel") > 0)
39         {
40             transform.Translate(Vector3.forward * 1f);//速度可调  自行调整
41         }
42         if (Input.GetAxis("Mouse ScrollWheel") < 0)
43         {
44             transform.Translate(Vector3.forward * -1f);//速度可调  自行调整
45         }
46     }
47 }

 

以上是关于Unity - 相机跟随的主要内容,如果未能解决你的问题,请参考以下文章

unity3d里照相机跟随鼠标左右移动的代码怎么写

Unity3d学习 相机的跟随

Unity3d学习 相机的跟随

Unity学习-相机的拉伸跟随旋转

Unity - 相机跟随

Unity相机跟随-----根据速度设置偏移量