假设你的精灵表单(Spritesheet)中有n个精灵(Sprite)是用于某一个动画中的,那么你可以将时间作为参数,用插值的方法来获得[0, n]之间的精灵索引值(Index)来控制精灵图片的切换速率,实现精灵动画(Sprite Animation)效果。
泡泡爆炸精灵表单(Spritesheet) 泡泡爆炸精灵动画播放效果以下为Unity中的范例代码
public class SpriteSheetAnimator : MonoBehaviour { // spritesheet中所有的sprites public Sprite[] sprites; // 动画播放一遍所需要的时间(周期) public float period; // 当前动画播放时间 private float t; private SpriteRenderer spriteRenderer; // Start is called before the first frame update void Start() { t = period; spriteRenderer = GetComponent<SpriteRenderer>(); } // Update is called once per frame void Update() { // 按下空格键重制时间,从头播放 if(Input.GetKeyDown(KeyCode.Space)){ t = 0; Debug.Log("Start"); } // 更新 当前时间t 和 当前精灵图片 if(t < period){ t += Time.deltaTime; // 利用获得以0为起点,(sprites总数-1)为终点的插值来计算当前精灵图片的index // 由于插值默认时间t在0..1之间(period = 1),这里需要用 t/period 来转化成动画播放的实际周期 int curIndex = Mathf.FloorToInt(interpolate(t / period, 0, sprites.Length - 1)); spriteRenderer.sprite = sprites[curIndex]; } } public float interpolate(float startVal, float endVal, float t){ return startVal + t * (endVal - startVal); } }除了上述两个被详细介绍的方面以外,插值也可以用于碰撞检测(实际上是通过使用参数方程来计算碰撞点是否存在,以后开单章介绍)以及曲线运动(基本和连接函数图像一样,这里就不赘述了)。同时,插值在图形学中也有很多妙用。不过对于游戏开发来说,图形学涉及的部分已经非常底层,这里也同样略过了。
4. 总结总体而言,插值在实现简单的动态效果上是非常实用的,更何况他的实现方式也并不复杂,而且大部分游戏开发工具都会自带插值函数。不过要学习更多有趣的插值函数和运用方法,不是短短一篇博客可以解决的,这篇文章也旨在帮助大家了解插值在游戏开发中最常用到的地方,所以如果有兴趣进一步了解的话还是需要自己去学习。