City Generator Script Not Working
Hey guys,
This city generator script I made doesn't populate any objects for some reason. It worked before but isn't now. Made a quick loom video to give some visual context if you need. Let me know if anyone can figure it out or any more questions.
Salud,
-Z
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OsirisCityGenerator : MonoBehaviour
{
public GameObject[] itemsToPickFrom;
public GameObject terrainMesh;
public float itemNumSpawn = 10;
public float itemXSpread = 100;
public float itemYSpread = 0;
public float itemZSpread = 100;
public float cHeightMax = 40f;
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < itemNumSpawn; i++)
{
Vector3 pos = new Vector3(Random.Range(-itemXSpread, itemXSpread), Random.Range(-itemYSpread, itemYSpread), Random.Range(-itemZSpread, itemZSpread));
Vector3 posProjected = ProjectPointOnTerrain(pos, out Color tColor);
}
}
Vector3 ProjectPointOnTerrain(Vector3 pointInput, out Color tColor)
{
Vector3 pointTemp = Vector3.zero;
RaycastHit hit;
Ray ray = new Ray(pointInput, Vector3.down * 100000f);
Collider coll = terrainMesh.GetComponent<Collider>();
int randomIndex = Random.Range(0, itemsToPickFrom.Length);
if (coll.Raycast(ray, out hit, 400f))
{
Quaternion spawnRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
Renderer rend = hit.transform.GetComponent<Renderer>();
Texture2D tex = rend.material.mainTexture as Texture2D;
Vector2 pixelUV = hit.textureCoord;
pixelUV.x *= tex.width;
pixelUV.y *= tex.height;
tColor = tex.GetPixel((int)pixelUV.x, (int)pixelUV.y);
GameObject curBuilding = Instantiate(itemsToPickFrom[randomIndex], hit.point, spawnRotation, this.transform);
curBuilding.transform.GetComponent<MeshRenderer>().material.color = tColor;
float rV = tColor.r;
float gV = tColor.g;
float bV = tColor.b;
curBuilding.transform.localScale = new Vector3(bV * 1f + rV * 2f + gV * 1f, bV * Random.Range(0, cHeightMax) + rV * Random.Range(0, cHeightMax) + gV * Random.Range(0, cHeightMax), bV * 1f + rV * 2f + gV * 1f);
}
else
{
tColor = Color.black;
}
return pointTemp;
}
// Update is called once per frame
void Update()
{
}
}
,Hey guys,
This script I made isn't generating for some reason. I've posted the code below and a loom video if you need some more visual context of the situation, lmk if anyone has the answer.
Salud,
-Z
Loom video: https://www.loom.com/share/3b1aa374d9e24f6cb38c39507f5fab9c
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OsirisCityGenerator : MonoBehaviour
{
public GameObject[] itemsToPickFrom;
public GameObject terrainMesh;
public float itemNumSpawn = 10;
public float itemXSpread = 100;
public float itemYSpread = 0;
public float itemZSpread = 100;
public float cHeightMax = 40f;
// Start is called before the first frame update
void Start()
{
for (int i = 0; i < itemNumSpawn; i++)
{
Vector3 pos = new Vector3(Random.Range(-itemXSpread, itemXSpread), Random.Range(-itemYSpread, itemYSpread), Random.Range(-itemZSpread, itemZSpread));
Vector3 posProjected = ProjectPointOnTerrain(pos, out Color tColor);
}
}
Vector3 ProjectPointOnTerrain(Vector3 pointInput, out Color tColor)
{
Vector3 pointTemp = Vector3.zero;
RaycastHit hit;
Ray ray = new Ray(pointInput, Vector3.down * 100000f);
Collider coll = terrainMesh.GetComponent<Collider>();
int randomIndex = Random.Range(0, itemsToPickFrom.Length);
if (coll.Raycast(ray, out hit, 400f))
{
Quaternion spawnRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
Renderer rend = hit.transform.GetComponent<Renderer>();
Texture2D tex = rend.material.mainTexture as Texture2D;
Vector2 pixelUV = hit.textureCoord;
pixelUV.x *= tex.width;
pixelUV.y *= tex.height;
tColor = tex.GetPixel((int)pixelUV.x, (int)pixelUV.y);
GameObject curBuilding = Instantiate(itemsToPickFrom[randomIndex], hit.point, spawnRotation, this.transform);
curBuilding.transform.GetComponent<MeshRenderer>().material.color = tColor;
float rV = tColor.r;
float gV = tColor.g;
float bV = tColor.b;
curBuilding.transform.localScale = new Vector3(bV * 1f + rV * 2f + gV * 1f, bV * Random.Range(0, cHeightMax) + rV * Random.Range(0, cHeightMax) + gV * Random.Range(0, cHeightMax), bV * 1f + rV * 2f + gV * 1f);
}
else
{
tColor = Color.black;
}
return pointTemp;
}
// Update is called once per frame
void Update()
{
}
}
Your answer
Follow this Question
Related Questions
Instantiate isnt working for spawner class 1 Answer
Spawning objects uNet Client and Local 0 Answers
How to spawn a player and a camera together? 2 Answers
Battle stations for my RPG game 0 Answers
Parent collider sometime counting as child's collider 0 Answers