|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.Serialization;
|
|
|
|
|
|
|
|
|
|
@ -21,6 +22,7 @@ namespace Game
|
|
|
|
|
public float SizeY;
|
|
|
|
|
public float Radius;
|
|
|
|
|
public float Angle;
|
|
|
|
|
private List<Vector3> vertices = new List<Vector3>();
|
|
|
|
|
|
|
|
|
|
public static Shape NewDot(Vector3 offset)
|
|
|
|
|
{
|
|
|
|
|
@ -94,40 +96,71 @@ namespace Game
|
|
|
|
|
return aabb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ForeachVertices(Vector3 direction, Action<Vector3> action)
|
|
|
|
|
public void SetVertices(Vector3 direction)
|
|
|
|
|
{
|
|
|
|
|
var (halfX, halfY) = (SizeX / 2, SizeY / 2);
|
|
|
|
|
vertices.Clear();
|
|
|
|
|
switch (Type)
|
|
|
|
|
{
|
|
|
|
|
case EShapeType.Circle:
|
|
|
|
|
for (var i = 0; i < 360; i += 15)
|
|
|
|
|
{
|
|
|
|
|
var angle = i * Mathf.Deg2Rad;
|
|
|
|
|
var x = Mathf.Cos(angle) * Radius;
|
|
|
|
|
var z = Mathf.Sin(angle) * Radius;
|
|
|
|
|
vertices.Add(new Vector3(x, 0, z));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var up = new Vector3(direction.z, 0, direction.x);
|
|
|
|
|
var right = new Vector3(direction.x, 0, -direction.z);
|
|
|
|
|
break;
|
|
|
|
|
case EShapeType.Sector:
|
|
|
|
|
var rotAdd = Util.Vec3ToRot(direction);
|
|
|
|
|
vertices.Add(Vector3.zero);
|
|
|
|
|
var vertNum = (int)(Angle / 15);
|
|
|
|
|
var anglePerVertex = Angle / vertNum;
|
|
|
|
|
for (var i = 0; i <= vertNum; i++)
|
|
|
|
|
{
|
|
|
|
|
var angle = (i * anglePerVertex + rotAdd - Angle / 2) * Mathf.Deg2Rad;
|
|
|
|
|
var x = Mathf.Cos(angle) * Radius;
|
|
|
|
|
var z = Mathf.Sin(angle) * Radius;
|
|
|
|
|
vertices.Add(new Vector3(x, 0, z));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var topLeft = right * halfX - up * halfY;
|
|
|
|
|
var topRight = right * halfX + up * halfY;
|
|
|
|
|
var bottomLeft = -right * halfX - up * halfY;
|
|
|
|
|
var bottomRight = -right * halfX + up * halfY;
|
|
|
|
|
break;
|
|
|
|
|
case EShapeType.Box:
|
|
|
|
|
var (halfX, halfY) = (SizeX / 2, SizeY / 2);
|
|
|
|
|
|
|
|
|
|
var up = new Vector3(direction.z, 0, direction.x);
|
|
|
|
|
var right = new Vector3(direction.x, 0, -direction.z);
|
|
|
|
|
|
|
|
|
|
var topLeft = right * halfX - up * halfY;
|
|
|
|
|
var topRight = right * halfX + up * halfY;
|
|
|
|
|
var bottomLeft = -right * halfX - up * halfY;
|
|
|
|
|
var bottomRight = -right * halfX + up * halfY;
|
|
|
|
|
vertices.Add(topLeft);
|
|
|
|
|
vertices.Add(topRight);
|
|
|
|
|
vertices.Add(bottomLeft);
|
|
|
|
|
vertices.Add(bottomRight);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
action(topLeft);
|
|
|
|
|
action(topRight);
|
|
|
|
|
action(bottomLeft);
|
|
|
|
|
action(bottomRight);
|
|
|
|
|
public void ForeachVertices(Vector3 direction, Action<Vector3> action)
|
|
|
|
|
{
|
|
|
|
|
SetVertices(direction);
|
|
|
|
|
foreach (var item in vertices)
|
|
|
|
|
{
|
|
|
|
|
action(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ForeachVerticesPair(Vector3 direction, Action<Vector3, Vector3> action)
|
|
|
|
|
{
|
|
|
|
|
var (halfX, halfY) = (SizeX / 2, SizeY / 2);
|
|
|
|
|
|
|
|
|
|
var up = new Vector3(direction.z, 0, direction.x);
|
|
|
|
|
var right = new Vector3(direction.x, 0, -direction.z);
|
|
|
|
|
|
|
|
|
|
var topLeft = right * halfX - up * halfY;
|
|
|
|
|
var topRight = right * halfX + up * halfY;
|
|
|
|
|
var bottomLeft = -right * halfX - up * halfY;
|
|
|
|
|
var bottomRight = -right * halfX + up * halfY;
|
|
|
|
|
|
|
|
|
|
action(topLeft, topRight);
|
|
|
|
|
action(topRight, bottomRight);
|
|
|
|
|
action(bottomRight, bottomLeft);
|
|
|
|
|
action(bottomLeft, topLeft);
|
|
|
|
|
SetVertices(direction);
|
|
|
|
|
for (var i = 0; i < vertices.Count; i++)
|
|
|
|
|
{
|
|
|
|
|
var next = i + 1;
|
|
|
|
|
if (next >= vertices.Count) next = 0;
|
|
|
|
|
action(vertices[i], vertices[next]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|