init
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
using VOID.Generic.Dict;
|
||||
|
||||
namespace VOID.Generic.World
|
||||
{
|
||||
public class Area : MonoBehaviour
|
||||
{
|
||||
#region GIZMOS
|
||||
|
||||
private void OnDrawGizmos()
|
||||
{
|
||||
var defaultColor = Gizmos.color;
|
||||
var forward = transform.forward;
|
||||
var right = transform.right;
|
||||
var back = -forward;
|
||||
var left = -right;
|
||||
|
||||
if (forwardConnection.type != AreaConnectionType.Inner)
|
||||
{
|
||||
GizmosDrawBorder(left, forward, right, forwardConnection);
|
||||
GizmosDrawPassage(left, forward, right, forwardConnection);
|
||||
}
|
||||
|
||||
if (rightConnection.type != AreaConnectionType.Inner)
|
||||
{
|
||||
GizmosDrawBorder(forward, right, back, rightConnection);
|
||||
GizmosDrawPassage(forward, right, back, rightConnection);
|
||||
}
|
||||
|
||||
if (backConnection.type != AreaConnectionType.Inner)
|
||||
{
|
||||
GizmosDrawBorder(right, back, left, backConnection);
|
||||
GizmosDrawPassage(right, back, left, backConnection);
|
||||
}
|
||||
|
||||
if (leftConnection.type != AreaConnectionType.Inner)
|
||||
{
|
||||
GizmosDrawBorder(back, left, forward, leftConnection);
|
||||
GizmosDrawPassage(back, left, forward, leftConnection);
|
||||
}
|
||||
Gizmos.color = defaultColor;
|
||||
}
|
||||
|
||||
private void GizmosDrawBorder(Vector3 left, Vector3 forward, Vector3 right, AreaConnection connection)
|
||||
{
|
||||
if (connection.type == AreaConnectionType.Inner) return;
|
||||
var areaPos = transform.position;
|
||||
var floor = Vector3.up * HeightPerFloor * connection.floor;
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(
|
||||
areaPos + floor + forward * Size / 2 + left * Size / 2,
|
||||
areaPos + floor + forward * Size / 2 + right * Size / 2
|
||||
);
|
||||
}
|
||||
|
||||
private void GizmosDrawPassage(Vector3 left, Vector3 forward, Vector3 right, AreaConnection connection)
|
||||
{
|
||||
float passageWidth;
|
||||
switch (connection.type)
|
||||
{
|
||||
case AreaConnectionType.Tunnel: passageWidth = 5f; break;
|
||||
case AreaConnectionType.Whole: passageWidth = Size - 1f; break;
|
||||
case AreaConnectionType.None:
|
||||
case AreaConnectionType.Inner:
|
||||
default: return;
|
||||
}
|
||||
var areaPos = transform.position;
|
||||
var floor = Vector3.up * HeightPerFloor * connection.floor;
|
||||
var passageHeight = Vector3.up * 5f;
|
||||
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawLineStrip(new []{
|
||||
areaPos + floor + forward * Size / 2 + left * passageWidth / 2,
|
||||
areaPos + floor + forward * Size / 2 + right * passageWidth / 2,
|
||||
areaPos + floor + passageHeight + forward * Size / 2 + right * passageWidth / 2,
|
||||
areaPos + floor + passageHeight + forward * Size / 2 + left * passageWidth / 2
|
||||
}, true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
[BoxGroup("Constant Variables")]
|
||||
[HorizontalGroup("Constant Variables/Row")]
|
||||
[ShowInInspector]
|
||||
[ReadOnly]
|
||||
[InfoBox("Constant size of single square area. Content of this area SHOULD NOT leave given bounds.")]
|
||||
public const float Size = 50f;
|
||||
|
||||
[BoxGroup("Constant Variables")]
|
||||
[HorizontalGroup("Constant Variables/Row")]
|
||||
[ShowInInspector]
|
||||
[ReadOnly]
|
||||
[InfoBox("Constant height of floor. Every floor supposed to be dividable by that value.")]
|
||||
public const float HeightPerFloor = 3f;
|
||||
|
||||
[BoxGroup("Complex Area")]
|
||||
[HorizontalGroup("Complex Area/Row")]
|
||||
[ReadOnly]
|
||||
[InfoBox(nameof(ComplexArea) + " which is current " + nameof(Area) + "'s parent. It is filled by button in " + nameof(ComplexArea))]
|
||||
[DontValidate]
|
||||
public ComplexArea complexArea;
|
||||
|
||||
[BoxGroup("Complex Area")]
|
||||
[HorizontalGroup("Complex Area/Row")]
|
||||
[ReadOnly]
|
||||
[InfoBox("Position relative to the " + nameof(ComplexArea) + ". Usable only from " + nameof(ComplexArea))]
|
||||
public Vector2Int position = Vector2Int.zero;
|
||||
|
||||
[InfoBox("Connections to other areas."
|
||||
+"\nInner connection cant be edited here, check " + nameof(ComplexArea) + "."
|
||||
+"\nConnection only with matching tags can be connected.")]
|
||||
[BoxGroup("Connections")]
|
||||
public AreaConnection forwardConnection = new();
|
||||
[BoxGroup("Connections")]
|
||||
public AreaConnection rightConnection = new();
|
||||
[BoxGroup("Connections")]
|
||||
public AreaConnection backConnection = new();
|
||||
[BoxGroup("Connections")]
|
||||
public AreaConnection leftConnection = new();
|
||||
|
||||
public List<AreaConnection> GetConnections() =>
|
||||
new() { forwardConnection, rightConnection, backConnection, leftConnection };
|
||||
|
||||
public AreaConnection GetConnection(Direction2D direction) => direction switch
|
||||
{
|
||||
Direction2D.Forward => forwardConnection,
|
||||
Direction2D.Right => rightConnection,
|
||||
Direction2D.Back => backConnection,
|
||||
Direction2D.Left => leftConnection,
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(direction), direction, null)
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user