head_hexagonはにらぼ☆てっくtale_hexagon

[Unity]Meshの頂点を移動

Posted by koichi on 2014/06/19 under Development | Be the First to Comment


こんにちわ、koichiです。

今日はUnityのMeshの頂点を動かす話です。

ペラ絵の単純なアニメの場合、ソフト側でいじったほうが早いって言うのもありますよね。
ボーンいれてアニメーションさせるほどでもないし・・・という時ですね。
単純なペラモデルをスクリプトで動かしてみました。

Meshの頂点をゲット

Meshの各頂点はverticesというプロパティに入っています。

Mesh mesh = GetComponent<MeshFilter> ().mesh;
Vector3[] vertices = mesh.vertices;

これで頂点の配列が取得できます。
あとは、その頂点を好きに動かすだけ。
どの頂点がどこにあるかはちゃんと把握してないとだめですよ。

で、動かしたあとは、

mesh.RecalculateBounds ();    

これでその変更を反映させます。
これがないと変わりません。超だいじ。

ネコ、伸びる

で、動かしてみたのがこちら、
cat

びよんびよーん
どことなく懐かしい動きです。

というわけで、コード。
scaleとanimationTimerDenoはエディター側でつけてます。

public class PlaneVertexAnimation : MonoBehaviour {
	
	MeshFilter _meshFilter;
	Vector3[] _defaultVertices;
	Mesh _mesh;

	[SerializeField]
	float _scale;
	[SerializeField]
	float _animationTimerDeno;

	float _animationTimer;

	// Use this for initialization
	void Awake()
	{
		_mesh = GetComponent<MeshFilter> ().mesh;
		_defaultVertices = _mesh.vertices;
	}
	
	// Update is called once per frame
	void Update()
	{
		Vector3[] vertices = _mesh.vertices;
	
		_animationTimer += Time.deltaTime;
		if (_animationTimer > _animationTimerDeno) {
			_animationTimer -= _animationTimerDeno;
		}
		float rate = _animationTimer / _animationTimerDeno;
		float amp = 0.5f * (Mathf.Sin (Mathf.PI * 2.0f * (rate)) + 1.0f);

		vertices [0].y = _defaultVertices [0].y + _scale * amp;
		vertices [2].y = _defaultVertices [2].y + _scale * amp;

		_mesh.vertices = vertices;
		_mesh.RecalculateBounds ();    
	}
}

コメントを残す