You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MiniGames/Assets/Scripts/EnvironmentBuilder.cs

86 lines
2.6 KiB
C#

using UnityEngine;
public class EnvironmentBuilder : MonoBehaviour
{
[Header("Cliff Prefabs")]
public GameObject[] largeCliffs;
public GameObject[] smallCliffs;
[Header("Grid Settings")]
public int gridWidth = 3;
public int gridHeight = 2;
public float spacingMultiplier = 1.05f;
public float verticalOffset = 0f;
[ContextMenu("Generate Environment")]
public void GenerateEnvironment()
{
ClearPrevious();
Vector3 startPos = transform.position;
for (int x = 0; x < gridWidth; x++)
{
for (int z = 0; z < gridHeight; z++)
{
GameObject prefab = largeCliffs[Random.Range(0, largeCliffs.Length)];
Vector3 size = GetMeshSize(prefab);
float xOffset = x * size.x * spacingMultiplier;
float zOffset = z * size.z * spacingMultiplier;
Vector3 pos = new Vector3(xOffset, 0f, zOffset) + startPos;
float correctedY = GetCorrectedYPosition(prefab);
pos.y = verticalOffset + correctedY;
Instantiate(prefab, pos, Quaternion.identity, transform);
}
}
for (int i = 0; i < smallCliffs.Length; i++)
{
GameObject prefab = smallCliffs[i];
Vector3 size = GetMeshSize(prefab);
Vector3 randomOffset = new Vector3(
Random.Range(-size.x, gridWidth * size.x),
0f,
Random.Range(-size.z, gridHeight * size.z)
);
float correctedY = GetCorrectedYPosition(prefab);
randomOffset.y = verticalOffset + correctedY;
Instantiate(prefab, randomOffset + startPos, Quaternion.identity, transform);
}
}
private Vector3 GetMeshSize(GameObject obj)
{
MeshFilter mf = obj.GetComponentInChildren<MeshFilter>();
if (mf == null || mf.sharedMesh == null)
return Vector3.one;
Bounds bounds = mf.sharedMesh.bounds;
Vector3 scale = obj.transform.localScale;
return Vector3.Scale(bounds.size, scale);
}
private float GetCorrectedYPosition(GameObject obj)
{
MeshFilter mf = obj.GetComponentInChildren<MeshFilter>();
if (mf == null || mf.sharedMesh == null)
return 0f;
Bounds bounds = mf.sharedMesh.bounds;
float pivotBottomY = bounds.min.y * obj.transform.localScale.y;
return -pivotBottomY;
}
private void ClearPrevious()
{
for (int i = transform.childCount - 1; i >= 0; i--)
{
DestroyImmediate(transform.GetChild(i).gameObject);
}
}
}