问题概述
无论是什么类型的游戏,镜头都是一个不可或缺的元素。我们往往希望镜头跟随主角进行移动,但有时也会衍生出很多问题,例如镜头移动过于僵硬(即不圆滑,戛然而动又戛然而止),或是主角被永远固定在镜头正中央(显示不出人物的动态)。
解决方案
其实这个问题的本质在于:镜头的移动缺乏质感,换句话说,与我们人眼视野的转变不相符。在现实生活中,一定是我们看到的事物先动,在一段延迟之后我们的眼睛才会跟着动;另一方面,我们在移动视野的时候,也一定是由慢到快,再由快到慢的“柔化”过程,而不是突然甩头转换视野然后突然定住,这样会显得十分突兀。
综上所述,我们不妨将main camera也赋予物理模型,让其模拟“在物理世界中,人眼的转换方式”。具体的流程如下:
给camera挂上脚本和刚体,在rigidbody中把bodytype选为dynamic,注意设定摩擦力;
进入脚本,获取刚体的组件,并获取主角及相机的坐标;
计算施加力度的公式(详细解释见后文);
编写施加力的代码;
测试临界值是否符合预期。(临界值指的是,当主角偏离视角中心多远时开始转换视角)
代码实现
代码不难实现,关键还是要根据自己游戏中的需求,对施力算法和临界值进行 修改。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Camera : MonoBehaviour
{
public GameObject go;
private float gox;
private float goy;
private float x;
private float y;
private float speed=7;
[HideInInspector]
public Rigidbody2D rg;
private void Awake()
{
rg = GetComponent<Rigidbody2D>();
}
private void Update()
{
gox = go.transform.position.x;
goy = go.transform.position.y;
x = transform.position.x;
y = transform.position.y;
if (gox - x > 6&&x<98) rg.AddForce(new Vector2(gox - x, 0) * speed);
if (x - gox > 6&&x>-96) rg.AddForce(new Vector2(gox - x, 0) * speed);
if (y - goy > 1&&y>-26) rg.AddForce(new Vector2(0, goy - y) * speed);
if (goy - y > 1&&y<26) rg.AddForce(new Vector2(0, goy - y) * speed);
}
}
上图中,6是x方向的临界值,1是y方向的临界值,当|gox-x|超过临界值后开始对相机施加力度。
要注意的是相机快到达场景边缘的时候就不能再施加力了,因此需要设定x、y方向的极值(极值要在一定程度上小于实际的场景边缘值,不然惯性会把相机推出场景)