- Home /
Accessing Child Colliders for hit detection.
Hello, I'm trying to make a script that allows the head hitbox, and the chest hitbox which are children to the main game object, to be detected by the main script so that damage can take place. For example, the main script knows when the head collider is hit, vs the body collider. (Currently, doesn't work even if enabled). I've tried many scripts and searched for answers and I really can't find them. Please help. Note, the comments as far as I know have little to nothing to do with the issue I'm having.
Here's the entire script: using System.Collections; using System.Collections.Generic; using UnityEngine;
public class BodyDamage : MonoBehaviour
{
public int maxHealth = 100;
public int currentHealth;
public int noHealth = 0;
public Rigidbody mainHitbox;
//private CapsuleCollider mainCollider;
//private SphereCollider headCollider;
private Collider myLastHit;
public HealthBar healthBar;
public Canvas hp;
private bool canTakeDamage = true;
public float damageTimeout = 1f;
// Start is called before the first frame update
void Start()
{
currentHealth = maxHealth;
healthBar.SetMaxHealth(maxHealth);
setRigidbodyState(true);
setColliderState(false);
//mainCollider = gameObject.GetComponent<CapsuleCollider>();
//headCollider = gameObject.GetComponent<SphereCollider>();
if (gameObject.tag == "Enemy")
{
mainHitbox.isKinematic = false;
//mainCollider.enabled = true;
//headCollider.enabled = true;
}
}
// Update is called once per frame
void Update()
{
if (currentHealth == noHealth)
{
die();
}
if (currentHealth < 0)
{
currentHealth = noHealth;
}
}
public void OnTriggerEnter(Collider collider)
{
myLastHit = collider.gameObject.GetComponent<PunchDetection>().punched;
foreach(Transform sibling in transform.parent)
{
if(sibling.name == "HeadHitbox")
{
collider.enabled = true;
//Collider col = child.GetComponent<SphereCollider>();
if (canTakeDamage && myLastHit is SphereCollider)
{
TakeDamage(15);
StartCoroutine(damageTimer());
}
}
if (sibling.name == "RibsHitbox")
{
collider.enabled = true;
//Collider col = child.GetComponent<CapsuleCollider>();
if (canTakeDamage && myLastHit is CapsuleCollider)
{
TakeDamage(5);
StartCoroutine(damageTimer());
}
}
}
}
public void TakeDamage(int damage)
{
currentHealth -= damage;
healthBar.SetHealth(currentHealth);
}
private IEnumerator damageTimer()
{
canTakeDamage = false;
yield return new WaitForSeconds(damageTimeout);
canTakeDamage = true;
}
public void die()
{
setRigidbodyState(false);
setColliderState(true);
hp.enabled = false;
}
//Ragdoll Physics
void setRigidbodyState(bool state)
{
Rigidbody[] rigidbodies = GetComponentsInChildren<Rigidbody>();
foreach(Rigidbody rigidbody in rigidbodies)
{
rigidbody.isKinematic = state;
}
}
void setColliderState(bool state)
{
Collider[] colliders = GetComponentsInChildren<Collider>();
foreach (Collider collider in colliders)
{
collider.enabled = state;
}
}
}
Your answer
Follow this Question
Related Questions
Child colliders affecting parent rigidbody characteristics? 0 Answers
Connect a collider with a rigidbody ?? 1 Answer
Collider collision not being detected on fast passed objects 1 Answer
physics.OverlapSphere colliders 1 Answer
How can I disable the collider collision of a ragdolls specific bones? 0 Answers