public void Add(Vector3 impactPosition, float maxIntensity, float radius, float maxLifeTime, float speed) { ShieldEffectNode node = null; if (nodes.Count < 16) { node = new ShieldEffectNode(); nodes.Add(node); } else { node = nodes.Find(x => x.free == true); } if (node != null) { node.pos = transform.InverseTransformPoint(impactPosition); node.maxRadius = radius; node.speed = speed; node.minRadius = 0.0f; node.t = 0; node.maxLifeTime = maxLifeTime; node.startIntensity = maxIntensity; } }
void Update() { Vector3 cam = Camera.main.transform.position; for (int m = 0; m < 4; m++) { for (int i = 0; i < 4; i++) { int n = m * 4 + i; if (nodes.Count >= n + 1) { ShieldEffectNode node = nodes[n]; if (!node.free) { node.Step(Time.deltaTime); _PositionMatrix.SetRow(i, new Vector4(node.pos.x, node.pos.y, node.pos.z, 1.0f)); _Radius[i] = node.radius; _Instensities[i] = node.intensity; } else { nodes.RemoveAt(i); _PositionMatrix.SetRow(i, new Vector4(cam.x, cam.y, cam.z, 1.0f)); _Radius[i] = 0.0f; _Instensities[i] = 0.0f; i--; } } else { _PositionMatrix.SetRow(i, new Vector4(cam.x, cam.y, cam.z, 1.0f)); _Instensities[i] = 0.0f; _Radius[i] = 0.0f; } meshR.material.SetMatrix("_Positions" + m, _PositionMatrix); meshR.material.SetVector("_Intensities" + m, _Instensities); meshR.material.SetVector("_Radius" + m, _Radius); } } transform.rotation = Quaternion.identity; }