今までは生成した直後のラグドールのポーズがデフォルトのままなので、敵がラグドールに置き換わった時に、敵の姿勢が急に伸びたように見えていました。
そこで、生成したラグドールの各ボーンの位置・角度を破壊する直前の敵の各ボーンの位置・角度と同じにして、ラグドールに置き換える時に姿勢を継続させられるようにします。
- // 位置を重ねる
- 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を呼ぶ時に今までのパスを渡しています。
これで敵と同じ姿勢のラグドールを生成することができました。