- Home /
Object placement in a grid on player.transform.position
Hey, I found this Object placement in a grid Tutorial on youtube:
https://www.youtube.com/watch?v=N9wdgqlKw5s
In the comment answers the author has posted the project download link.
The Script is working fine, the grid box highlight is based on mousePosition:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
I need to have the object placement instead of mousePosition on my Player.position (Im using a Third Person Controller). So the grid box is always highlighted on the grid the player is standing. My try so far, I added my Player to a Layermask and im using this modified code inside DragObjectPlace.cs:
private GameObject networkPlayer;
private Vector3 networkPlayerVector;
void Start()
{
networkPlayer = GameObject.FindGameObjectWithTag("Player");
}
void Update()
{
networkPlayerVector = networkPlayer.transform.position;
Vector3 fwd = networkPlayer.transform.TransformDirection(Vector3.forward);
// Bit shift the index of the layer (8) to get a bit mask
int layerMask = ~(1 << 9);
Ray ray = new Ray(networkPlayerVector, fwd);
if (Physics.Raycast(ray, out hitInfor, 10, layerMask))
{ ....... and so on
This is working fine, but the grid is placed on Vector3.forward, so always 1 grid away from the players view direction. How can I get the grid placed on Player position? I thought its this code, but this doesn't Raycast anything at all:
Ray ray = new Ray(networkPlayerVector, networkPlayerVector);
Here is the full unmodified code from youtube:
PlaceBehaviour.cs
using UnityEngine;
using System.Collections;
public class PlaceBehaviour : MonoBehaviour
{
public GameObject currentObject;
}
DragObjectPlace.cs
using UnityEngine;
using System.Collections;
public class DragObjectPlace : MonoBehaviour
{
[System.Serializable]
public class PlaceSelect
{
public Color32 selectColor;
public Color32 busyColor;
public void Select(PlaceBehaviour place)
{
MeshRenderer mesh = place.GetComponent<MeshRenderer>();
mesh.enabled = true;
if (place.currentObject == null)
mesh.material.color = selectColor;
else
mesh.material.color = busyColor;
}
public void Deselect(PlaceBehaviour place)
{
place.GetComponent<MeshRenderer>().enabled = false;
}
}
public GameObject objectInDrag;
public Vector3 offset;
public PlaceSelect placeSelect;
private PlaceBehaviour lastPlaceSelected;
void Update()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfor;
if (Physics.Raycast(ray, out hitInfor))
{
objectInDrag.SetActive(true);
if (hitInfor.collider.GetComponent<PlaceBehaviour>() != null)
{
if (lastPlaceSelected != null)
placeSelect.Deselect(lastPlaceSelected);
lastPlaceSelected = hitInfor.collider.GetComponent<PlaceBehaviour>();
placeSelect.Select(lastPlaceSelected);
if (Input.GetMouseButtonDown(0))
{
if (lastPlaceSelected.currentObject != null)
return;
GameObject objectInPlace = Instantiate(objectInDrag) as GameObject;
objectInPlace.transform.position = objectInDrag.transform.position;
lastPlaceSelected.currentObject = objectInPlace;
objectInPlace.transform.parent = lastPlaceSelected.transform;
}
}
Vector3 pos = new Vector3(hitInfor.collider.transform.position.x, offset.y, hitInfor.collider.transform.position.z);
objectInDrag.transform.position = pos;
}
else
{
objectInDrag.SetActive(false);
}
}
}
PlaceObject.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlaceObject : MonoBehaviour
{
public int sizeGridX;
public int sizeGridZ;
public Transform baseGrid;
public GameObject place;
private Vector3 sizePlace = Vector3.zero;
private Vector3 gridPosition = Vector3.zero;
private Vector3 startGridPosition = Vector3.zero;
void Start()
{
FillGrid();
}
private void Values()
{
sizePlace.x = baseGrid.transform.localScale.x / sizeGridX;
sizePlace.z = baseGrid.transform.localScale.z / sizeGridZ;
sizePlace.y = 0.25f;
gridPosition.x = (baseGrid.transform.localScale.x / 2) - (sizePlace.x / 2);
gridPosition.z = (baseGrid.transform.localScale.z / 2) - (sizePlace.z / 2);
gridPosition.y = 0.5f;
startGridPosition = gridPosition;
}
public void FillGrid()
{
Values();
for (int x = 0; x < sizeGridX; x++)
{
for (int z = 0; z < sizeGridZ; z++)
{
GameObject newPlace = Instantiate(place) as GameObject;
newPlace.transform.localScale = sizePlace;
newPlace.transform.position = gridPosition;
if (z >= (sizeGridZ - 1))
gridPosition.z = startGridPosition.z;
else
gridPosition.z -= sizePlace.z;
newPlace.transform.parent = transform;
newPlace.SetActive(true);
}
gridPosition.x -= sizePlace.x;
}
}
public void Destroy()
{
PlaceBehaviour[] places = GetComponentsInChildren<PlaceBehaviour>();
for (int i = 0; i < places.Length; i++)
{
Destroy(places[i].gameObject);
}
}
}
Answer by grasnreloaded · Jun 26, 2018 at 07:51 PM
The author just answered me and his suggestion was this code which is working fine:
public Transform raycastPoint;
void Update() {
RaycastHit hitInfor;
if (Physics.Raycast(raycastPoint.position, Vector3.down, out hitInfor)) {
//do thing
}
}
The only problem now, the cube is flashing sometimes it collides with the player. I made a gif to demonstrate: https://uploadix.de/images/2018/06/26/ani.gif
Your answer
Follow this Question
Related Questions
I want to make a gun with 2 parts and follow their positions and scales 2 Answers
I need to move a clone of a prefab to a specific position after it instantiates 1 Answer
transform of instantiated bullet via ui button press not following the player 0 Answers
prefab always instantiates at 0.0.0 1 Answer
GameObject.transform.Find().position returning local position for instantiated gameobjects. 0 Answers