79 lines
2.6 KiB
C#
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);
|
|
}
|
|
}
|