梶研 05/10 - 05/16

2023年5月16日

スケジュール

進捗

Unityでアニメーション

c#スクリプトの注意点

ファイル名とクラス名を一致させなければならない
(2時間無駄にした…)

オブジェクトの移動(キーボード)

this.transform.position = new Vector3(x, y,z);

単純な移動はこれだけ

軌跡に沿ったオブジェクトの移動

void Start() {
    ...
    while (!reader.EndOfStream) {
        string[] line = reader.ReadLine().Split(',');
        float x = float.Parse(line[1]);
        float y = float.Parse(line[2]);
        float z = float.Parse(line[3]);
        positions.Add(new Vector3(x, z, y));
    }
    ...
}

void Update() {
    // アニメーションを実行する
    timer += Time.deltaTime * 4;
    if (timer >= 1f) {
        Debug.Log(timer);
        currentIndex++;
        if (currentIndex >= positions.Count) currentIndex = 0;

        transform.position = positions[currentIndex];
        timer = 0;
    }
}

GIFアニメみたい
=> 動作をなめらかにした

1歩進むごとの時間間隔が一定となっている
=> 測定時に合わせたい

実際の時間間隔に合わせたもの

実際の4倍速にしてある

次に移るまでの間隔を前の位置からの時間差に変更

void Start() {
    ...
    while (!reader.EndOfStream) {
        string[] line = reader.ReadLine().Split(',');
        float x = float.Parse(line[1]);
        float y = float.Parse(line[2]);
        float z = float.Parse(line[3]);
+       positions.Add(new Vector3(x, z, y));
    }
    ...
}

void Update() {
    // アニメーションを実行する
    timer += Time.deltaTime * 4;

+   float diff_time;
+   if (currentIndex == 0) diff_time = 0;
+   else diff_time = times[currentIndex] - times[currentIndex - 1];

+   if (timer >= diff_time) {
        currentIndex++;
        if (currentIndex >= positions.Count) currentIndex = 0;

        transform.position = positions[currentIndex];
        timer = 0;
    }
}

滑らかにしたもの

自分で実装するのは面倒だからアセット DG.Tweening を使用した

+ using DG.Tweening;

void Update() {
    // アニメーションを実行する
    timer += Time.deltaTime * 4;

    float diff_time;
    if (currentIndex == 0) diff_time = 0;
    else diff_time = times[currentIndex] - times[currentIndex - 1];

    if (timer >= diff_time) {
        currentIndex++;
        if (currentIndex >= positions.Count) currentIndex = 0;

-       transform.position = positions[currentIndex];
+       this.transform.DOMove(positions[currentIndex], diff_time);
        timer = 0;
    }
}

メモ

向いている方向も

unityはあくまでもCGではなく、成果を伝えるもの

TODO:
- 直角, 並行から歩行軌跡を綺麗に - 階段とエレベーターの気圧のグラフの差をみてみる