前の記事の方法で敵が残像を残すようにしてみます。
まず敵を複製してコンポーネントをすべて削除した残像用のオブジェクトにスクリプトをつけます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GhostTest : MonoBehaviour
{
[SerializeField] Transform target;
List bones;
List targetBones;
int c;
void GetBone(Transform r, string s = "")
{
for (int n = 0; n < r.transform.childCount; n++)
{
// 子オブジェクトを探す
Transform c = r.GetChild(n);
// パスを作る
string t = s == "" ? c.name : s + "/" + c.name;
// 同じ名前のオブジェクトを探す
Transform d = transform.Find(t);
// リストに入れる
bones.Add(d);
targetBones.Add(c);
GetBone(c, t);
}
}
public void ChangeTarget(Transform t)
{
bones = new List();
targetBones = new List();
GetBone(t);
c = bones.Count;
}
// Start is called before the first frame update
void Start()
{
bones = new List();
targetBones = new List();
GetBone(target);
c = bones.Count;
}
// Update is called once per frame
void Update()
{
// 位置と回転を合わせる
for (int i = 0; i < c; i++)
{
bones[i].position = Vector3.Lerp(bones[i].position, targetBones[i].position, 0.1f);
bones[i].rotation = Quaternion.Lerp(bones[i].rotation, targetBones[i].rotation, 0.1f);
}
}
}
ターゲットとして敵をアタッチしておき、開始時に敵のボーンと、同じ名前の自分のボーンをそれぞれ同じ順番にリストに入れておきます。Updateでは、リストを順番に見ていって、各ボーンが敵のボーンと同じ位置と回転になるようにします。
Lerpを使って少し手前の値にすることで敵にぴったりと重なることがなく、残像のように後ろから着いていきます。
敵が倒れてラグドールになる時に、ターゲットをラグドールに変更できるようにしました。
さらに、残像用のオブジェクトを複数作って、ターゲットとしてヒエラルキーウィンドウで一つ上にある残像をアタッチすると、長い尾を引くような見た目になりました。
同じ方法でアニメーターコントローラーを使わずにキャラの姿勢をスムーズに変えることができます。