【Unity】アニメーションイベントからトランスフォームを変えて物を動かせない時

投稿者: | 2020-12-17

アニメーションイベントに設定したメソッドで他のゲームオブジェクトのTransformの値を変えて移動させてみました。

右のCubeにアニメーションとスクリプトを付けました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestAnimatedCube : MonoBehaviour
{
    [SerializeField] Transform cube; // 隣のCube

    void MoveCube()
    {
        // トランスフォームを変えて移動させる
        Vector3 pos = cube.position;
        pos.z += 5f;
        cube.position = pos;
    }


    private void Update()
    {
        if(Input.GetMouseButtonDown(1))
        {
            MoveCube();
        }
    }
}

スクリプトに左のCubeをアタッチして、トランスフォームで移動させるメソッドを作ります。また、Update()でマウスクリックで同じメソッドを呼べるようにしました。

アニメーションウィンドウでは、シークバーをアニメーションの途中の適当な位置に置いて、+のついたシグナルのマークをクリックしてシグナルを置きます。

このシグナルをクリックして、インスペクタでスクリプトに作ったメソッドを選択します。

これで、アニメーションのこの箇所に来るとメソッドが呼ばれるはずですが、隣のCubeが動きませんでした。マウスクリックすると動きます。

そこで、アニメーションイベントで呼ぶメソッドでコルーチンをスタートさせるようにすると動くようになりました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestAnimatedCube : MonoBehaviour
{
    [SerializeField] Transform cube;

    void MoveCube()
    {
        StartCoroutine("Move");
        //Move2();
        //Invoke("Move2",0f);

    }

    IEnumerator Move()
    {
        yield return null; // 次のフレームまで待つ
        //yield return new WaitForSeconds(0f);

        Vector3 pos = cube.position;
        pos.z += 5f;
        cube.position = pos;
    }

    void Move2()
    {
        Vector3 pos = cube.position;
        pos.z += 5f;
        cube.position = pos;
    }

}

コルーチンでは初めにyield return nullで次のフレームまで待っています。トランスフォームはUpdate()と同期させて値を変えないといけないのかもしれません。

これはyield return new WaitForSeconds(0f)でもできました。また、トランスフォームで動かすメソッドを普通に呼ぶとだめですが、Invokeメソッドで0秒遅延させてもうまくいきました。

Invoke("Move2",0f);

Invokeの第2引数を0にすると次のUpdateサイクルで呼び出されるそうです。スクリプトリファレンス

コメントを残す

メールアドレスが公開されることはありません。