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);
    		}
    	}
    }

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.