読者です 読者をやめる 読者になる 読者になる

peroon's diary

game programmer

UnityでTweenの調整を1 Playで完了させる

  • DOTween, iTweenなどでUIをTweenさせているとする
  • tween時間などはpublicにして、Inspectorから調整できるようにしておく
  • パラメータを調整してPlayを繰り返せば調整は可能だが、Playを何度も押したくない
  • そこでTweenを再実行するボタンをEditor拡張でコンポネントに追加する
  • こうすると、Play, Inspectorでパラメータを調整してRe Tweenボタンを押す、の繰り返しで調整できる
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using DG.Tweening;

// これも検討したが、Playとの区別がなくなってStop時に戻らなくなる...
//[ExecuteInEditMode]

public class UITween : MonoBehaviour {

    private RectTransform rectTrans;

    public Ease easeType = Ease.InOutElastic; // Easing Type
    public float tweenTime = 1.0f; // Tween時間
    public Vector2 offsetVector; // 最終位置からのオフセット
    public float waitTime = 0.0f; // 指定時間だけ待ってからTween開始

    void Start () {
        rectTrans = GetComponent<RectTransform> ();
        StartTween ();
    }

    public void StartTween(){
        StartCoroutine (TweenCoroutine ());
    }

    IEnumerator TweenCoroutine(){
        yield return new WaitForSeconds (waitTime);

        DOTween.Kill (this);
        
        // ターゲット位置
        var targetVector = rectTrans.anchoredPosition;
        
        // 初期位置へ
        rectTrans.anchoredPosition = targetVector + offsetVector;
        rectTrans.DOAnchorPos (targetVector, tweenTime).SetEase(easeType);
    }
}
using UnityEditor;
using UnityEngine;
using System.Collections;

// コンポネントにUIを追加する
// このスクリプトはEditorフォルダに置く

[CustomEditor(typeof(UITween))]
public class UITweenEditor : Editor {

    public override void OnInspectorGUI(){
        DrawDefaultInspector ();

        // 選択中のボタンのみTween
        if(GUILayout.Button("Re Tween"))
        {
            UITween uiTween = (UITween)target;
            uiTween.StartTween();
        }

        // 全UITweenコンポネントをReTween
        if(GUILayout.Button("Tween All"))
        {
            UITween[] uiTweens = FindObjectsOfType(typeof(UITween)) as UITween[];
            foreach(var uiTween in uiTweens){
                uiTween.StartTween();
            }
        }
    }
}