※もはやVRは先になりそうなので、タイトルをちょっと変更
花札の札をめくる動作について考えてみます。
プログラミングで回転させるのは、地味に面倒です。
そこで、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();
ラムダ式が便利すぎて多用していますが、ちょっと間違えると修正が大変なのがデメリットですね・・・
というわけで、札の動きがそれっぽくなりました。
普通の花札だとつまらないので、エフェクトを大量に使っていこうと思います。