2DToolKit 注意点

「2DToolKit 注意点」の編集履歴(バックアップ)一覧に戻る

2DToolKit 注意点 - (2011/11/16 (水) 19:25:17) のソース

*「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()などでスケール値を書きかえるなどの対応が必要になります。
こんな感じ?

#highlight(){{
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のシステムの問題の気もするので、なにか解決方法があるかもしれません。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。