facebook twitter hatena line email

「Unity/Csharp/DoTween」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(星型に移動する)
(完了するまで処理を待機する)
(同じ利用者による、間の27版が非表示)
行29: 行29:
 
無限繰り返し
 
無限繰り返し
 
<pre>
 
<pre>
GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f);
+
GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f)
 
.SetLoops(-1, LoopType.Restart);
 
.SetLoops(-1, LoopType.Restart);
 
</pre>
 
</pre>
 
2回指定
 
2回指定
 
<pre>
 
<pre>
GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f);
+
GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f)
 
.SetLoops(2, LoopType.Restart);
 
.SetLoops(2, LoopType.Restart);
 
</pre>
 
</pre>
 +
4回往復
 +
.SetLoops(4, LoopType.Yoyo)
  
 
===遅延動作===
 
===遅延動作===
行65: 行67:
 
5秒で、90度回転
 
5秒で、90度回転
 
  .DORotate(Vector3.up * 90f, 5f)
 
  .DORotate(Vector3.up * 90f, 5f)
 +
 +
===回転2D===
 +
30秒で一回転
 +
<pre>
 +
.DOLocalRotate(new Vector3(0, 0, 360f), 30f, RotateMode.FastBeyond360)
 +
.SetEase(Ease.Linear)
 +
.SetLoops(-1, LoopType.Restart);
 +
</pre>
  
 
===色変更===
 
===色変更===
行70: 行80:
 
  Image image = GameObject.Find("Image").GetComponent<Image>();
 
  Image image = GameObject.Find("Image").GetComponent<Image>();
 
  image.DOColor(Color.brue, 5f).SetEase(Ease.Linear);
 
  image.DOColor(Color.brue, 5f).SetEase(Ease.Linear);
 +
 +
===徐々に透明へ===
 +
透明度を10秒で0%へ
 +
image.DOFade(endValue: 0f, duration: 10f);
 +
 +
===拡大縮小===
 +
obj.transform.DOScale(new Vector3(1f, 1f, 0f), 1.0f);
 +
obj.transform.DOScaleX(1f, 1.0f);
 +
obj.transform.DOScaleY(1f, 1.0f);
 +
 +
===振動===
 +
1秒間に震える
 +
obj.transform.DOShakePosition(duration: 1f);
 +
1秒間に震える(オプション付き)
 +
obj.transform.DOShakePosition(duration: 1, strength: 5, vibrato: 30, fadeOut: false)
  
 
===指定座標の上を移動する===
 
===指定座標の上を移動する===
行123: 行148:
  
 
===完了したら関数実行===
 
===完了したら関数実行===
 +
パターン1
 
<pre>
 
<pre>
 
GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D).OnComplete(CallbackComplete);
 
GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D).OnComplete(CallbackComplete);
行131: 行157:
 
}
 
}
 
</pre>
 
</pre>
 +
パターン2
 +
<pre>
 +
GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D).OnComplete(() =>
 +
{
 +
    Debug.Log("CallbackComplete");
 +
});
 +
</pre>
 +
===コールバック一覧===
 +
<pre>
 +
.OnComplete(Callback);
 +
.OnStart(Callback);
 +
.OnUpdate(Callback);
 +
.OnKill(Callback);
 +
</pre>
 +
 +
===複数動作をつなげる===
 +
<pre>
 +
var sequence = DOTween.Sequence();
 +
sequence.Append(this.transform.DOMove(new Vector3(1f, 3f, 0f), 1f));
 +
sequence.Append(this.transform.DOMove(new Vector3(2f, 4f, 0f), 1f));
 +
sequence.Play();
 +
</pre>
 +
 +
===複数同時実行をつなげる===
 +
<pre>
 +
var sequence = DOTween.Sequence();
 +
sequence.Append(this.transform.DOMove(new Vector3(1f, 3f, 0f), 1f));
 +
sequence.Append(this.transform.DOMove(new Vector3(2f, 4f, 0f), 1f));
 +
sequence.Join(this.transform.DOScale(Vector3.one * 3f, 1f)); // 1つ前と同時に実行
 +
sequence.Join(this.transform.DORotate(new Vector3(0, 0, 360f), 1f, RotateMode.FastBeyond360)); // 1つ前と同時に実行
 +
sequence.Play();
 +
</pre>
 +
 +
===テキストカウントアップ===
 +
<pre>
 +
int start = 10;
 +
int end = 1000;
 +
DOTween.To(() => start, (n) => start = n, end, 1)
 +
    .OnUpdate(() => text.text = start.ToString("#,0"));
 +
</pre>
 +
 +
参考:http://halcyonsystemblog.jp/blog-entry-524.html
 +
 +
===数秒遅延===
 +
<pre>
 +
DOVirtual.DelayedCall(2.0f, () => {
 +
  // 2秒後実行
 +
});
 +
</pre>
 +
 +
===完了するまで処理を待機する===
 +
<pre>
 +
async void BasicAsync()
 +
{
 +
    await GameObject.Find("Image").transform.DOMove(new Vector3(3f, 3f, 0f), 2f)
 +
        // .SetEase(Ease.InExpo)
 +
        .SetEase(Ease.Linear)
 +
        .AsyncWaitForCompletion();
 +
    Debug.Log("完了");
 +
}
 +
</pre>
 +
====sequenceの場合====
 +
await sequence.AsyncWaitForCompletion();

2021年10月15日 (金) 03:41時点における版

dotweenとは

アニメーションライブラリ

参考:https://qiita.com/broken55/items/df152c061da759ad1471

インストール

  1. unityassetsからdotweenを検索して、
  2. dotweenのfree ( https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676 ) をダウンロード
  3. installし、
  4. importする
  5. OpenDoTweenUtilityPanelを開き
  6. SetupDotweenボタンを押して、Applyを押す。

サンプル

x=2、y=3のrootから見た座標に1秒後に移動する。

using DG.Tweening;
using UnityEngine;
public class SampleScene : MonoBehaviour
{
    void Start()
    {
        GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f);
    }
}

繰り返し

無限繰り返し

GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f)
.SetLoops(-1, LoopType.Restart);

2回指定

GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f)
.SetLoops(2, LoopType.Restart);

4回往復

.SetLoops(4, LoopType.Yoyo)

遅延動作

5秒待ってから動作

.SetDelay(5f);

Easeの動き

.SetEase(Ease.Linear); // 線形
.SetEase(Ease.OutSine); // 最初速く後ゆっくり
.SetEase(Ease.InExpo); // 最初ゆっくり後速く

https://github.com/Nightonke/WoWoViewPager/blob/master/Pictures/ease.png

動きを止める

オブジェクト指定

DOTween.Kill(this.transform);

tweenインスタンスを作って止める

Tween tween = GameObject.Find("Image").transform.DOMove(new Vector3(2f, 3f, 0f), 1f);
tween.Kill();

参考:https://qiita.com/broken55/items/df152c061da759ad1471

ローカル座標

DOLocalMoveとする

GameObject.Find("Image").transform.DOLocalMove(new Vector3(2f, 3f, 0f), 1f);

回転

5秒で、90度回転

.DORotate(Vector3.up * 90f, 5f)

回転2D

30秒で一回転

.DOLocalRotate(new Vector3(0, 0, 360f), 30f, RotateMode.FastBeyond360)
.SetEase(Ease.Linear)
.SetLoops(-1, LoopType.Restart);

色変更

5秒で青へ

Image image = GameObject.Find("Image").GetComponent<Image>();
image.DOColor(Color.brue, 5f).SetEase(Ease.Linear);

徐々に透明へ

透明度を10秒で0%へ

image.DOFade(endValue: 0f, duration: 10f);

拡大縮小

obj.transform.DOScale(new Vector3(1f, 1f, 0f), 1.0f);
obj.transform.DOScaleX(1f, 1.0f);
obj.transform.DOScaleY(1f, 1.0f);

振動

1秒間に震える

obj.transform.DOShakePosition(duration: 1f);

1秒間に震える(オプション付き)

obj.transform.DOShakePosition(duration: 1, strength: 5, vibrato: 30, fadeOut: false)

指定座標の上を移動する

  • 2Dの場合は、PathMode.Sidescroller2Dを追加する。
  • SetLookAtは、傾きが変わるx秒前に正面の向きを変える
Vector3[] movepath =
{
    new Vector3(0f,0f,0f),
    new Vector3(0f,100f,0f),
    new Vector3(100f,100f,0f),
    new Vector3(100f,0f,0f),
    new Vector3(0f,0f,0f)
};
GameObject.Find("Image").transform.DOLocalPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D)
    .SetLookAt(0.1f)
    .SetLoops(-1, LoopType.Restart);

星型に移動する

  • root座標のときは、DOPathを使う。
Vector3[] movepath = new Vector3[6];
movepath[0].Set(0f, 1f, 0f); // 1
movepath[1].Set(0.5878f, -0.8090f, 0f); // 5
movepath[2].Set(-0.9511f, 0.3090f, 0f); // 9
movepath[3].Set(0.9511f , 0.3090f, 0f); // 3
movepath[4].Set(-0.5878f, -0.8090f, 0f); // 7
movepath[5].Set(0f, 1f, 0f); // 1
// 星型頂点 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10137274530
GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D)
            .SetLookAt(0.01f)
            .SetLoops(-1, LoopType.Restart);

ローカル値を使う場合は、DOLocalPathを使う

参考:https://qiita.com/BEATnonanka/items/50cacac803f88f5074dd

曲線でつなぐ

Vector3[] movepath =
{
    new Vector3(0f,0f,0f),
    new Vector3(200f,-100f,0f),
    new Vector3(400f,-300f,0f),
};
GameObject.Find("Image").transform.DOLocalPath(movepath, 0.5f, PathType.CatmullRom, PathMode.Sidescroller2D)
    .SetEase(Ease.Linear)
    .SetLookAt(0.1f)
    .SetLoops(-1, LoopType.Restart);

完了したら関数実行

パターン1

GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D).OnComplete(CallbackComplete);
}
void CallbackComplete()
{
    Debug.Log("CallbackComplete");
}

パターン2

GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D).OnComplete(() =>
{
    Debug.Log("CallbackComplete");
});

コールバック一覧

.OnComplete(Callback);
.OnStart(Callback);
.OnUpdate(Callback);
.OnKill(Callback);

複数動作をつなげる

var sequence = DOTween.Sequence();
sequence.Append(this.transform.DOMove(new Vector3(1f, 3f, 0f), 1f));
sequence.Append(this.transform.DOMove(new Vector3(2f, 4f, 0f), 1f));
sequence.Play();

複数同時実行をつなげる

var sequence = DOTween.Sequence();
sequence.Append(this.transform.DOMove(new Vector3(1f, 3f, 0f), 1f));
sequence.Append(this.transform.DOMove(new Vector3(2f, 4f, 0f), 1f));
sequence.Join(this.transform.DOScale(Vector3.one * 3f, 1f)); // 1つ前と同時に実行
sequence.Join(this.transform.DORotate(new Vector3(0, 0, 360f), 1f, RotateMode.FastBeyond360)); // 1つ前と同時に実行
sequence.Play();

テキストカウントアップ

int start = 10;
int end = 1000;
DOTween.To(() => start, (n) => start = n, end, 1)
    .OnUpdate(() => text.text = start.ToString("#,0"));

参考:http://halcyonsystemblog.jp/blog-entry-524.html

数秒遅延

DOVirtual.DelayedCall(2.0f, () => {
   // 2秒後実行
});

完了するまで処理を待機する

async void BasicAsync()
{
    await GameObject.Find("Image").transform.DOMove(new Vector3(3f, 3f, 0f), 2f)
        // .SetEase(Ease.InExpo)
        .SetEase(Ease.Linear)
        .AsyncWaitForCompletion();
    Debug.Log("完了");
}

sequenceの場合

await sequence.AsyncWaitForCompletion();