Files
FORT-BO/Assets/CONTENT/Game/Scripts/Round/StartRoomZone.cs
T

79 lines
2.6 KiB
C#

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<Collider>();
}
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<Collider>();
if (targetCollider == null)
return;
Gizmos.color = new Color(0.2f, 0.75f, 1f, 0.22f);
Gizmos.DrawCube(targetCollider.bounds.center, targetCollider.bounds.size);
}
}