PONOS Advent Calendar 2019の18日目の記事です。
昨日は @nisei275 さんのRustとWebSocketで実現したリアルタイム通信環境にUnityで通信してみるでした。
#はじめに
###DOTweenとは
DOTweenとはUnityで使用できる線形補間ライブラリ 自分が神アセットだと思うアセットの1つです。
読み方は「ドットゥイーン」
無料版と有料版のProがあります。
公式:http://dotween.demigiant.com/
AssetStore:https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676
###DOTweenを触るようになったきっかけ
かなり前の話ですが、cocos2d-xをメインにゲームを作っていました。
そんなcocos2d-xですが、標準でCocosActionという線形補間ライブラリが内蔵されています。
こんな感じのやつです。
auto enemySprite = Sprite::create("enemySprite.png");
auto moveTo = MoveTo::create(2, Vec2(50, 0));
enemySprite->runAction(moveTo);
cocos2d-xからUnityをメインに触るようになってから iTween -> DOTween を使用してきました。
前置きが長くなりましたが今回はそんな神アセット「DOTween」の使用法をご紹介をしたいと思います。
#導入 -> 初期設定
・AssetStoreでDOTweenを入手 -> インポート
https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676
・Setupタブ
こちらでセットアップができます。
・Preferenceタブ
こちらで初期設定が変更できます。
AutoPlayと初期EaseをLinearに変えておくと自分はやりやすかったです。
#実装
##Tweenの再生
Tweenの単発再生です。
using UnityEngine;
using DG.Tweening;
public class TestTween : MonoBehaviour
{
// 現在再生中のTween
Tween currentPlayTween;
// 開始時
void Start()
{
PlayMoveTween();
}
// Tweenの再生
void PlayMoveTween()
{
// 移動時間
float duration = 2f;
// 移動値
Vector3 endValue = new Vector3(10, 10, 0);
// Tweenの作成
currentPlayTween = transform.DOMove(endValue, duration);
// 相対に切り替え
currentPlayTween.SetRelative();
// イーズタイプの指定
currentPlayTween.SetEase(Ease.Linear);
// 再生
currentPlayTween.Play();
}
}
###結果
上記のコードでは2秒間で現在位置から(10, 10, 0) の距離を移動します。
SetRelative()をつけると絶対位置から相対位置になります
##Sequence ~ Tweenの連結 ~
Tweenを連結し、より複雑なことができます
using UnityEngine;
using DG.Tweening;
public class TestSequence : MonoBehaviour
{
// 現在再生中のSequence
Sequence currentPlaySequence;
SpriteRenderer spriteRenderer;
// 開始時
void Start()
{
spriteRenderer = GetComponent<SpriteRenderer>();
PlaySequence();
}
// Sequenceの再生
void PlaySequence()
{
// 移動時間
float moveDuration = 1f;
// 移動の最終値
Vector3 moveEndValue = new Vector3(10, 10, 0);
// 待機時間
float waitDuration = 1f;
// 透過時間
float fadeDuration = 1f;
// 透過最終値
float fadeEndValue = 0f;
// 移動Tweenの作成
Tween moveTween = transform.DOMove(moveEndValue, moveDuration).SetRelative().SetEase(Ease.Linear);
// 透過Tweenの作成
Tween fadeTween = spriteRenderer.DOFade(fadeEndValue, fadeDuration);
// Sequenceを生成
currentPlaySequence = DOTween.Sequence();
// Sequenceの構築
currentPlaySequence
.Append(moveTween)
.AppendInterval(waitDuration)
.AppendCallback(()=>Debug.Log("AppendCallback()"))
.Append(moveTween)
.Join(fadeTween);
// 再生
currentPlaySequence.Play();
}
}
Append(tween)
... Tweenの連結再生
Join(tween)
... Tweenの同時再生
AppendInterval(float)
... Tween終了時に空白の時間を設ける
AppendCallback(action)
... Tween再生時にコールバックを追加します
###結果
1秒かけて(10, 10, 0)移動し、1秒間待機し、ログを出し、1秒かけて(10, 10, 0)移動しながらアルファを0にします。
##任意の数値を線形補間する
// 時間
float duration = 1f;
// 最終値
int endValue = 100;
// 現在の値
int currentValue = 0;
// Tweenの生成
currentPlayTween = DOTween.To
(
() => currentValue,
value => currentValue = value,
endValue,
duration
);
currentPlayTween.OnUpdate(() => Debug.Log(currentValue));
// 再生
currentPlayTween.Play();
###結果
1秒かけて任意の変数の値が 0 から 100 になります
時間のカウントダウンなどに便利です
##コールバック
特定のタイミングで処理を挟むこともできます
// 移動時間
float duration = 1f;
// 移動の最終値
Vector3 endValue = new Vector3(10, 10, 0);
// Tweenの生成
currentPlayTween = transform.DOMove(endValue, duration).SetRelative().SetEase(Ease.Linear);
// ループの指定
currentPlayTween.SetLoops(-1, LoopType.Incremental);
// コールバック群
currentPlayTween.OnPlay(() => Debug.Log("OnPlay()"));
currentPlayTween.OnUpdate(() => Debug.Log("OnUpdate()"));
currentPlayTween.OnKill(() => Debug.Log("OnKill()"));
currentPlayTween.OnPause(() => Debug.Log("OnPause()"));
currentPlayTween.OnComplete(() => Debug.Log("OnComplete()"));
currentPlayTween.OnStepComplete(() => Debug.Log("OnStepComplete()"));
// 再生
currentPlayTween.Play();
OnPlay()
... 再生した時
OnUpdate()
... 数値が変わった時
OnKill()
... 破棄した時
OnPause()
... 一時停止した時
OnComplete()
... 完了した時
OnStepComplete()
... ループなど一節が完了した時
##Tweenの破棄
if (currentPlayTween != null)
{
// Tweenの破棄
currentPlayTween.Kill();
currentPlayTween = null;
}
Tweenに対してKill()を呼んでやることでTweenを破棄できます
#おわりに
基本の使い方は以上です
そして今回ご紹介したTweenはほんの一部です
もしDOTweenに興味が出たらいろいろ調べて触ってみてください('ω')
明日は @FW14B さんです!