「dynamic batching」について。
同じマテリアルであれば、300頂点まで動的にメッシュを作成して、まとめて表示するUnityの描画エンジン標準の機能らしく、
基本的には、モバイルの2D描画を早くするには、これに乗っかるようにデータを作るのでポイントのようです。
2DToolKitは複数のスプライトであっても、同じマテリアルになるように
- アトラステクスチャでテクスチャを統一。
- premultied Alhaを使ってアルファブレンドの加算合成とノーマル合成を統一。
などをして、「dynamic batching」を生かすようにしています。
ただし、この「dynamic batching」には落とし穴があって
Transfomのうちscaleの値が違うものがあると、「dynamic batching」が利かなくなってしまうようです。
その対応として、2DToolKitではtk2dSpriteに独自のscaleパラメーターを持たせて、内部でスケール処理をしています。
Unity Communityより
Mesh will be copied ONLY if non-uniform scale is used.
If you set uniformal scale (both X, Y and Z scale are equal) Unity will NOT make a copy of a mesh.
However dynamic batching can not batch scaled and non-scaled meshes together because it has to change GPU re-normalization state (others your lighting would go wonky).
なので、Animationコンポーネントを追加して、キーフレームアニメーションをする場合は
Transformのスケールはいじらずに、tk2dSprite側のスケールを更新する必要があります。
しかし、この値を直接いじっても、内部処理が走らないためスケール値が描画に反映されません。
ヘルパークラスを作るなどして、ヘルパークラスの値をキーフレームアニメさせて、ヘルパー内部のUpdate()などでスケール値を書きかえるなどの対応が必要になります。
こんな感じ?
using UnityEngine;
using System.Collections;
public class tk2DAnimationHelper : MonoBehaviour {
tk2dSprite sprite;
public Vector3 scale = Vector3.one;
public Color color = Color.white;
void Start () {
sprite = GetComponent<tk2dSprite>();
scale = sprite.scale;
color = sprite.color;
}
void Update () {
if( scale != sprite.scale )
{
sprite.scale = scale;
}
if( color != sprite.color )
{
sprite.color = color;
}
}
}
キーフレームアニメで値を直接いじっても、内部処理を走らせられないという問題は、色の変更なども同様になります。
Unityのシステムの問題の気もするので、なにか解決方法があるかもしれません。
最終更新:2011年11月16日 19:25