[Unity3D]关于Camera摄像头跟随物体移动的几种方法
目录
序言
首先说一句,关于摄像头移动的方式有多种,每种都对应着一个情景。这篇文章就针对不同的情景展开摄像头用法的说明。
法一——摄像头与物体存在父子关系
这是最简单的方法,只需要把摄像头拖拽到被观察物体的下面,使得被观察物体成为摄像头的父物体。
由于父子物体间存在位矢与方向角的关系,且这种关系会由Unity3D引擎计算维持。所以此方法不需要任何代码,即可实现摄像头跟随物体移动。
这种方式虽然简单,但弊端极大:
物体移动时,摄像头会抖动;
物体旋转时,摄像头会因为移动不平滑而导致玩家出现“晕3D”的效果;
所以就有了第二种办法。
法二——Lerp函数加上坐标变换
位置变换大家应该都知道。先看图:
保持一定,即摄像机(A物体)与被观察者(B物体)简单位置关系保持不变。
简单点,就是:
现在,坐标变换的方式有了,在说说如何平滑移动。
Lerp函数(线性插值函数)
Lerp函数有许多类,但限于篇幅,只说要用的 Vector3.Lerp(From:V3 , To:V3 , T: float )
这是两个向量之间的线性插值,按照数字t在From到To之间插值。
如:T=0时,返回From;
T=1时,返回To;
T=0.5时,返回From与To的中间值。
接着是代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraScript_1 : MonoBehaviour
{
public GameObject Target;
public float smooth = 2f;
Vector3 distance;
// Start is called before the first frame update
void Start()
{
distance = transform.position - Target.transform.position;
}
// Update is called once per frame
void LateUpdate()
{
transform.position = Vector3.Lerp(Target.transform.position+distance, transform.position, Time.deltaTime * smooth);
transform.LookAt(Target.transform.position);//摄像头Wink物体,不然不丝滑
}
}
使用场景
适合摄像头不随着物体旋转而旋转的场景。
如:Dota2,LOL,某荣耀等MOBA类游戏;
以及坦克大战、Mario诸类游戏。
法三——第一人称类游戏
(说实话,这其实不算在相机跟随物体移动的范畴中。
它是由鼠标控制摄像头方向。出于仁慈,把它写了下来。)
第一人称类游戏,说白了就是把摄像头当做玩家的眼睛。
这个时候就要用到法一:
可以把摄像头作为物体的子物体,控制摄像头水平旋转只需要控制物体左右旋转。这样有个好处,就是不必考虑摄像头与物体本身的相对静止。
摄像头只需要在竖直方向上移动,再通过之前提过的矢量变换,就可以咯。
上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraScript_2 : MonoBehaviour
{
public float Gate = 0.2f;
public float speed=2;
public GameObject Target;
// Update is called once per frame
void Update()
{
float mouseX = Input.GetAxis("Mouse X") * speed;
float mouseY = Input.GetAxis("Mouse Y") * speed;
Target.transform.localRotation = Target.transform.localRotation * Quaternion.Euler(0, mouseX, 0);
if (transform.rotation.x <= -Gate|transform.rotation.x>=Gate)
{
transform.localRotation = transform.localRotation * Quaternion.Euler(mouseY, 0, 0);
}
else
{
transform.localRotation = transform.localRotation * Quaternion.Euler(-mouseY, 0, 0);
}//限定旋转的角度,转多了该看的不该看的都看了
}
}
这就是第一人称的情景:
如:CSGO、TF2等射击游戏
法四——固定不动
没啥好说的,就是放在那里不动。
情景有:
打飞机、皇室战争等固定摄像头游戏。
结束
这篇文章讲了摄像头随着物体移动的几种方法。
谢谢读者,我们一起进步。