HPが0以下になった敵をラグドールに切り替えます。
まず敵のラグドールを作るために敵を複製して、アニメーターやナビメッシュエージェントなどのコンポーネントを削除して、オーディオソースコンポーネントだけを残しました。
これをラグドールにしますが、Unityの純正のツールで作るとどうしてもメッシュが伸びたりしてしまったので、自分で敵のボーンにコライダーやジョイントを付けてみるとうまくいきました。
まず、敵のボーン全てにコライダーとリジッドボディをつけて、マスターボーン以外にはCharacter Jointもつけます。そして、各ボーンのCharacter JointコンポーネントのConnected Bodyに隣のボーンをアタッチしていきます。
下の画像の場合、「Hip」のボーンにつけたCharacter JointのConnected Bodyには「Master」のボーンをアタッチし、「Spine」には「Hip」をアタッチします。
「Hip」のもう2つの子ボーンである「UpperLeg_L」と「UpperLeg_R」にも「Hip」をアタッチします。これを手足の先のボーンまで続けます。ジョイントの他の設定は全く変えていません。
あとは、コライダーの大きさや位置を調節しました。するとメッシュが破れたりせずに安定しました。
そして、敵のスクリプトで、攻撃されて減らした後のHPが0以下なら敵を破壊してラグドールと置き換えます。その時にラグドールのオーディオソースを使って叫び声を再生します。
public void SetHP(float f)
{
if (animator.GetCurrentAnimatorStateInfo(0).IsName("Flinch")) return;
HP += f;
HP = Mathf.Clamp(HP,0f,1f);
HpImage.fillAmount = HP;
if (HP > 0f)
{
Flinch();
}
// 体力が0になったとき
else
{
Destroy(gameObject);
var r = Instantiate(ragdoll, transform.position, transform.rotation);
AudioSource a = r.GetComponent();
a.clip = audios[3];
a.Play();
}
}
これでHPが0になった敵が倒れるようになりました。
次は倒れ方をもう少しリアルにしてみます。