init
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user