「Unity/Csharp/DoTween」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→繰り返し) |
(→完了するまで処理を待機する) |
||
(同じ利用者による、間の40版が非表示) | |||
行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) | ||
===遅延動作=== | ===遅延動作=== | ||
行49: | 行51: | ||
https://github.com/Nightonke/WoWoViewPager/blob/master/Pictures/ease.png | https://github.com/Nightonke/WoWoViewPager/blob/master/Pictures/ease.png | ||
− | === | + | ===動きを止める=== |
オブジェクト指定 | オブジェクト指定 | ||
DOTween.Kill(this.transform); | DOTween.Kill(this.transform); | ||
行57: | 行59: | ||
参考:https://qiita.com/broken55/items/df152c061da759ad1471 | 参考: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秒で一回転 | ||
+ | <pre> | ||
+ | .DOLocalRotate(new Vector3(0, 0, 360f), 30f, RotateMode.FastBeyond360) | ||
+ | .SetEase(Ease.Linear) | ||
+ | .SetLoops(-1, LoopType.Restart); | ||
+ | </pre> | ||
+ | |||
+ | ===色変更=== | ||
+ | 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秒前に正面の向きを変える | ||
+ | <pre> | ||
+ | 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); | ||
+ | </pre> | ||
+ | |||
+ | ===星型に移動する=== | ||
+ | *root座標のときは、DOPathを使う。 | ||
+ | |||
+ | <pre> | ||
+ | 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); | ||
+ | </pre> | ||
+ | ローカル値を使う場合は、DOLocalPathを使う | ||
+ | |||
+ | 参考:https://qiita.com/BEATnonanka/items/50cacac803f88f5074dd | ||
+ | |||
+ | ===曲線でつなぐ=== | ||
+ | <pre> | ||
+ | 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); | ||
+ | </pre> | ||
+ | |||
+ | ===完了したら関数実行=== | ||
+ | パターン1 | ||
+ | <pre> | ||
+ | GameObject.Find("Image").transform.DOPath(movepath, 5f, PathType.Linear, PathMode.Sidescroller2D).OnComplete(CallbackComplete); | ||
+ | } | ||
+ | void CallbackComplete() | ||
+ | { | ||
+ | Debug.Log("CallbackComplete"); | ||
+ | } | ||
+ | </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
インストール
- unityassetsからdotweenを検索して、
- dotweenのfree ( https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676 ) をダウンロード
- installし、
- importする
- OpenDoTweenUtilityPanelを開き
- 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();