using UnityEngine; [RequireComponent(typeof(Collider))] public sealed class StartRoomZone : MonoBehaviour { [SerializeField] private Collider roomCollider; public Collider RoomCollider => roomCollider; private void Awake() { if (roomCollider == null) roomCollider = GetComponent(); } public bool Contains(Vector3 worldPosition) => roomCollider != null && roomCollider.bounds.Contains(worldPosition); public bool TryGetRandomSpawnPosition( float edgePadding, float heightAboveFloor, out Vector3 position) { if (roomCollider == null) { position = default; return false; } edgePadding = Mathf.Max(0f, edgePadding); heightAboveFloor = Mathf.Max(0f, heightAboveFloor); if (roomCollider is BoxCollider boxCollider) { Vector3 lossyScale = boxCollider.transform.lossyScale; float localPaddingX = edgePadding / Mathf.Max(Mathf.Abs(lossyScale.x), 0.0001f); float localPaddingZ = edgePadding / Mathf.Max(Mathf.Abs(lossyScale.z), 0.0001f); Vector3 halfSize = boxCollider.size * 0.5f; float availableX = Mathf.Max(0f, halfSize.x - localPaddingX); float availableZ = Mathf.Max(0f, halfSize.z - localPaddingZ); Vector3 localPosition = boxCollider.center + new Vector3( Random.Range(-availableX, availableX), -halfSize.y, Random.Range(-availableZ, availableZ)); position = boxCollider.transform.TransformPoint(localPosition) + Vector3.up * heightAboveFloor; return true; } Bounds bounds = roomCollider.bounds; float minX = bounds.min.x + edgePadding; float maxX = bounds.max.x - edgePadding; float minZ = bounds.min.z + edgePadding; float maxZ = bounds.max.z - edgePadding; if (minX > maxX) minX = maxX = bounds.center.x; if (minZ > maxZ) minZ = maxZ = bounds.center.z; position = new Vector3( Random.Range(minX, maxX), bounds.min.y + heightAboveFloor, Random.Range(minZ, maxZ)); return true; } private void OnDrawGizmosSelected() { Collider targetCollider = roomCollider != null ? roomCollider : GetComponent(); if (targetCollider == null) return; Gizmos.color = new Color(0.2f, 0.75f, 1f, 0.22f); Gizmos.DrawCube(targetCollider.bounds.center, targetCollider.bounds.size); } }