在制作游戏的时候,动画是不可或缺的一部份,即使是与游戏核心无关的 GUI 部份,若少了动画就显得粗制滥造。然而大多数的 GUI 效果:像是视窗飞进画面中央、按下按钮时放大效果之类的动画等等,其内容都有很高的相似性,也就是「在某段时间内,把物件的某些状态转移到另一个状态」。若要使用 3D Max 之类的软件一一制作,将显得麻烦而没有效率。
在这篇文章中,以 Unity 作为范例,介绍如何实作一个简单的 easing function 元件。
范例需求
想像一下我们正在制作游戏过程中的暂停按钮。当玩家按下暂停钮时,画面上会出现暂停的面板以及三个按钮。当然,直接让它们出现是很粗糙的作法,因此我们希望面板及按钮可以从画面外飞进来。
使用线性内插
最简单的呈现方式是使用线性内插法,指定好某个物件的起始状态(位置、大小、顏色等)与结束状态,再指定动画时间。只要有了这些资讯,我们可以用简单的数学运算内插出动画播放时每一格 frame 的物件状态。
01 |
using UnityEngine; |
02 |
using System; |
03 |
|
04 |
public class EasingDemo : MonoBehaviour { |
05 |
public Vector3 destination; |
06 |
public float duration = 1; |
07 |
public float delay = 0; |
08 |
|
09 |
private Vector3 source; |
10 |
private Vector3 delta; |
11 |
private float elapsed = 0; |
12 |
|
13 |
void Start() |
14 |
{
|
15 |
source = transform.position; |
16 |
delta = destination − source; |