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