アニメーションイベントに設定したメソッドで他のゲームオブジェクトの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サイクルで呼び出されるそうです。スクリプトリファレンス