- Home /
Simple collision script not working, what am I doing wrong?
Hello,
I'm pretty new to this scripting stuff. In my scene, I have a character in a room. He opens the door by stepping on a switch. This leads to a second room. In this room, you pick up an item to open another door. The scripting for these 2 events works just fine. The problem happens when I try to use the same type of script to make a third door open when you shoot a target. I can shoot the target and get the door to slide open, but when I shoot the target again, the door keeps sliding.
In my first room, I can step on the switch to open the door, and repeatedly stepping on the switch does nothing (as intended), but using the same kind of script to shoot a target with a fireball for the third room just doesn't seem to end correctly. The door will move every time I shoot the target.
Here is the first script:
var door1opened : boolean = false;
var door1opening : boolean = false;
var timer : float = 0.0;
var door2opened : boolean = false;
var door2opening : boolean = false;
static var Fireballready : boolean = false;
function OnControllerColliderHit(hit:ControllerColliderHit) {
if((hit.gameObject.tag == "Switch1") && (door1opened == false)) { door1opening = true; }
if(hit.gameObject.tag == "Fireball Item") { Destroy(hit.gameObject); door2opening = true; Fireballready = true; }
}
function Update () {
if((door1opening) && (door1opened == false)) { var door1 = GameObject.FindWithTag("Door1"); door1.transform.Translate(0, 0, -2 * Time.deltaTime); timer += Time.deltaTime;
if((timer >= .5) && (timer < 1.5))
{
door1 = GameObject.FindWithTag("Door1");
door1.transform.Translate(2 * Time.deltaTime, 0, 2*Time.deltaTime);
}
if(timer >=1.5)
{
door1opening = false;
door1opened = true;
timer = 0.0;
}
}
if((door2opening) && (door2opened == false)) { var door2 = GameObject.FindWithTag("Door2"); door2.transform.Translate(0, 0, -2 * Time.deltaTime); timer += Time.deltaTime;
if((timer >= .5) && (timer < 1.5))
{
door2 = GameObject.FindWithTag("Door2");
door2.transform.Translate(2 * Time.deltaTime, 0, 2 * Time.deltaTime);
}
if(timer >=1.5)
{
door2opening = false;
door2opened = true;
timer = 0.0;
}
}
}
This first script is attached to the player object. It controls the first 2 doors as well as unlocking the ability to shoot a fireball. This all works just fine.
The second script is where the problems are (I think):
var door3opened : boolean = false;
var door3opening : boolean = false;
var timer : float = 0.0;
function OnCollisionEnter(collision : Collision) {
if((collision.gameObject.tag == "Target1") && (door3opened == false))
{
door3opening = true;
}
}
function Update () {
if((door3opening) && (door3opened == false)) { var door3 = GameObject.FindWithTag("Door3"); door3.transform.Translate(0, 0, -2 * Time.deltaTime); timer += Time.deltaTime;
if((timer >= .5) && (timer < 1.5))
{
door3 = GameObject.FindWithTag("Door3");
door3.transform.Translate(2 * Time.deltaTime, 0, 2 * Time.deltaTime);
}
if(timer >=1.5)
{
door3opening = false;
door3opened = true;
timer = 0.0;
}
}
}
This second script is attached to my fireball prefab that the character shoots.
Apologies if this looks sloppy. I'm learning.
So, the problem to me seems that OnControllerColliderHit from the first script works differently than OnCollisionEnter from the second script. Other than that I'm at a total loss. Both objects have colliders and rigid bodies.
Thanx for your time.
Answer by Jaap Kreijkamp · Dec 01, 2009 at 12:14 AM
The reason is that the last script (for door3 opening) is attached to the fireball, so with every fireball fired you get a new instance, thus door3opened = false, as the new fireball hasn't opened a door yet. Solution would be to change the initialisation to:
global var door3opened : boolean = false;
var door3opening : boolean = false;
var timer : float = 0.0;
If you get more into javascript it may be worth to restructure your solution, for example have the door opening code attached to the door instead of the fireball. A coroutine also would clean up the code nicely (that would get rid of an update, not really a problem if you're on pc/mac platform, but if you're developing for iphone you want to get rid of as many updates as possible :-).
An explanation of global var versus var can be found at the forums.
Answer by pope · Nov 30, 2009 at 02:38 AM
Hello I am new in unity i am a 3d guy, not the scripter, already testign the topic of the collisions, and looking your script superficially, i can see:
GameObject.FindWithTag is bad write is a : gameObject.FindWithTag change the "G" for the "g"
Also have carefull that "function OnControllerColliderHit" is only for use on character controller.
use more the "debug" for show on console if your "hits" works, is a very helper, example: Debug.Log ("object1 hit");
sorry for my bad english.
Thanks for the response. I fixed the "G" problem and ran some debug. A collision is definitely taking place, its just not turning the door3openeing variable true like its supposed to. Its somehow still running the stuff in the Update funtion without switching any variables or running the timer.
Your answer
Follow this Question
Related Questions
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
How do I get a Not collision? 5 Answers
How do I delete an object on collision with another object? 1 Answer
How to make collision check if other collider has component 1 Answer
C# GameObject is not detecting collision with Character Controller 2 Answers