实现精灵动画的方式有很多种:今天讲一种手写脚本定位spritesheet的偏移实现动画的方法。
先上效果图。
连续动画的实现
将textures设置成Sprite2D(根据需要,背景没有透明时不需要调),然后切图。
创建一个材质球,将shader设置为:Mobile/Particles/AlphaBlended.然后设置texture。
将材质球附给Plane。
创建脚本控制偏移附给Plane。
讲解1:
确定一系列变量:
public int Columns = 5; //列数
public int Rows = 5; //行数
public float FramesPerSecond = 10f; //修改的帧率
public bool RunOnce = true; //动画是否循环
讲解2:
先获取自身材质的拷贝,然后根据定制好的行列修改材质Texture尺寸。
//拷贝一份自身的材质,避免影响材质的其他受众
materialCopy = new Material(GetComponent<Renderer>().sharedMaterial);
GetComponent<Renderer>().sharedMaterial = materialCopy;
Vector2 size = new Vector2(1f / Columns, 1f / Rows);
GetComponent<Renderer>().sharedMaterial.SetTextureScale("_MainTex", size);
讲解3:
然后不停修改材质texture的偏移量,达到动画的效果。
float x = 0f;
float y = 0f;
Vector2 offset = Vector2.zero;
while (true)
{
for (int i = Rows-1; i >= 0; i--) // y
{
y = (float) i / Rows;
for (int j = 0; j <= Columns-1; j++) // x
{
x = (float) j / Columns;
offset.Set(x, y);
GetComponent<Renderer>().sharedMaterial.SetTextureOffset("_MainTex", offset);
yield return new WaitForSeconds(1f / FramesPerSecond);
}
}
if (RunOnce)
{
yield break;
}
}
完整代码:
class SpriteSheetAnimation : MonoBehaviour
{
public int Columns = 5;
public int Rows = 5;
public float FramesPerSecond = 10f;
public bool RunOnce = true;
public float RunTimeInSeconds
{
get
{
return ( (1f / FramesPerSecond) * (Columns * Rows) );
}
}
private Material materialCopy = null;
void Start()
{
//拷贝一份自身的材质,避免影响材质的其他受众
materialCopy = new Material(GetComponent<Renderer>().sharedMaterial);
GetComponent<Renderer>().sharedMaterial = materialCopy;
Vector2 size = new Vector2(1f / Columns, 1f / Rows);
GetComponent<Renderer>().sharedMaterial.SetTextureScale("_MainTex", size);
}
void OnEnable()
{
StartCoroutine(UpdateTiling());
}
private IEnumerator UpdateTiling()
{
float x = 0f;
float y = 0f;
Vector2 offset = Vector2.zero;
while (true)
{
for (int i = Rows-1; i >= 0; i--) // y
{
y = (float) i / Rows;
for (int j = 0; j <= Columns-1; j++) // x
{
x = (float) j / Columns;
offset.Set(x, y);
GetComponent<Renderer>().sharedMaterial.SetTextureOffset("_MainTex", offset);
yield return new WaitForSeconds(1f / FramesPerSecond);
}
}
if (RunOnce)
{
yield break;
}
}
}
}