- Home /
Instantiate On Container Child
Greetings, everyone. I'm new to Unity development, and I've been watching lots of tutorials lately. I appreciate the help in advance; answers provided here have helped a lot.
I've put together some rudimentary code--I'm just testing some things right now--but I'm stuck because I know before I even finish that there must be a better way to do what I want to do. Here's what I'm planning:
A hex-based tile board that instantiates an object in the center of whichever hex tile is touched.
I'm currently using the mouse in place of a touch screen, but this is just test code, anyway. I've figured out how to spawn the object in the center of the container I touched (a simple 3D cylinder for testing). But here's where I'm stuck:
I could create a unique name for each of the 19 hex tiles I intend to have in the end, and then just copy/paste this code 19 times for each container. However, I know there has to be a better way, something like grabbing the child GameObject of the Collider hit by the Ray and Instantiating the "sphere" on that specific child, but I can't figure out how to make it work. Any ideas?
In Unity, I've got an EmptyGameObject called "SpawnPoint" as a child of the Cylinder, and that's where I'm aiming to spawn the sphere. Right now I'm cheating by using a Vector3 to put the sphere where I want it, but that's just me practicing.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public GameObject sphere;
public GameObject cylinder;
void Update ()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit hitInfo;
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (ray, out hitInfo))
{
Debug.Log ("Raycast hit:" + hitInfo.collider.gameObject.name);
if (hitInfo.collider.gameObject.name == "Cylinder")
{
Vector3 spawnPoint = new Vector3 (cylinder.transform.position.x, cylinder.transform.position.y, -200.0f);
Instantiate (sphere, spawnPoint , transform.rotation);
}
}
}
}
}
Answer by sethuraj · Nov 27, 2017 at 10:31 AM
Hi, There are several ways to accomplish this. Here is a method that came into my mind for the requirement.
Create two scripts 'HexTile' which should be assigned to all the 19 tiles and a 'GameManager' for managing the inputs. Dont forget to add a collider to each hex tiles
//Script to be added to all the hex tiles
public class HexTiles : MonoBehaviour
{
//Function to add a sphere to this hex
public void AddSphere(GameObject prefab)
{
//Instantiate the sphere prefab
GameObject obj = Instantiate(prefab);
//Make the sphere child of this hex tile
obj.transform.SetParent(this.transform);
//Reset sphere's position to the tile's center
obj.transform.localPosition = Vector3.zero;
}
}
And here is the modified GameManager script
public class GameManager : MonoBehaviour
{
public GameObject sphere;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
RaycastHit hitInfo;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hitInfo))
{
Debug.Log("Raycast hit:" + hitInfo.collider.gameObject.name);
//Try to get the HexTiles script from the hit object
HexTiles tile = hitInfo.collider.GetComponent<HexTiles>();
//If its a valid tile
if (tile != null)
tile.AddSphere(sphere);
}
}
}
}
Hope this helps !
Your answer
Follow this Question
Related Questions
how to make a Portal 2-esque laser beam "redirection" system? 0 Answers
Make an instantiated object match the slope of the terrain 1 Answer
Raycast Specific Object/Instantiate Explosion 1 Answer
How do I instantiate a projectile along the path of a raycast? 0 Answers
How can I continue to instantiate an object after deleting 0 Answers