2021年11月9日火曜日

Unityで花札を作る ver03: 札を回転させてみる

※もはやVRは先になりそうなので、タイトルをちょっと変更 

花札の札をめくる動作について考えてみます。
プログラミングで回転させるのは、地味に面倒です。




そこで、DOTWeenを使うと簡単に実現できます。

参考)Unity DOTween 入門

▼ソースコード
その場で回転ではなく、上に少し移動させながら回転させています。

using DG.Tweening;  //DOTween
using UnityEngine;

public class Fuda : MonoBehaviour
{
    void Start()
    {
        //移動(相対的にy軸へ0.5、0.5秒かけて移動)
        this.transform.DOMove(new Vector3(0f, 0.5f, 0f), 0.5f).SetRelative(true);
        //回転(90度、横回転)
        this.transform.DORotate(new Vector3(0f, 90f, 0f), 0.5f);
    }
}



実際には、回転が終わったら場に移動させたいです。
その場合は、Sequenceを使うとよいのですが

コルーチンとラムダ式を使う方が後々楽な気がします。
具体的には以下のような感じです。
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DebugCards : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //コルーチンの呼び出し
        IEnumerator method = RotationFuda(this.transform, () => {
            Debug.Log("回転が終わった後にこの処理が実行される");

        });
        StartCoroutine(method);
    }

    //札を回転コルーチン
    //target: 回転対象のTransform
    //nextAction: 次に実行したい関数(ラムダ式で渡される)
    IEnumerator RotationFuda(Transform target, System.Action nextAction) {
        target.DOMove(new Vector3(0f, 1.0f, 0f), 1f).SetRelative(true);
        target.DORotate(new Vector3(0f, 90f, 360f), 1f);

        //1.5秒待機
        yield return new WaitForSeconds (1.5f);        

        //次の処理
        nextAction();        
    }

}


ラムダ式は無名関数と呼ばれており、関数だけど名前なしの使い捨て(その場限りの)関数っていう感じです。具体的には以下の処理です。
 () => {
      Debug.Log("回転が終わった後にこの処理が実行される");
  }

これ自体を引数として関数へ渡し、パラメータとして受け取りますがその際に「System.Action」で受け取ります。←ポイント

受け取った後は、そのまま関数として実行することができます。
  //次の処理
  nextAction();        

ラムダ式が便利すぎて多用していますが、ちょっと間違えると修正が大変なのがデメリットですね・・・

というわけで、札の動きがそれっぽくなりました。


普通の花札だとつまらないので、エフェクトを大量に使っていこうと思います。

0 件のコメント:

コメントを投稿