Moving an object on Y-axis in-game in grid based building game.
Hello everyone! I was hoping someone could help with the following:
I am following an In-game Building System tutorial on YouTube. With this system I can instantiate objects in-game and move and place them on a grid, along the Z- and X-axes.
Now I want to be able be able to move the object on the Y-axis (while still snapping to the grid) while holding down the Shift-button.
I've looked around online but I can't find it anywhere. The tutorial also doesn't cover it.
Does anyone know how to do this?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class BuildingManager : MonoBehaviour
{
public GameObject[] objects;
public GameObject pendingObject;
[SerializeField] private Material[] materials;
private Vector3 pos;
private RaycastHit hit;
[SerializeField] private LayerMask layerMask;
public float rotateAmount;
public float gridSize;
bool gridOn = true;
public bool canPlace = true;
[SerializeField] private Toggle gridToggle;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (pendingObject != null)
{
UpdateMaterials();
if (gridOn)
{
pendingObject.transform.position = new Vector3(
RoundToNearestGrid(pos.x),
RoundToNearestGrid(pos.y),
RoundToNearestGrid(pos.z)
);
}
else { pendingObject.transform.position = pos; }
if (Input.GetMouseButtonDown(0) && canPlace)
{
PlaceObject();
}
if (Input.GetKeyDown(KeyCode.Z))
{
RotateObject();
}
}
}
public void PlaceObject()
{
pendingObject.GetComponent<MeshRenderer>().material = materials[2];
pendingObject = null;
}
public void RotateObject()
{
pendingObject.transform.Rotate(Vector3.up, rotateAmount);
}
private void FixedUpdate()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, 1000, layerMask))
{
pos = hit.point;
}
}
void UpdateMaterials()
{
if (canPlace)
{
pendingObject.GetComponent<MeshRenderer>().material = materials[0];
}
if (!canPlace)
{
pendingObject.GetComponent<MeshRenderer>().material = materials[1];
}
}
public void SelectObject(int index)
{
pendingObject = Instantiate(objects[index], pos, transform.rotation);
}
public void ToggleGrid()
{
if (gridToggle.isOn)
{
gridOn = true;
}
else { gridOn = false; }
}
float RoundToNearestGrid(float pos)
{
float xDiff = pos % gridSize;
pos -= xDiff;
if (xDiff > (gridSize / 2))
{
pos += gridSize;
}
return pos;
}
}
How would you do this?
Your answer

Follow this Question
Related Questions
What is the easiest way to enable 2D isometric grid-based pathfinding? 2 Answers
Delete a specific GameObject (with tag) on a Specific Vector2 Location 0 Answers
How do I make a Grid check for objects and make them move his possition. 1 Answer
Grid based movement, sprite change to simulate movement 0 Answers
My collisions dont detect in gridbased system (check if in certain area) 0 Answers