Morboz
December 21, 2020, 10:54am
1
for a top down 2d project, i’m attempting to make a “cone of fire” mesh in front of weapons.
i have the origin point, range and angle values.
I want to create the mesh points from those values, for now 4 points will do, those are the origin point, the straight ahead point based on range and the two side points.
my qustion is specifically for those side points and how to get their position based on the values i have while keeping in mind the object can be rotated so creating those points should be relative to the object own “forward”.
thanks, any advice is welcome.
Morboz
December 27, 2020, 1:07pm
2
this is how i solved this eventually.
this script uses the range and angle values of the weapon to create the cone of fire shape.
changing the numOfTriangles value adds/reduces triangles from the shape for a more curved arch.
using UnityEngine;
using System.Collections.Generic;
[RequireComponent(typeof(MeshFilter))]
public class WeaponConeMesh : MonoBehaviour {
Mesh mesh;
MeshRenderer meshRenderer;
Transform weapon;
float range;
float weaponAngle;
float coneAngle;
Vector3 projOrigin;
int numOfTriangles = 10;
List<Vector3> verticesList = new List<Vector3> ();
List<int> trianglesList = new List<int> ();
void Awake() {
mesh = GetComponent<MeshFilter>().mesh;
meshRenderer = GetComponent<MeshRenderer>();
weapon = transform.parent;
}
void Start() {
WeaponHandler weaponHandler = weapon.GetComponent<WeaponHandler>();
range = weaponHandler.range;
projOrigin = weaponHandler.projOrigin;
if (weaponHandler.angle <= 1) {
coneAngle = 1;
} else {
coneAngle = weaponHandler.angle;
}
transform.position = projOrigin;
MakeMeshData();
CreateMesh();
}
void MakeMeshData() {
float angleMultiplier = 1f;
float pointIncrement = 1f / (numOfTriangles / 2);
for (int i = 0; i < numOfTriangles + 2; i++) {
if (i == 0) {
verticesList.Add(new Vector3(0, 0, 0));
}
else {
verticesList.Add(Quaternion.Euler(new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, coneAngle * angleMultiplier)) * Vector3.up * range);
angleMultiplier -= pointIncrement;
}
}
for (int i = 0; i < numOfTriangles; i++) {
List<int> singleTriangle = new List<int> ();
singleTriangle.Add(0);
singleTriangle.Add(1 + i);
singleTriangle.Add(2 + i);
trianglesList.AddRange(singleTriangle);
}
}
void CreateMesh() {
mesh.Clear();
mesh.vertices = verticesList.ToArray();
mesh.triangles = trianglesList.ToArray();
}
}