- Home /
Accessing Colliders in IF statement from PARENT Object.
Hello, This is my Javascript I made, I need to access the collider on these GameObjects to see if the mouse CLICKS on the Mesh of the Object that i have a MESH COLLIDER on.
Code:
 var ButtonLeft:Collider;
 var ButtonRight:Collider;
 var GridCount : float = 0;
 
 function Update () {
     GridCount = Mathf.Clamp (GridCount, 0, 3);
 }
 
 function OnMouseDownAsButton () {
     
     if (ButtonRight) {
         GridCount ++;
     }
     if (ButtonLeft) {
         GridCount --;
     }
     
     if (GridCount == 0) {
         
         if (ButtonRight) {
             //Move all level objs left one grid
             Debug.Log (GridCount);
         }
         
         if (ButtonLeft) {
             //Move all level objs right one grid
             Debug.Log (GridCount);
         }
     }
     
     if (GridCount == 1) {
         
         if (ButtonRight) {
             //Move all level objs left one grid
             Debug.Log (GridCount);
         }
         
         if (ButtonLeft) {
             //Move all level objs right one grid
             Debug.Log (GridCount);
         }
     }
     
     if (GridCount == 2) {
         
         if (ButtonRight) {
             //Move all level objs left one grid
             Debug.Log (GridCount);
         }
         
         if (ButtonLeft) {
             //Move all level objs right one grid
             Debug.Log (GridCount);
         }
     }
 
 }
Hierarchy:

In the Above Picture the parent object Arrows has the above script on it.
In the above picture each Child Object has a MESH COLLIDER on it.
Now knowing that where the script is how do I access the colliders IN the IF STATEMENTS, I have
Example:
 if (ButtonRight) {
         GridCount ++;
     }
Thanks for the help! I know its a simple thing, I just cant figure it out! Daniel
$$anonymous$$aybe this is a place where ray casts should come in?
$$anonymous$$
Answer by aldonaletto · Jul 08, 2013 at 01:59 AM
This code is wrong: OnMouseDownAsButton is a custom function, not any valid Unity event, and ButtonLeft and ButtonRight shouldn't be Collider references (using a Collider reference in an if statement only tests whether it's null or not).
If you really want a single script attached to Arrows, you should declare the variables as boolean and use raycast to detect whether one of the arrows was hit:
 var ButtonLeft: boolean;
 var ButtonRight: boolean;
 var GridCount = 0;
 
 function Update(){
   // verify if one of the arrows was clicked:
   DetectButtonClick();
   // now you have ButtonLeft or ButtonRight true if the corresponding
   // arrows were clicked - place your code here
 }
 
 function DetectButtonClick(){
   ButtonLeft = false; // assume no clicks initially
   ButtonRight = false;
   if (Input.GetMouseButtonDown(0)){ // if left button pressed...
     // create a ray passing through the mouse pointer:
     var ray: Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
     var hit: RaycastHit;
     if (Physics.Raycast(ray, hit)){ // do a raycast
       if (hit.transform.name == "ArrowLeft"){ // left arrow clicked?
         ButtonLeft = true;
       } 
       else
       if (hit.transform.name == "ArrowRight"){ // right arrow clicked?
         ButtonRight = true;
       }
     }
   }
 }
EDITED: GetMouseButtonDown was incorrectly written as MouseButtonDown. Answer fixed now.
Wow! Thank you so much, you have been a great help to me! Yes and ill use the booleans to set up the grid system count! :D Thanks! I will Post my updated script with this implemented :D
Btw is I have to modify this to make it work on iphone right? I only need tap. @aldonaletto
@aldoneletto Am I Doing this right? I like the boolean approach, my question is, why doesn't my grid count change when I click? I went through all the logic, and it seems to be correct but I think my problem is maybe the way I increase and decrease the gridcount? Im going to first test if your code works with just a console.log ("you have been hit"); see if that works :D
Thanks again, and for iphone is GetTouches, GetTouch, or Input.touch (0) better?
Code:
 var ButtonLeft: boolean;
 var ButtonRight: boolean;
 var GridCount = 0;
 
 function Update () {
 // verify if one of the arrows was clicked:
   DetectButtonClick();
   // now you have ButtonLeft or ButtonRight true if the corresponding
   // arrows were clicked - place your code here
   GridSystem ();
 } 
 function DetectButtonClick(){
   ButtonLeft = false; // assume no clicks initially
   ButtonRight = false;
   if (Input.$$anonymous$$ouseButtonDown(0)){ // if left button pressed...
     // create a ray passing through the mouse pointer:
     var ray: Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
     var hit: RaycastHit;
     if (Physics.Raycast(ray, hit)){ // do a raycast
       if (hit.transform.name == "ArrowLeft"){ // left arrow clicked?
         ButtonLeft = true;
       } 
       else
       if (hit.transform.name == "ArrowRight"){ // right arrow clicked?
         ButtonRight = true;
       }
     }
   }
 }
 
 function GridSystem () {
     GridCount = $$anonymous$$athf.Clamp (GridCount, 0, 3);
     
     if (ButtonRight) {
         GridCount ++;
     }
     
     if (ButtonLeft) {
         GridCount --;
     }
     
     
     if (GridCount == 0) {
         
         if (ButtonRight) {
             //$$anonymous$$ove all level objs left one grid
             Debug.Log (GridCount);
         }
         
         if (ButtonLeft) {
             //$$anonymous$$ove all level objs right one grid
             Debug.Log (GridCount);
         }
     }
     
     if (GridCount == 1) {
         
         if (ButtonRight) {
             //$$anonymous$$ove all level objs left one grid
             Debug.Log (GridCount);
         }
         
         if (ButtonLeft) {
             //$$anonymous$$ove all level objs right one grid
             Debug.Log (GridCount);
         }
     }
     
     if (GridCount == 2) {
         
         if (ButtonRight) {
             //$$anonymous$$ove all level objs left one grid
             Debug.Log (GridCount);
         }
         
         if (ButtonLeft) {
             //$$anonymous$$ove all level objs right one grid
             Debug.Log (GridCount);
         }
     }
 
 }
 
@aldonaletto I actually am Getting an error. Not sure what it means. Seems like something is $$anonymous$$isspelled maybe..

Sorry to bug you, I found why it was giving an error, It was supposed to be Get$$anonymous$$ouseButtonDown. Right now its throwing a null, (which means the raycast is casting, BUT its not detecting an obj hit).
Here is the console:

You should clamp GridCount after incrementing/decrementing it. Anyway, this code should work - unless the click isn't being detected at all. Add debug lines to know what's happening:
 function GridSystem () {
  
     if (ButtonRight) {
        GridCount++;
        print("Right Arrow clicked");
     }
     if (ButtonLeft) {
        GridCount--;
        print("Left Arrow clicked");
     }
     GridCount = $$anonymous$$athf.Clamp (GridCount, 0, 3);
     ...
 
About the iOS version: I suppose that you should modify the DetectButtonClick to use touches ins$$anonymous$$d of mousePosition:
 function DetectButtonClick(){
   ButtonLeft = false; // assume no clicks initially
   ButtonRight = false;
   if (Input.touchCount>0){
     var touch = GetTouch(0);
     if (touch.phase == TouchPhase.Began){ // if screen touch...
       // create a ray passing through the touch pos:
       var ray: Ray = Camera.main.ScreenPointToRay(touch.position);
       var hit: RaycastHit;
       if (Physics.Raycast(ray, hit)){ // do a raycast
         if (hit.transform.name == "ArrowLeft"){ // left arrow clicked?
           ButtonLeft = true;
         } 
         else
         if (hit.transform.name == "ArrowRight"){ // right arrow clicked?
           ButtonRight = true;
         }
       }
     }
   }
 }
Your answer
 
 
             Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Help with my code?(NullReferenceException)[CLOSED] 2 Answers
Walking animation problem. 0 Answers
JS Unity Boolean 'not possible to evoke an expression of type 'boolean'' 1 Answer
Unity mathematics phrasing. 1 Answer
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                