// Update is called once per frame void Update() { ParticleSystem.Particle[] targetParticles; var nTargetParticles = target.GetParticles(out targetParticles); if (nTargetParticles <= 0) { return; } var points = targetParticles.Where((p, j) => j < nTargetParticles).Select(p => p.position).ToArray(); _knn.build(points, Enumerable.Range(0, points.Length).ToArray()); var startColor = target.shuriken.startColor; for (int i = 0; i < nTargetParticles; i++) { targetParticles[i].color = startColor; } foreach (var c in centers) { var targetIndices = _knn.knearest(c.pos.position, c.nFriends); var limit = targetIndices.Length; var skips = (int)(0.9f * limit); for (var i = 0; i < limit; i++) { var iTarget = targetIndices[i]; targetParticles[iTarget].color = c.color; } } target.SetParticles(targetParticles, nTargetParticles); }
// Update is called once per frame void Update() { ParticleSystem.Particle[] targetParticles; var nTargetParticles = target.GetParticles(out targetParticles); ParticleSystem.Particle[] modParticles; var nModParticles = modulator.GetParticles(out modParticles); if (nTargetParticles <= 0 || nModParticles <= 0) { return; } var points = targetParticles.Where((p, j) => j < nTargetParticles).Select(p => p.position).ToArray(); _targetKnn.build(points, Enumerable.Range(0, points.Length).ToArray()); var startColor = target.shuriken.startColor; for (var iTarget = 0; iTarget < nTargetParticles; iTarget++) { var color = targetParticles[iTarget].color; targetParticles[iTarget].color = new Color32( (byte)(color.r + 0.11f * startColor.r), (byte)(color.g + 0.11f * startColor.g), (byte)(color.b + 0.11f * startColor.b), (byte)(color.a + 0.11f * startColor.a)); } var sqrModRadius = modRadius * modRadius; for (int iMod = 0; iMod < nModParticles; iMod++) { var pMod = modParticles[iMod]; var targetIndices = _targetKnn.knearest(pMod.position, kNumber); var color = pMod.color; foreach (var iTarget in targetIndices) { var pTarget = targetParticles[iTarget]; if (sqrModRadius < (pTarget.position - pMod.position).sqrMagnitude) { continue; } pTarget.color = color; targetParticles[iTarget] = pTarget; } } target.SetParticles(targetParticles, nTargetParticles); }
// Update is called once per frame void Update() { ParticleSystem.Particle[] targetParticles; var nTargetParticles = target.GetParticles(out targetParticles); ParticleSystem.Particle[] modParticles; var nModParticles = modulator.GetParticles(out modParticles); if (nTargetParticles <= 0 || nModParticles <= 0) { return; } var points = modParticles.Where((p, j) => j < nModParticles).Select(p => p.position).ToArray(); _modulatorKnn.build(points, Enumerable.Range(0, points.Length).ToArray()); var sqrModRadius = modRadius * modRadius; for (int iTarget = 0; iTarget < nTargetParticles; iTarget++) { var pTarget = targetParticles[iTarget]; var modIndices = _modulatorKnn.knearest(pTarget.position, kNumber); var count = 0; var sumVelocity = Vector3.zero; foreach (var iMod in modIndices) { var pMod = modParticles[iMod]; if (sqrModRadius < (pTarget.position - pMod.position).sqrMagnitude) { continue; } sumVelocity += modParticles[iMod].velocity; count++; } #if true if (count == 0) { continue; } pTarget.velocity = (1f - modulation) * pTarget.velocity + modulation * sumVelocity / count; targetParticles[iTarget] = pTarget; #endif } target.SetParticles(targetParticles, nTargetParticles); }
// Update is called once per frame void Update() { ParticleSystem.Particle[] targetParticles; var nTargetParticles = target.GetParticles(out targetParticles); if (nTargetParticles <= 0) { return; } var points = targetParticles.Where((p, j) => j < nTargetParticles).Select(p => p.position).ToArray(); _knn.build(points, Enumerable.Range(0, points.Length).ToArray()); var sqrModRadius = modRadius * modRadius; for (int iMe = 0; iMe < nTargetParticles; iMe++) { var pMe = targetParticles[iMe]; var particleIndices = _knn.knearest(pMe.position, kNumber); var count = 0; var sumVelocity = Vector3.zero; foreach (var iNeighbor in particleIndices) { if (iMe == iNeighbor) { continue; } var pNeighbor = targetParticles[iNeighbor]; if (sqrModRadius < (pMe.position - pNeighbor.position).sqrMagnitude) { continue; } sumVelocity += pNeighbor.velocity; count++; } if (count == 0) { continue; } pMe.velocity = (1f - modulation) * pMe.velocity + (modulation / count) * sumVelocity; targetParticles[iMe] = pMe; } target.SetParticles(targetParticles, nTargetParticles); }