Unity3D经验—柔化镜头跟随

分类栏目:unity3d教程

243

问题概述

无论是什么类型的游戏,镜头都是一个不可或缺的元素。我们往往希望镜头跟随主角进行移动,但有时也会衍生出很多问题,例如镜头移动过于僵硬(即不圆滑,戛然而动又戛然而止),或是主角被永远固定在镜头正中央(显示不出人物的动态)。

解决方案

其实这个问题的本质在于:镜头的移动缺乏质感,换句话说,与我们人眼视野的转变不相符。在现实生活中,一定是我们看到的事物先动,在一段延迟之后我们的眼睛才会跟着动;另一方面,我们在移动视野的时候,也一定是由慢到快,再由快到慢的“柔化”过程,而不是突然甩头转换视野然后突然定住,这样会显得十分突兀。

综上所述,我们不妨将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方向的极值(极值要在一定程度上小于实际的场景边缘值,不然惯性会把相机推出场景)