- Home /
Jigsaw Drag and Drop Game? Help!
I am trying to make an educational jigsaw with pieces of the skull being fit together, but I am having no luck with dragging and dropping the jigsaw pieces. I need to make it for a touchscreen, but just cannot seem to get anything to move.
Not sure if there's something I am missing, I have colliders of the jigsaw pieces, with the trigger event chosen, and when I used Debug.Log with OnMouseDown it registers the click, so unsure why it isn't moving the pieces.
Is there something else going wrong? Please help!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Draggable : MonoBehaviour {
[SerializeField]
private Transform bonePlace;
private Vector2 initialPosition;
private float deltaX, deltaY;
public static bool locked;
// Mark the bones initial position
void Start () {
initialPosition = transform.position;
}
private void Update () {
// if screen is touched and the bone is not locked in place, the bone will move
if (Input.touchCount > 0 && !locked)
{
Touch touch = Input.GetTouch(0);
Vector2 touchPos = Camera.main.ScreenToWorldPoint(touch.position);
switch (touch.phase)
{
case TouchPhase.Began:
if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
{
Debug.Log ("PickedUp");
deltaX = touchPos.x - transform.position.x;
deltaY = touchPos.y - transform.position.y;
}
break;
case TouchPhase.Moved:
if (GetComponent<Collider2D>() == Physics2D.OverlapPoint(touchPos))
transform.position = new Vector2(touchPos.x - deltaX, touchPos.y - deltaY);
break;
case TouchPhase.Ended:
// if the bone isn't in the right place, it will move back to inital position
if (Mathf.Abs(transform.position.x - bonePlace.position.x) <= 0.5f &&
Mathf.Abs(transform.position.y - bonePlace.position.y) <= 0.5f)
{
transform.position = new Vector2(bonePlace.position.x, bonePlace.position.y);
}
else
{
transform.position = new Vector2 (initialPosition.x, initialPosition.y);
}
break;
}
}
}
}
Does it ever say "Picked Up"?
I'm used to using Camera.ScreenPointToRay() and Physics.Raycast to do most of this work in 3D, so I'm less familiar with using 2D, but I'd say you don't need the 'if' check for just moving your finger. There's a very good chance that the user will move their finger out of the collider for your puzzle piece, so all that should matter is that your finger was over the piece when the touch first started.
So set a boolean if they touched it under touchphase.began, then just check that ins$$anonymous$$d of double-checking the collider every frame.