頭を撃つとゾンビが真下に崩れ落ちます。
このままだと倒れ方が不自然なので、銃弾がゾンビに当たったときの力を保存しておいて、ラグドールが生成されたときに、ラグドールの頭にその力を加えることで撃たれた方向や位置によって倒れ方が変わるようにします。
ラグドールの頭のオブジェクトに新規スクリプトを付け、スタート時に力をRigidbodyのAddForceメソッドで力を加えるようにします。
加える力は、銃弾のプレハブに付けたスクリプトで、ゾンビの頭に銃弾が当たってラグドールを生成した直後にラグドールに伝えます。BulletScriptからラグドールの頭に付けたスクリプトにアクセスするのは面倒なので、力はラグドールの階層が一番上のオブジェクトに教えます。
// BulletScript
ragdollIns.GetComponent<ragDollScript>().impact = -collision.impulse; // ラグドールに力を伝える
衝突したときに、Collision型の変数に衝突の情報が入れられます。collision.impulseは衝突を解消するための力なのでマイナスを付けます。
ラグドールのルートにつけるスクリプトでは、impact変数をpublicで宣言しているだけです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ragDollScript : MonoBehaviour
{
public Vector3 impact;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
そして、ラグドールの頭に付けたスクリプトで、スタート時にこの変数の値を使って力を加えます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class radDollHeadScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GetComponent<Rigidbody>().AddForce(transform.root.gameObject.GetComponent<ragDollScript>().impact / 20, ForceMode.Impulse);
}
// Update is called once per frame
void Update()
{
}
}
値をそのまま使うとラグドールが不自然に強く飛んでいってしまうので、適度な値で割っています。
大量のゾンビがプレイヤーを追ってきて、頭を撃たれると銃弾に吹き飛ばされながら倒れます。
ゾンビのプレハブに付けたスクリプトでプレイヤーの現在位置を教えています。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class ZombieScript : MonoBehaviour
{
public GameObject player;
NavMeshAgent agent;
// Start is called before the first frame update
void Start()
{
agent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
agent.destination = player.transform.position;
}
}
プレハブにはゲームオブジェクトをインスペクタからアタッチできないので、銃を撃つスクリプトでゾンビを生成した直後にセットしています。
// GunScript
zombieList[zombieList.Count - 1].GetComponent<ZombieScript>().player = player;