Snap object to grid made from cubes during runtime
I'm a complete beginner with Unity. As a practice I want to create something similar to 1010! puzzle game. For my board I use cubes that together creates a grid. I have tetris blocks created from one block cubes put together. With drag and drop script I can move tetris blocks around (parent with childrens). I stuck now with snapping those tetris blocks to my board. How can I do that? How can I check if my tetris block object is inside the board and how can I drop it so that every child from tetris block will be exactly on one piece of the board cube? The size of each children from tetris block is exactly the size of one cube from the board.
Drag and drop I use:
using UnityEngine;
using System.Collections;
public class DragAndDrop : MonoBehaviour
{
private bool _mouseState;
private GameObject target;
public Vector3 screenSpace;
public Vector3 offset;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
// Debug.Log(_mouseState);
if (Input.GetMouseButtonDown(0))
{
RaycastHit hitInfo;
target = GetClickedObject(out hitInfo);
if (target != null)
{
_mouseState = true;
screenSpace = Camera.main.WorldToScreenPoint(target.transform.position);
offset = target.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
}
}
if (Input.GetMouseButtonUp(0))
{
_mouseState = false;
}
if (_mouseState)
{
//keep track of the mouse position
var curScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
//convert the screen mouse position to world point and adjust with offset
var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
//update the position of the object in the world
target.transform.position = curPosition;
}
}
GameObject GetClickedObject(out RaycastHit hit)
{
GameObject target = null;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray.origin, ray.direction * 10, out hit))
{
target = hit.collider.transform.parent.gameObject;
}
return target;
}
}
This is how everything looks. If there is an easier way to represent the board for this type of game, I appreciate all ideas how to make it better and easier for future development :)