- Home /
instantiate object at mouse position clicked
i have the click move down and the object instantiating but it doesn't show im guessing it has something to do with not knowing where the mouse position is when i GetMouseButtonDown(0). what i want to happen is a visual identifier to where you have clicked for your character to move. similar to Mu Online
// Moves the Player if the Left Mouse Button was clicked
if (Input.GetMouseButtonDown(0)&& GUIUtility.hotControl ==0) {
animation.CrossFade ("walk");
animation["walk"].speed = 0.25f;
Plane playerPlane = new Plane(Vector3.up, myTransform.position);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Instantiate(Resources.Load("MoveTarget"));
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;
}
}
The whole code
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;
animation.CrossFade ("idle");
animation["idle"].speed = 0.25f;
Destroy(MoveTarget);
}
else if(destinationDistance > .5f){ // To Reset Speed to default
moveSpeed = 2.0f;
}
// Moves the Player if the Left Mouse Button was clicked
if (Input.GetMouseButtonDown(0)&& GUIUtility.hotControl ==0) {
animation.CrossFade ("walk");
animation["walk"].speed = 0.25f;
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;
Instantiate(Resources.Load("MoveTarget"), targetPoint, Quaternion.identity);
}
}
// Moves the player if the mouse button is hold down
else if (Input.GetMouseButton(0)&& GUIUtility.hotControl ==0) {
animation.CrossFade ("walk");
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);
}
// To prevent code from running if not needed
if(destinationDistance > .5f){
myTransform.position = Vector3.MoveTowards(myTransform.position, destinationPosition, moveSpeed * Time.deltaTime);
}
}
}
Answer by Zerot · Sep 17, 2012 at 10:04 AM
You are not giving a position to the instantiate, nor are you positioning it afterwards. You already have a raycast in there finding the position where it needs to be placed. now you only have to set that position in the instantiate.
First, move the instantiate line in the raycast if block. Next change it to:
`Instantiate(Resources.Load("MoveTarget"), targetPoint, Quaternion.identity);`
Alternatively, you could store the result of the instantiate and set it using that:
`GameObject go = (GameObject)Instantiate(Resources.Load("MoveTarget"));`
and then later:
`go.transform.position = targetPoint;`
The first method works but the character is not walking to the point clicked it moves abit beyond the point is there a way to have it more precise that the character stops moving exactly under the instantiated object?
You didn't post any movement code, so I can't be certain what the problem/cause is. It might be that your movement code is incorrect, but it might also be that the indicator you use has its pivot point somewhere strange causing it to be offset from the desired point.
Well, you have "if(destinationDistance > .5f){" in your code, which will mean that it might not get to the destination position if the distance is half a unit or closer.
$$anonymous$$oveTowards will only move as far as the destination position given, so it is impossible that it will go beyond the destination point, which makes me believe that the pivot point in your marker is wrong. $$anonymous$$ake sure that the tip(or center, or whatever you want) is at 0,0,0 in local space of the model. If it was for example at 1,0,0 then the marker would be displayed at 1 unit to the side looking like the character is walking to the incorrect place.
you are correct with it being something other than the code, i turned off my animation for the instantiated object and the character moves and stops at the instantiated object, so it has to be the animation changing the location of the object. thanks for your help but i have one more question for you..
what i want to happen after the character hits the coordinates of the mouse click, i want that instantiated object to be destroyed how may i code that in?
Your answer
![](https://koobas.hobune.stream/wayback/20220613081133im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
How to I get an object to disappear when I use the mouse to click on it? 1 Answer
Different action if a key is pressed when the mouse is clicked 2 Answers
Explosion at mouse 1 Answer
Instantiate Objects on Cells created during run time 1 Answer
How to prevent GameObject from spawning on top of each other? 1 Answer