- Home /
How to instantiate object at touch position?
Hello, first, I wanna say I tried a lot before asking, I checked the scripting references, I checked another questions, and all that helped, but I can't figure out how to do it.
I'm trying to make a "Fruit Ninja" like effect. When the player drag the finger over the screen, a trail will appear and follow the movement.
My script is ALMOST working... Every time I touch the screen, my prefab empty gameObject called "Trail" instantiate, and I can move it around and leave a trail with a Trail Renderer. When the finger leaves, I destroy it from the scene.
The problem is. It's NOT instantiating correctly. First it would instantiate at the center of screen, even if I touched the corner and started moving my finger from there. I changed the script a little, and now is instantiating from the corner (0,0).
My situation is: Inside the prefab I have the movement script. In the scene I have a script calling the prefab when I touch the screen. A total of 2 scripts. (1 for moving around, which is inside the prefab, and 1 for instantiating to the scene, which is not working right).
What I want is to instantiate exactly where the finger touches the screen.
I tried a Raycast, tried a ScreenToWorldPoint, a WorldToScreenPoint... I don't know exactly what to do.
Here goes the Movement Script:
using UnityEngine;
using System.Collections;
public class Finger_Move : MonoBehaviour
{
float swipeSpeed = 0.1F;
public static float inputX;
public static float inputY;
void Update ()
{
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Ended) {
Destroy (gameObject);
}
}
void FixedUpdate ()
{
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Moved) {
Vector2 touchDeltaPosition = Input.GetTouch (0).deltaPosition;
inputX = touchDeltaPosition.x * swipeSpeed;
inputY = touchDeltaPosition.y * swipeSpeed;
transform.Translate (inputX, inputY, 0);
//Debug.Log ("X, Y: " + touchDeltaPosition.x + ", " + touchDeltaPosition.y);
}
}
}
And now the Instantiate Script (which I think is wrong):
using UnityEngine;
using System.Collections;
public class Create_Trail : MonoBehaviour {
// Use this for initialization
public Transform trail;
public GameObject clone;
void Start () {
}
// Update is called once per frame
public void Update () {
if(Input.touchCount > 0 && Input.GetTouch(0).phase==TouchPhase.Began){
Vector3 v = new Vector3(Finger_Move.inputX,
Finger_Move.inputY,
5);
Vector3 ray = Camera.main.ScreenToWorldPoint(v);
clone = Instantiate(trail, ray, transform.rotation) as GameObject;
}
}
}
Can anyone help me? Thanks!
Answer by yezzer · Apr 14, 2012 at 05:56 PM
Note: You should only really use FixedUpdate() for physics.
Firstly, I'd just experiment with a sphere or cube. Keep it simple, then when the basics are working, expand on it.
ScreenToWorldPoint sounds correct from what you describe.
Remember that the z returned from ScreenToWorldPoint is in units away from the camera. Depending on your camera, 5 might appear to be quite far away, and if you're not using an orthographic camera, it could appear to be quite far into the screen.
Answer by Viktor.Eisenmann · Apr 14, 2012 at 06:43 PM
Well, I fixed. I started over, with a sphere, and it worked. I changed the instantiate script to this:
using UnityEngine;
using System.Collections;
public class Create_Trail : MonoBehaviour
{
// Use this for initialization
public Transform trail;
public GameObject clone;
void Start ()
{
}
// Update is called once per frame
public void FixedUpdate ()
{
if (Input.touchCount > 0 && Input.GetTouch (0).phase == TouchPhase.Began) {
Vector3 fingerPos = Input.GetTouch (0).position;
fingerPos.z = 5;
Vector3 objPos = Camera.main.ScreenToWorldPoint (fingerPos);
clone = Instantiate (trail, objPos, Quaternion.identity) as GameObject;
}
}
}
Thank you!
Why use FixedUpdate() though? This should be in Update() :)
clone = Instantiate (trail, objPos, Quaternion.identity) as GameObject;
This line is not correct...
Answer by money4honey · Nov 04, 2016 at 11:52 AM
In last version of unity you can use Trail Renderer for this
Can you plz expland the code using Trail Renderer in above code
Your answer
![](https://koobas.hobune.stream/wayback/20220613070324im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Instantiate object at touch position problem 1 Answer
Why does "draggable" MonoBehavior cause the object to be moved in the opposite direction? 1 Answer
Touch controlled ice puck 0 Answers
Touch Drag GameObject Found 1 Answer
Moving selected unit to location in space rts based on screen touch 3 Answers