masa's blog

Masa's Gamesの開発ブログ

【Unity】DOTweenでシーク的なことをする


概要

DOTweenはUnityで簡単にアニメーションを作れるアセットです。
DOTweenのアニメーションに対して、YouTubeのシークバーのようにプレイヤーが再生位置を調整できるようにしたい場面があったので、その実装方法について書いていきます。

方法

GoToメゾットを使えば、時刻(秒)で再生位置を指定できます。
ここでは、Sliderをシークバーにして、EventTriggerもアタッチしてマウスを離したタイミングで再びPlayされるようにしています。

ソースコード

using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class SeekSample : MonoBehaviour
{
    public Transform cube;
    public Slider slider;

    private Sequence sequence;

    void Start()
    {
        //適当なアニメーションを作成
        sequence = DOTween.Sequence()
            .Append(cube.DOShakeRotation(3.0f))
            .Join(cube.DOJump(cube.position, 2.0f, 3.0f, 3.0f))
            .SetAutoKill(false);
    }

    void Update(){
        slider.SetValueWithoutNotify(sequence.position / sequence.Duration());
    }

    public void OnSliderValueChanged(){
        sequence.Goto(slider.value * sequence.Duration());
    }

    public void OnPointerUp(){
        sequence.Play();
    }
}

余談

以下のゲームでは、実際にこの方法を使っています。
masasgames.com

【Blender】細分化を適用しつつ一部の辺だけシャープにする

概要

Subdivision SurfaceのModifierを使うとオブジェクトを滑らかにできます。
この時、一部の辺だけはシャープなままにしたいことがよくあります。

環境

Blender 3.0.1

方法

クリースを使います。

  1. シャープにしたい辺を選択(複数選択も可能)
  2. [N]キーを押して右側のメニューを開く
  3. Itemタブの、Edges Data → Mean Creaseを調整

1.0にすると完全にシャープになります。

【Unity】数値の増減ボタンで%(あまり)を使って一周したら戻るようにする


概要

パスコードを入力させるときによくある数値の増減ボタンで、9の状態で↑を押したら0、0の状態で↓を押したら9になるように、一周したら戻ってくる仕様にするとボタンを押す回数が減って入力が楽になります。
if文で簡単に実装できますが、今回は%(あまり)を使ってより簡単に実装する方法を書きます。

結論

↑を押したらOnClickUpButton、↓を押したらOnClickDownButtonが呼ばれることを想定しています。

public class NumberUpDown : MonoBehaviour
{
    public Text text;
    public int value = 0;

    public void OnClickUpButton(){
        value = (value + 1) % 10;
        text.text = value.ToString();
    }

    public void OnClickDownButton(){
        value = (value + 9) % 10;
        text.text = value.ToString();
    }
}

解説

増加時(7行目)

ここは直感的だと思います。
(value + 1)が1~9のときは、1 % 10 = 1, ..., 9 % 10 = 9なので普通に1を足した時と変わりません。
(value + 1)が10になるタイミングで、10 % 10 = 0となり、0に戻ってきます。

減少時(12行目)

1減らすのに9を足すという直感的でないことをしていますが、計算してみると

  • value = 9のとき、(value + 9) % 10 = 18 % 10 = 8
  • value = 8のとき、(value + 9) % 10 = 17 % 10 = 7
  • value = 7のとき、(value + 9) % 10 = 16 % 10 = 6

のように、確かに1ずつ減っていきます。
また、value = 0のとき、
(value + 9) % 10 = 9 % 10 = 9
なので、一周して9に戻ります。

(value - 1) % 10じゃダメなの?

C#の仕様では-1 % 10 = -1なので、0から減少させたとき9に戻らなくなってしまいます。

数字が10種類でない場合は?

今回は0~9の10種類の数字を使うことを想定しましたが、それ以外の場合でも同じ方法が使えます。
N種類の数字を使う場合、

とすればよいです。