This commit is contained in:
2026-07-09 21:33:33 +02:00
commit 84a2a365f3
2364 changed files with 950134 additions and 0 deletions
@@ -0,0 +1,40 @@
using System;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[Serializable]
public abstract class AbstractAreaOfEffect
{
[SerializeField] private bool fixedRotation;
[SerializeField] [MinValue(-180), MaxValue(180)] private float offsetRotation;
/// <summary>
/// Calculates final rotation that include AOE offset rotation and/or fixed rotation.
/// </summary>
/// <param name="from">Position on AOE collider</param>
/// <param name="to">Position where AOE collider should look</param>
/// <returns>Quaternion to put into tranform.rotation</returns>
public Quaternion GetRotation(Vector3 from, Vector3 to)
{
// Ignore look angle, we use only offset rotation
if (fixedRotation) return Quaternion.Euler(new Vector3(0, offsetRotation, 0));
// Include offset rotation into look rotation
var directionNormalized = (new Vector2(to.x, to.z) - new Vector2(from.x, from.z)).normalized;
var lookAngleY = Vector2.SignedAngle(Vector2.up, directionNormalized) * -1;
return Quaternion.Euler(new Vector3(0, lookAngleY + offsetRotation, 0));
}
/// <summary>
/// Returns mesh of this area of effect.
/// </summary>
public abstract Mesh GetMesh();
/// <summary>
/// Adds prepared collider to given GameObject.
/// </summary>
public abstract Collider AddCollider(GameObject gameObject);
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4df7809a77e042a9966ae305d6e915a6
timeCreated: 1668882573
@@ -0,0 +1,100 @@
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[TypeRegistryItem("Cone")]
public class ConeAreaOfEffect : AbstractAreaOfEffect
{
[SerializeField, Required, MinValue(0.5), MaxValue(10)]
private float length;
[SerializeField, Required, MinValue(10), MaxValue(350)]
private float degree;
public override Mesh GetMesh()
{
var mesh = GenerateConeMesh();
mesh.vertices = mesh.vertices.Select(vertex => Vector3.Scale(vertex, new Vector3(length, 1, length))).ToArray();
return mesh;
}
public override Collider AddCollider(GameObject gameObject)
{
var collider = gameObject.AddComponent<MeshCollider>();
collider.sharedMesh = GetMesh();
collider.convex = true;
collider.isTrigger = true;
return collider;
}
private Mesh GenerateConeMesh()
{
var sections = Mathf.FloorToInt(degree / 10);
var mesh = new Mesh();
var vertices = new Vector3[4 + sections * 2];
var uv = new Vector2[vertices.Length];
var triangles = new int[(4 + sections * 4) * 3];
var currentAngle = -sections * 10 / 2;
var vertexIndex = 0;
var triangleIndex = 0;
vertices[0] = new Vector3(0,-0.5f,0);
vertices[1] = new Vector3(0,0.5f,0);
vertices[2] = new Vector3(Mathf.Sin(Mathf.Deg2Rad * currentAngle), -0.5f, Mathf.Cos(Mathf.Deg2Rad * currentAngle));
vertices[3] = new Vector3(Mathf.Sin(Mathf.Deg2Rad * currentAngle), 0.5f, Mathf.Cos(Mathf.Deg2Rad * currentAngle));
triangles[0] = 0;
triangles[1] = 3;
triangles[2] = 1;
triangles[3] = 0;
triangles[4] = 2;
triangles[5] = 3;
for (var i = 0; i < sections; i++)
{
vertexIndex = 4 + i*2;
triangleIndex = (2 + i*4) * 3;
currentAngle += 10;
vertices[vertexIndex+0] = new Vector3(Mathf.Sin(Mathf.Deg2Rad * currentAngle), -0.5f, Mathf.Cos(Mathf.Deg2Rad * currentAngle));
vertices[vertexIndex+1] = new Vector3(Mathf.Sin(Mathf.Deg2Rad * currentAngle), 0.5f, Mathf.Cos(Mathf.Deg2Rad * currentAngle));
triangles[triangleIndex+0] = 0;
triangles[triangleIndex+1] = vertexIndex;
triangles[triangleIndex+2] = vertexIndex-2;
triangles[triangleIndex+3] = 1;
triangles[triangleIndex+4] = vertexIndex-1;
triangles[triangleIndex+5] = vertexIndex+1;
triangles[triangleIndex+6] = vertexIndex-2;
triangles[triangleIndex+7] = vertexIndex;
triangles[triangleIndex+8] = vertexIndex-1;
triangles[triangleIndex+9] = vertexIndex;
triangles[triangleIndex+10] = vertexIndex+1;
triangles[triangleIndex+11] = vertexIndex-1;
}
triangleIndex += 12;
triangles[triangleIndex+0] = 0;
triangles[triangleIndex+1] = vertexIndex+1;
triangles[triangleIndex+2] = vertexIndex;
triangles[triangleIndex+3] = 0;
triangles[triangleIndex+4] = 1;
triangles[triangleIndex+5] = vertexIndex+1;
mesh.vertices = vertices;
mesh.uv = uv;
mesh.triangles = triangles;
return mesh;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 520c8333284d4e80ad52f6f52c6bed9f
timeCreated: 1668886267
@@ -0,0 +1,41 @@
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[TypeRegistryItem("Line")]
public class LineAreaOfEffect : AbstractAreaOfEffect
{
[SerializeField, Required, MinValue(0.5), MaxValue(10)]
private float length;
[SerializeField, Required, MinValue(0.1), MaxValue(1)]
private float width;
public override Mesh GetMesh()
{
var scale = new Vector3(width, 1, length);
var cubeMesh = Resources.GetBuiltinResource<Mesh>("Cube.fbx");
var mesh = new Mesh();
mesh.vertices = cubeMesh.vertices.Select(vertex => Vector3.Scale(vertex, scale)).ToArray();
mesh.triangles = cubeMesh.triangles;
mesh.uv = cubeMesh.uv;
mesh.normals = cubeMesh.normals;
mesh.colors = cubeMesh.colors;
mesh.tangents = cubeMesh.tangents;
return mesh;
}
public override Collider AddCollider(GameObject gameObject)
{
var collider = gameObject.AddComponent<BoxCollider>();
collider.isTrigger = true;
collider.size = new Vector3(width, 1, length);
collider.center = new Vector3(0, 0, length/2);
return collider;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 09edcf0819c940c9bf301b7cec804652
timeCreated: 1668886161
@@ -0,0 +1,19 @@
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[TypeRegistryItem("None")]
public class NoneAreaOfEffect : AbstractAreaOfEffect
{
public override Mesh GetMesh()
{
return null;
}
public override Collider AddCollider(GameObject gameObject)
{
return null;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 296c84aa02c94e42b05c9fe8fa167c6a
timeCreated: 1723994170
@@ -0,0 +1,34 @@
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[TypeRegistryItem("Point")]
public class PointAreaOfEffect : AbstractAreaOfEffect
{
public override Mesh GetMesh()
{
var sphereMesh = Resources.GetBuiltinResource<Mesh>("Sphere.fbx");
var mesh = new Mesh();
mesh.vertices = sphereMesh.vertices.Select(vertex => vertex * 0.1f).ToArray();
mesh.triangles = sphereMesh.triangles;
mesh.uv = sphereMesh.uv;
mesh.normals = sphereMesh.normals;
mesh.colors = sphereMesh.colors;
mesh.tangents = sphereMesh.tangents;
return mesh;
}
public override Collider AddCollider(GameObject gameObject)
{
var collider = gameObject.AddComponent<SphereCollider>();
collider.isTrigger = true;
collider.radius = 0.05f;
return collider;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c184340780c04acd8a4b77a992cfa0d5
timeCreated: 1668886062
@@ -0,0 +1,37 @@
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[TypeRegistryItem("Sphere")]
public class SphereAreaOfEffect : AbstractAreaOfEffect
{
[SerializeField, Required, MinValue(0.5)]
private float radius;
public override Mesh GetMesh()
{
var sphereMesh = Resources.GetBuiltinResource<Mesh>("Cylinder.fbx");
var mesh = new Mesh();
mesh.vertices = sphereMesh.vertices.Select(vertex => vertex * radius).ToArray();
mesh.triangles = sphereMesh.triangles;
mesh.uv = sphereMesh.uv;
mesh.normals = sphereMesh.normals;
mesh.colors = sphereMesh.colors;
mesh.tangents = sphereMesh.tangents;
return mesh;
}
public override Collider AddCollider(GameObject gameObject)
{
var collider = gameObject.AddComponent<SphereCollider>();
collider.isTrigger = true;
collider.radius = radius;
return collider;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: afb5127c03e442a693e9ae8065efc8b7
timeCreated: 1668886391