- Home /
Box Trigger and Mesh Collider on one object.
Hello,
I'm creating a vanishing platform and I have my code working, but to be honest, I'm not sure how I'm getting the result I'm getting based off the code I wrote.
To elaborate, I have attached a scaled box trigger on to an object that has a mesh collider. Now, when the player walks into the box trigger, the platform (renderer) will disappear after a set amount of seconds. The platform will also set the mesh collider as a trigger so that the physics are pretty much gone, thus, allowing the player to fall.
After another set amount of seconds, the platform will come back and the mesh collider's trigger value will be set to false. This is the part that confuses me (but I'm glad it's working), the box trigger is completely unaffected every time.
Seeing how the box trigger is technically a collider as far as I thought, I would think that setting the "unspecified" collider's trigger to false would disable both the mesh collider's AND box trigger's trigger to false.
Anyone know why this may be happening, and just to be safe, does anyone know a way to specify which collider to manipulate in code?
using UnityEngine;
using System.Collections;
public class VanishingPlatform : MonoBehaviour
{
public float vanishTime;
//-------------------
// COLLIDER
//-------------------
void OnTriggerEnter (Collider hit)
{
if (hit.gameObject.tag == "Player") {
Invoke ("Vanish", vanishTime);
Debug.Log ("About to vanish!!!");
}
}
/// <summary>
/// Vanish this instance.
/// </summary>
void Vanish()
{
this.transform.collider.isTrigger = true;
this.transform.renderer.enabled = false;
Invoke("Reappear", vanishTime);
}
/// <summary>
/// Reappear this instance.
/// </summary>
void Reappear()
{
this.transform.collider.isTrigger = false;
this.transform.renderer.enabled = true;
}
}
Answer by aldonaletto · Jun 18, 2012 at 04:30 AM
I suppose the collider property works like audio or other GameObject properties: they only return the first component (GetComponents is used in order to access the others).
Unfortunately, Unity tells nothing about the component order, thus it's possible (although not likely) that in the future something gets changed and your script stop working.
If you want to avoid this risk, child the trigger volume to the platform instead of adding it, and move the code above to the trigger - with some modifications, of course:
public float vanishTime;
void OnTriggerEnter (Collider hit)
{
if (hit.gameObject.tag == "Player") {
Invoke ("Vanish", vanishTime);
}
}
void Vanish()
{
transform.parent.collider.isTrigger = true;
transform.parent.renderer.enabled = false;
Invoke("Reappear", vanishTime);
}
void Reappear()
{
transform.parent.collider.isTrigger = false;
transform.parent.renderer.enabled = true;
}
Thanks for the advice. Your method of child triggering was the way I was actually doing it before. I suppose I wanted to be lazy this time around, but I'll probably revert to the method you spoke of.
Your answer
Follow this Question
Related Questions
A question about collisions. 1 Answer
Box colliders from procedural mesh 1 Answer
Is Mesh Collider Optimal for GUI? 2 Answers
Internal collisions 1 Answer
Imported Blender meshes, added Unity box colliders - scene goes choppy, slow. 1 Answer