Added many other things and processings
This commit is contained in:
@@ -5,6 +5,8 @@ public sealed class StartRoomZone : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private Collider roomCollider;
|
||||
|
||||
public Collider RoomCollider => roomCollider;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (roomCollider == null)
|
||||
@@ -14,6 +16,56 @@ public sealed class StartRoomZone : MonoBehaviour
|
||||
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>();
|
||||
|
||||
Reference in New Issue
Block a user