Snippets

ömer faruk sayılır ProjectileRenderer

Created by Omer F. Sayilir last modified
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)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.