场景镜头1-一般跟随

944 阅读2分钟

经常在unity3d 开发中会遇见各种各样的相机视角,当我们控制角色移动时,我们也需要摄像机按照一定的规则去进行移动或变换。而在接下来的文章中您将看见,对每种要实现摄像机变换的理解以及代码实现。

首先先看一下最普遍常用的固定跟随视角

这样的固定跟随视角比较简单,有多种实现方法,这里主要介绍两个。

2.gif

1.只需要将camera对象放在跟随模型上作为子对象即可,完全不需要任何的代码编写。

image.png
当然这种方式是扩展性极低,不推荐,当您需要销毁模型时,这必然会让过程变得复杂。

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;
    }
}


接着可以在脚本中添加一下,滚轮的缩放用来拉远和拉近摄像机。
这里没有使用camearfieldOfView来缩放视野,而使用的是摄像机的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);