- Home /
C# Plane Detecting a Gameobject
Hi everyone, I'm try to modify the moveOnMouseClick script so it will detect when it clicks on a gameobject. The problem is I'm not sure how to make a plane detect a gameobject. Is there a way to do that like with a Physics.raycast? Basically what I would like it to do is detect if the player has clicked on a gameobject with a specific tag and when it detects this move to that gameobject's transform.position.
   /* 
      * Esse Script movimenta o GameObject quando você clica ou
      * mantém o botão esquerdo do mouse apertado.
      * 
      * Para usá-lo, adicione esse script ao gameObject que você quer mover
      * seja o Player ou outro
      * 
      * Autor: Vinicius Rezendrix - Brasil
      * Data: 11/08/2012
      * 
      * This script moves the GameObeject when you
      * click or click and hold the LeftMouseButton
      * 
      * Simply attach it to the gameObject you wanna move (player or not)
      * 
      * Autor: Vinicius Rezendrix - Brazil
      * Data: 11/08/2012 
      *
      */
      
     using UnityEngine;
     using System.Collections;
      
     public class moveOnMouseClick : MonoBehaviour {
         private Transform myTransform;                // this transform
         private Vector3 destinationPosition;        // The destination Point
         private float destinationDistance;            // The distance between myTransform and destinationPosition
      
         public float moveSpeed;                        // The Speed the character will move
      
      
      
         void Start () {
             myTransform = transform;                            // sets myTransform to this GameObject.transform
             destinationPosition = myTransform.position;            // prevents myTransform reset
         }
      
         void Update () {
      
             // keep track of the distance between this gameObject and destinationPosition
             destinationDistance = Vector3.Distance(destinationPosition, myTransform.position);
      
             if(destinationDistance < .5f){        // To prevent shakin behavior when near destination
                 moveSpeed = 0;
             }
             else if(destinationDistance > .5f){            // To Reset Speed to default
                 moveSpeed = 3;
             }
      
      
             // Moves the Player if the Left Mouse Button was clicked
             if (Input.GetMouseButtonDown(0)&& GUIUtility.hotControl ==0) {
      
                 Plane playerPlane = new Plane(Vector3.up, myTransform.position);
                 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                 float hitdist = 0.0f;
      
                 if (playerPlane.Raycast(ray, out hitdist)) {
                     Vector3 targetPoint = ray.GetPoint(hitdist);
                     destinationPosition = ray.GetPoint(hitdist);
                     Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
                     myTransform.rotation = targetRotation;
                 }
             }
       //else if (playerplane.Raycast detects gameobject with certain tag){move to gameobject's transform.position}
 
             // Moves the player if the mouse button is hold down
             else if (Input.GetMouseButton(0)&& GUIUtility.hotControl ==0) {
      
                 Plane playerPlane = new Plane(Vector3.up, myTransform.position);
                 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                 float hitdist = 0.0f;
      
                 if (playerPlane.Raycast(ray, out hitdist)) {
                     Vector3 targetPoint = ray.GetPoint(hitdist);
                     destinationPosition = ray.GetPoint(hitdist);
                     Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
                     myTransform.rotation = targetRotation;
                 }
             //    myTransform.position = Vector3.MoveTowards(myTransform.position, destinationPosition, moveSpeed * Time.deltaTime);
             }
 //else if (playerplane.Raycast detects gameobject with certain tag){move to gameobject's transform.position}
      
             // To prevent code from running if not needed
             if(destinationDistance > .5f){
                 myTransform.position = Vector3.MoveTowards(myTransform.position, destinationPosition, moveSpeed * Time.deltaTime);
             }
         }
     }
Answer by robertbu · Jun 03, 2013 at 08:43 PM
You cannot modify a Plane.Raycast() itself to find a object. You have some choices:
- You can use Physics.OverlapSphere() to find object that include the spot on the plane. 
- You can use a separate Physics.Raycast() to find the object. 
- Since this script needs to be attached to any objects that will be moving, you can use OnMouse*() functions like OnMouseOver() or OnMouseDown() to detect the object. 
I made some modifications to the script. However they don't appear to be working. I made it so that if the Physics.RayCast hits the gameobject then it should go to where the hit's transform.position is. What's wrong with my script?
 public RayCastHit hit;
 // $$anonymous$$oves the Player if the Left $$anonymous$$ouse Button was clicked
 if (Input.Get$$anonymous$$ouseButtonDown(0)&& GUIUtility.hotControl ==0) {
  
 Plane playerPlane = new Plane(Vector3.up, myTransform.position);
 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 float hitdist = 0.0f;
  
 if (playerPlane.Raycast(ray, out hitdist)) {
 Vector3 targetPoint = ray.GetPoint(hitdist);
 destinationPosition = ray.GetPoint(hitdist);
 Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
 myTransform.rotation = targetRotation;
 }
                 else if(Physics.Raycast(ray, out hit)){
             if(hit.collider.tag == "SomeTag"){
             Vector3 targetPoint = hit.transform.position;
             destinationPosition = hit.transform.position;
                 }
 }
 // $$anonymous$$oves the player if the mouse button is hold down
 else if (Input.Get$$anonymous$$ouseButton(0)&& GUIUtility.hotControl ==0) {
  
 Plane playerPlane = new Plane(Vector3.up, myTransform.position);
 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 float hitdist = 0.0f;
  
 if (playerPlane.Raycast(ray, out hitdist)) {
 Vector3 targetPoint = ray.GetPoint(hitdist);
 destinationPosition = ray.GetPoint(hitdist);
 Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
 myTransform.rotation = targetRotation;
 }
                 else if(Physics.Raycast(ray, out hit)){
             if(hit.collider.tag == "SomeTag"){
             Vector3 targetPoint = hit.transform.position;
             destinationPosition = hit.transform.position;
                 }
 // myTransform.position = Vector3.$$anonymous$$oveTowards(myTransform.position, destinationPosition, moveSpeed * Time.deltaTime);
 }
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                