using UnityEngine; using NaughtyAttributes; using System; using Random = UnityEngine.Random; public class Poof { public Poof(GraphXData data) { Game.OnEat += this.Eat; this.data = data; } GraphXData data; public class Pif { public bool inside; public Vector3 zero, pos; public float scale; public Quaternion rot; public Pif() { this.inside = false; this.zero = Vector3.zero; this.pos = Vector3.zero; this.scale = 0; this.rot = Quaternion.Euler( Random.Range(0, 4) * 90, Random.Range(0, 4) * 90, Random.Range(0, 4) * 90 ); } } Pif[] pifs = new Pif[32]; Matrix4x4[] matrices = new Matrix4x4[32]; void Eat(Vector3 pos) { Burst(pos, 0.5f); } public void Burst(Vector3 pos, float range = 0.25f, float scale = 1f) { for (int i = 0; i < pifs.Length; i++) { if (Random.value > 0.7f) { pifs[i].zero = pos; pifs[i].pos = pos + (new Vector3( Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f)) * range ); pifs[i].scale = Random.value * scale; pifs[i].inside = true; } } } public void Splash(Vector3 pos, Vector3 spread, float scale = 0.1f) { for (int i = 0; i < pifs.Length; i++) { if (Random.value > 0.9f) { pifs[i].zero = pos; pifs[i].pos = pos + new Vector3( Random.Range(-spread.x, spread.x), Random.Range(0, spread.y), Random.Range(-spread.z, spread.z)); pifs[i].scale = Random.value * scale; pifs[i].inside = false; } } } Vector3 oldFoodPos; public void Run(Main main) { if (oldFoodPos != main.food) { Burst(main.food, 0.1f, 0.5f); oldFoodPos = main.food; } for (int i = 0; i < pifs.Length; i++) { if (pifs[i] == null) { pifs[i] = new Pif(); } pifs[i].scale = Mathf.Clamp01(pifs[i].scale - pifs[i].scale * Time.deltaTime / 1); Vector3 toPos = pifs[i].pos + (pifs[i].pos - pifs[i].zero).normalized * 3 * pifs[i].scale * Time.deltaTime; toPos += Vector3.down * 0.3f * pifs[i].scale * Time.deltaTime; if (pifs[i].inside) { toPos.x = Mathf.Clamp(toPos.x, -main.design.bounds.x - 0.5f, main.design.bounds.x + 0.5f); toPos.y = Mathf.Clamp(toPos.y, -main.design.bounds.y - 0.5f, main.design.bounds.y + 0.5f); toPos.z = Mathf.Clamp(toPos.z, -main.design.bounds.z - 0.5f, main.design.bounds.z + 0.5f); } pifs[i].pos = toPos; matrices[i].SetTRS( pifs[i].pos, pifs[i].rot, pifs[i].scale * Vector3.one ); } Graphics.DrawMeshInstanced(data.poofMesh, 0, data.unlitMat, matrices); } }