Snippets
Created by
Omer F. Sayilir
last modified
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter)),RequireComponent(typeof(MeshRenderer)),ExecuteInEditMode]
public class ProjectileRenderer : MonoBehaviour
{
public float width = 0.1f;
public MeshFilter MeshFilter {get{ return _mMeshFilter ?? (_mMeshFilter = GetComponent<MeshFilter>()); }}
public MeshRenderer MeshRenderer {get{ return _mMeshRenderer ?? (_mMeshRenderer = GetComponent<MeshRenderer>()); }}
private MeshFilter _mMeshFilter;
private MeshRenderer _mMeshRenderer;
private Mesh _mesh;
// Test
private List<ProjectileQuad> _projectileQuads;
public Sprite bullet;
#if UNITY_EDITOR
private void OnValidate() {
Init();
}
#endif
private void OnEnable() {
MeshRenderer.enabled = this.enabled;
}
private void OnDisable() {
MeshRenderer.enabled = this.enabled;
}
private void Start() {
Init();
}
// Use this for initialization
void Init () {
_mesh = new Mesh {name = "Projectile Mesh"};
_mesh.MarkDynamic();
MeshFilter.mesh = _mesh;
if (bullet) {
MaterialPropertyBlock mpb = new MaterialPropertyBlock();
mpb.SetTexture("_MainTex",bullet.texture);
MeshRenderer.SetPropertyBlock(mpb);
}
//Test
_projectileQuads = new List<ProjectileQuad>();
for (int i = 0; i < 310; i++) {
_projectileQuads.Add(new ProjectileQuad(){ endPos = Random.insideUnitCircle*20, startPos = Random.insideUnitCircle*20});
}
}
// ReSharper disable once InconsistentNaming
private const int MAX_PROJECTILE = 500;
readonly List<Vector3> _verts = new List<Vector3>(4*MAX_PROJECTILE);
readonly List<int> _tris = new List<int>(6*MAX_PROJECTILE);
readonly List<Color> _colors = new List<Color>(4*MAX_PROJECTILE);
readonly List<Vector2> _uvs = new List<Vector2>(4*MAX_PROJECTILE);
readonly List<Vector3> _normals = new List<Vector3>(4*MAX_PROJECTILE);
public void Render(List<ProjectileQuad> quads) {
if (quads == null) return;
if (quads.Count > MAX_PROJECTILE) {
quads.RemoveRange(MAX_PROJECTILE,quads.Count - MAX_PROJECTILE);
}
_verts.Clear();
_tris.Clear();
_colors.Clear();
_uvs.Clear();
_normals.Clear();
var uv = (bullet != null) ? UnityEngine.Sprites.DataUtility.GetOuterUV(bullet) : Vector4.zero;
for (int i = 0; i < quads.Count; i++) {
var dif = quads[i].startPos - quads[i].endPos;
var normal = new Vector3(dif.y,-dif.x).normalized * width;
_verts.Add(quads[i].startPos + normal);
_verts.Add(quads[i].endPos + normal);
_verts.Add(quads[i].startPos - normal);
_verts.Add(quads[i].endPos - normal);
_uvs.Add(new Vector2(uv.x, uv.y));
_uvs.Add(new Vector2(uv.x, uv.w));
_uvs.Add(new Vector2(uv.z, uv.w));
_uvs.Add(new Vector2(uv.z, uv.y));
_normals.Add(Vector3.forward);
_normals.Add(Vector3.forward);
_normals.Add(Vector3.forward);
_normals.Add(Vector3.forward);
_colors.Add(new Color(1,1,1,1));
_colors.Add(new Color(1,1,1,0));
_colors.Add(new Color(1,1,1,1));
_colors.Add(new Color(1,1,1,0));
_tris.Add(i*4 + 1);
_tris.Add(i*4 + 2);
_tris.Add(i*4);
_tris.Add(i*4 + 1);
_tris.Add(i*4 + 3);
_tris.Add(i*4 + 2);
}
_mesh.SetVertices(_verts);
_mesh.SetTriangles(_tris,0);
_mesh.SetColors(_colors);
_mesh.SetUVs(0,_uvs);
_mesh.SetNormals(_normals);
}
private void Update() {
Render(_projectileQuads);
}
[System.Serializable]
public struct ProjectileQuad
{
public Vector3 startPos;
public Vector3 endPos;
}
}
|
Comments (0)
You can clone a snippet to your computer for local editing. Learn more.