经常在unity3d 开发中会遇见各种各样的相机视角,当我们控制角色移动时,我们也需要摄像机按照一定的规则去进行移动或变换。而在接下来的文章中您将看见,对每种要实现摄像机变换的理解以及代码实现。
首先先看一下最普遍常用的固定跟随视角
这样的固定跟随视角比较简单,有多种实现方法,这里主要介绍两个。
1.只需要将camera对象放在跟随模型上作为子对象即可,完全不需要任何的代码编写。
当然这种方式是扩展性极低,不推荐,当您需要销毁模型时,这必然会让过程变得复杂。
2.第二种使用偏移量来进行运算
在Camera对象下挂在一个Move.cs脚本用来控制摄像机的移动
代码很容易理解:
使用public变量 在isnpector界面中绑定角色对象。
offset 作为相机与角色的固定差值在Awake方法中取得。
然后只需要在LateUpdate中根据当前角色坐标加上固定差值即可计算的到当前相机位置。
将相机位移放在LateUpdate中是一种比较好的方式,update的逐帧刷新是很不固定的,多个脚本Update的先后顺序也不是固定的,LateUpdate是在所有Update函数调用后被调用。可用于调整脚本执行顺序。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCamera : MonoBehaviour
{
public Transform player;
private Vector3 offset;
private void Awake()
{
offset = transform.position - player.position;
}
private void LateUpdate()
{
transform.position = player.position + offset;
}
}
接着可以在脚本中添加一下,滚轮的缩放用来拉远和拉近摄像机。
这里没有使用camear的fieldOfView来缩放视野,而使用的是摄像机的position来达到效果。
**Input.GetAxis("Mouse ScrollWheel")**获取滚轮输入。
方法中的数学理解:向量=单位向量*向量长度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCamera : MonoBehaviour
{
public Transform player;
public float scrollViewSpeed = 3;//缩放速度
private Vector3 offset;
private float distance = 0;
private void Awake()
{
offset = transform.position - player.position;
MainCamera = GetComponent<Camera>();
}
private void LateUpdate()
{
transform.position = player.position + offset;
distance = offset.magnitude;//获取向量的长度
distance += -Input.GetAxis("Mouse ScrollWheel") * scrollViewSpeed;//获取滚轮值
offset = offset.normalized * distance ;
}
}
还可以给这个距离添加限制,在2,18区间内,这个值需要自己测试得到。
distance = Mathf.Clamp(distance, 2, 18);