using System.Collections.Generic;
using UnityEngine;
namespace Unity.MegaCity.Gameplay
{
///
/// Generates random positions around a transform
///
public class RandomPositionGenerator : MonoBehaviour
{
[SerializeField, Range(10, 25)]
private int m_DistancePerPoint = 20;
[SerializeField, Range(10, 64)]
private int m_MaxPoints = 14;
[SerializeField, Range(10, 200)]
private float m_Radius = 30f;
[SerializeField]
private bool m_ShowFill;
private List m_Positions = new List();
[ContextMenu("GeneratePoints")]
private void GeneratePoints()
{
m_Positions.Clear();
var children = GetComponentsInChildren(true);
foreach (var child in children)
{
if(child != transform)
DestroyImmediate(child.gameObject);
}
for (int i = 0; i < m_MaxPoints; i++)
{
var position = Random.insideUnitSphere * m_Radius;
position += transform.position;
// Check distance between points
bool isValid = true;
foreach (var existingPosition in m_Positions)
{
if (Vector3.Distance(position, existingPosition) < m_DistancePerPoint)
{
isValid = false;
break;
}
}
// If the point is valid, add it to the list with a random Y rotation
if (isValid)
{
m_Positions.Add(position);
}
}
for (int i = 0; i < m_Positions.Count; i++)
{
var position = m_Positions[i];
var newPoint = new GameObject($"Point {i + 1}");
newPoint.AddComponent();
newPoint.transform.SetParent(transform);
newPoint.transform.position = position;
newPoint.transform.rotation = Quaternion.Euler(0, Random.Range(0f, 360f), 0);
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.cyan;
if(m_ShowFill)
Gizmos.DrawSphere(transform.position, m_Radius);
else
Gizmos.DrawWireSphere(transform.position, m_Radius);
}
}
}