今までは生成した直後のラグドールのポーズがデフォルトのままなので、敵がラグドールに置き換わった時に、敵の姿勢が急に伸びたように見えていました。
そこで、生成したラグドールの各ボーンの位置・角度を破壊する直前の敵の各ボーンの位置・角度と同じにして、ラグドールに置き換える時に姿勢を継続させられるようにします。
// 位置を重ねる
void Overlap(ref GameObject r, string s = "")
{
for (int n = 0; n < r.transform.childCount; n++)
{
// 子オブジェクトを探す
GameObject c = r.transform.GetChild(n).gameObject;
// パスを作る
string t = s == "" ? c.name : s + "/" + c.name;
// 同じ名前のオブジェクトを探す
GameObject d = transform.Find(t).gameObject;
// 位置と回転を合わせる
c.transform.position = d.transform.position;
c.transform.rotation = d.transform.rotation;
Overlap(ref c, t);
}
}
ラグドールを生成した後にラグドールと敵の位置を重ねる処理をします。引数にラグドールのインスタンスを入れると、その子オブジェクトを検索し、その位置と角度を、同じ名前の、敵の子オブジェクトの位置と角度に合わせます。
敵を複製してラグドールを作りボーンを変えなければ問題なく使えると思います。
これを入れ子にすると、手足の先のボーンまで続くので、第2引数を省略して一度実行するだけです。メソッドの中でボーンのトランスフォームを直接変更するために、引数にref修飾子をつけて参照渡しにしています。
Transform.Findメソッドの引数には、「/」で区切ったパスを渡す必要があるので、次のOverlapを呼ぶ時に今までのパスを渡しています。
これで敵と同じ姿勢のラグドールを生成することができました。