回答:
Physics.IgnoreCollisionおよびPhysics.IgnoreLayerCollisionを使用すると、2つのコライダー間、および2つのレイヤー間の衝突をそれぞれ無効にすることができます。
特定のコライダーを衝突から除外したい場合、それを行う方法は組み込まれていません。非トリガーコライダーで非キネマティックリジッドボディを使用している場合、タグで応答を除外しようとしても、常に応答があります。
プロジェクトでこれを達成する方法は、「Void」という名前のレイヤーを作成することでした。Voidはまったく衝突しません。
これで、レイヤーを「無効」に設定してコライダーのコリジョンを一時的に無効にし、古いレイヤーを復元してコライダーを再度有効にすることができます。
ここに要点があります:
int oldLayer = -1;
int voidLayer;
void Start()
{
voidLayer = LayerMask.NameToLayer("Void");
}
void DisableCollider(Collider col)
{
oldLayer = col.gameObject.layer;
col.gameObject.layer = voidLayer;
}
void EnableCollider(Collider col)
{
col.gameObject.layer = oldLayer;
}
剛体の子であるコライダーを有効または無効にすると、状況によっては実際に問題が発生する可能性があるため、これを具体的に行いました。そのため、複合剛体コライダーの一部を確実に無効にすることはできませんが、複合コライダーパーツの1つのレイヤーを確実に交換することはできます。
ゾンビの衝突があなたの車に与える影響を減らすには、ゾンビをキネマティックリジッドボディトリガーにするか、質量を非常に小さくして(float.Epsilonのように)、車の勢いに影響を与えないようにします。衝突時には、このレイヤー切り替えを行うこともできます。これにより、最初の衝突が車体に無視できるほどの力を加えた場合でも、後続の衝突はトリガーされません。
車と衝突しないレイヤーに切り替えることもできます。
また、ランオーバーでアクティブになるゾンビに別のコライダーを置くこともできます。これにより、OnTriggerEnterの衝撃力を偽造できます。これほど正確に取得することはできませんが、接触法線がゾンビをどこかに面白くするのに十分であった場所を概算することができます。
自問する必要があります:
車で走り回ったゾンビをノックしたいのですか、それとも死のアニメーションを再生するだけですか?
車の速度と角速度がゾンビを打つことにより小さな影響を受けるかどうか気にしますか?
車がブーストを開始したら、すべてのゾンビでPhysics.IgnoreCollisionを呼び出し、関数にプレイヤーオブジェクトも渡します。これにより、Unityはプレイヤーとゾンビとの衝突に反応しなくなります。車のブーストが終了したら、Physics.IgnoreCollision
ゾンビごとに再度呼び出して、プレーヤーオブジェクトを渡し、false
衝突応答を再び開始します。
オブジェクトの名前を確認したり、オブジェクトクラスに名前の値を追加して確認したりできると思いますか?
bool boosting = false; //need a trigger in the game to set this to true.
function OnCollisionEnter(theCollision : Collision)
{
if (boosting == true)
{
if(theCollision.gameObject.name == "Zombie")
{
Debug.Log("Zombie hit during boost");
}
else if(theCollision.gameObject.name == "Wall")
{
Debug.Log("Wall hit during boost");
}
}
else
{
if(theCollision.gameObject.name == "Zombie")
{
Debug.Log("Zombie hit not in boost");
}
else if(theCollision.gameObject.name == "Wall")
{
Debug.Log("Wall hit not in boost");
}
}
}
次に、ブーストのチェックに使用できる別の変数を用意し、それをチェックに追加します。
編集:この変数を追加しました。
ここには2つのクラスの回答があります。
お役に立てれば!