- Home /
Moving object to where a ray lands(C#)
Hello, so I have a script called Control. It enables the user to select the "Player" object (Indicated when it turns blue). When this happens the bool 'selected' becomes true and we can think about adding some extra functionality. It is that which I have attempted. Once the player is selected I want to be able to move him to the position of another ray I cast with the right mouse button. Here is my code:
using UnityEngine;
using System.Collections;
/*ISSUE SECT:
1. Ray is colliding with other objects. Work with layers
in order to prevent this.
*/
public class Control : MonoBehaviour
{
//Variable Declaration
public Vector3 rayPoint;
public GameObject player;
public bool selected = false;
public RaycastHit hit = new RaycastHit ();
public Ray thisRay;
void Start ()
{
//Nothing here yet.
}
//Selected checks to see if you have selected "Player".
void Selected ()
{
//Using my Ray variable. Tying it to the screenpoint of the main camera.
thisRay = Camera.main.ScreenPointToRay (Input.mousePosition);
//So if it doesn't hit anything, return (early leave from function)
if (!Physics.Raycast (thisRay, out hit))
return;
//If the collider/rigidbody hit reads "Player"
if (hit.transform.CompareTag ("Player")) {
selected = true;
hit.transform.renderer.material.color = Color.blue;
}
}
void MovePlayer ()
{
if (selected == true) {
thisRay = Camera.main.ScreenPointToRay (Input.mousePosition);
if (!Physics.Raycast (thisRay, out hit))
return;
hit.point = rayPoint;
}
}
//Update will deal with inputs.
void Update ()
{
//If left click access Select Method.
if (Input.GetMouseButtonDown (0)) {
Selected ();
if (Input.GetMouseButton (1)) {
MovePlayer ();
}
}
Debug.DrawLine (thisRay.origin, hit.point, Color.red);
}
}
Answer by Leuthil · Apr 02, 2014 at 05:24 PM
I think you are overcomplicating this. You don't need to use a Ray to determine where your player will move to. You can simply just get the appropriate Vector3 position with:
Vector3 targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Hi, so thanks for the great advice, I have taken it and implemented it within my script and it works well (compared to nothing happening). Here's my code and below it is my problem: (Note: I am only showing you the $$anonymous$$ovePlayer method as nothing else has changed)
void $$anonymous$$ovePlayer ()
{
if (selected == true) {
Vector3 targetPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
player.transform.Translate(targetPosition * Time.deltaTime);
}
The problem with this is that it causes my game object to move down the surface. So here's my scene:
And the red Player cube just starts moving towards the camera with every click. I had some kind of idea so I took away Time.deltatime and found that I was able to select positions in 3d space beyond my objects, like waaaaaay beyond my objects. So It automatically just teleports off the viewport. Sorry for the long comment.
Edit: For some reason I was thinking that you were doing completely top view.
I understand your issue. Perhaps using a Ray was the best option Try using the method that this answer describes:
var hit : RaycastHit;
if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), hit))
player.transform.Translate(hit.point * Time.deltaTime);
}