【Unity】ボーンの位置を取得してラグドールの姿勢を変更する

投稿者: | 2020-07-07
※音量注意

今までは生成した直後のラグドールのポーズがデフォルトのままなので、敵がラグドールに置き換わった時に、敵の姿勢が急に伸びたように見えていました。

そこで、生成したラグドールの各ボーンの位置・角度を破壊する直前の敵の各ボーンの位置・角度と同じにして、ラグドールに置き換える時に姿勢を継続させられるようにします。

// 位置を重ねる
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を呼ぶ時に今までのパスを渡しています。

これで敵と同じ姿勢のラグドールを生成することができました。

※音量注意

コメントを残す

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