protected void CheckInput() { if (Input.GetMouseButtonDown(0)) { var pos = Input.mousePosition / new float3(Screen.width, Screen.height, 1); pos.z = this.Is2D?0:0.5f; this.AddBox(pos, new float3(0.5f, 0.5f, this.Is2D?0:0.5f), this.type); } if (Input.GetKeyDown(KeyCode.C)) { this.parameter.activeNumberOfParticles.Value = 0; this.bufferParameter.particlesIndexBufferActive.Value.SetCounterValue(0); this.dispather.Dispatch("InitParticle", this.parameter.numberOfParticles.Value); } if (Input.GetKeyDown(KeyCode.E)) { this.type = Particle.Type.Elastic; } if (Input.GetKeyDown(KeyCode.S)) { this.type = Particle.Type.Snow; } if (Input.GetKeyDown(KeyCode.F)) { this.type = Particle.Type.Liquid; } }
/// <summary> /// 새 파티클 시스템을 추가합니다. /// 파티클 시스템은 한 번에 10개까지만 활성화될 수 있습니다. /// </summary> public static void AddParticleSystem( ParticleSystem.StartPosition startPosX, ParticleSystem.StartPosition startPosY, float velocityX, float velocityY, int lifetime, int createNumber, float createRange, ParticleSystem.CreateFunction createFunction, Particle.Type particleType, ParticleSystem.ParticleColor particleColor, float particleSize, int particleLifetime) { void particleSystemsRemoveAtZero(object[] args) { List <ParticleSystem> particleSystems_ = args[0] as List <ParticleSystem>; if (particleSystems_.Count > 10) { particleSystems_.RemoveAt(0); } } void particleSystemsAdd(object[] args) { List <ParticleSystem> particleSystems_ = args[0] as List <ParticleSystem>; ParticleSystem particleSystem_ = args[1] as ParticleSystem; particleSystems_.Add(particleSystem_); } // 한 번에 활성화되는 파티클 시스템 수를 10개로 제한 Util.TaskQueue.Add("particleSystems", particleSystemsRemoveAtZero, particleSystems); ParticleSystem ps = new ParticleSystem(startPosX, startPosY, velocityX, velocityY, lifetime, createNumber, createRange, createFunction, particleType, particleColor, particleSize, particleLifetime); Util.TaskQueue.Add("particleSystems", particleSystemsAdd, particleSystems, ps); }
protected void AddBox(float3 center, float3 size, Particle.Type type, float spacing = 1) { this.mpmParameter.newParticleBuffer.Value?.Release(); var pos = Tool.GenerateBox(center, size, spacing); this.mpmParameter.ptype.Value = (int)type; this.mpmParameter.newParticleBuffer.Value = new ComputeBuffer(pos.Count, Marshal.SizeOf <float3>()); this.parameter.activeNumberOfParticles.Value += pos.Count; this.mpmParameter.newParticleBuffer.Value.SetData(pos.ToArray()); this.dispather.Dispatch("AddParticles", pos.Count); }
public void GenerateParticle(Particle.Type type, Vector3 position) { //Get data string spawnType = Particle.sParticleTypeString[type]; ParticleConfig.Characteristics characteristics = _particleConfig.GetCharacteristics(type); //Spawn particle if (particlePool != null) { BaseParticle particle = particlePool.GetPooledObject(spawnType) as BaseParticle; particle.Init(characteristics, position); } }
public Characteristics GetCharacteristics(Particle.Type type) { if (_characteristicLookup.Count == 0) { InitCharacteristics(); } if (_characteristicLookup.ContainsKey(type)) { return(_characteristicLookup[type]); } else { Debug.LogError("No Characteristics found of particle type:" + type); return(null); } }
/// <summary> /// 새 파티클 시스템을 추가합니다. /// 파티클 시스템은 한 번에 5개까지만 활성화될 수 있습니다. /// </summary> public static void AddParticleSystem( float startPosX, float startPosY, float velocityX, float velocityY, int lifetime, int createNumber, float createRange, ParticleSystem.CreateFunction createFunction, Particle.Type particleType, Color particleColor, float particleSize, int particleLifetime) { // 한 번에 활성화되는 파티클 시스템 수를 5개로 제한 if (particleSystems.Count > 10) { particleSystems.RemoveAt(0); } ParticleSystem ps = new ParticleSystem(startPosX, startPosY, velocityX, velocityY, lifetime, createNumber, createRange, createFunction, particleType, particleColor, particleSize, particleLifetime); particleSystems.Add(ps); }
/// <summary> /// 기본 파티클 시스템에 새 파티클을 createNumber만큼 추가합니다. /// </summary> public void AddParticleInBasic(Particle.Type particleType, int particleLifetime, Color particleColor, float particleSize) { if (!isBasicParticleSystem) { return; } // 새 파티클 생성 for (int i = 0; i < createNumber; i++) { // 한 파티클 시스템 당 최대 파티클 개수 200개로 제한 if (particles.Count >= 200) { particles.RemoveAt(0); } ParticlePosition(out float posX, out float posY); particles.Add(new Particle(particleType, posX, posY, particleLifetime, particleColor, particleSize)); } }
private void InitCharacteristic(ParticleBlueprint[] particles) { int i = 0; int particleLength = particles.Length; for (i = 0; i < particleLength; i++) { ParticleBlueprint blueprint = particles[i]; Particle.Type type = blueprint.type; if (_characteristicLookup.ContainsKey(type)) { Debug.LogWarning("Multiple types: " + type + " added to " + name + " config"); } else { _characteristicLookup.Add(type, blueprint.characteristics); } } }
/// <summary> /// 테마에 맞는 기본 파티클 시스템을 생성합니다. /// 기본 파티클 시스템은 테마가 바뀔 때까지 사라지지 않고, 키보드 입력에 따라 파티클을 생성합니다. /// </summary> public ParticleSystem( int createNumber, float createRange, CreateFunction createFunction, Particle.Type particleType, Color particleColor, float particleSize, int particleLifetime) { //Random r = new Random(); this.positionX = 0; this.positionY = 0; this.velocityX = 0; this.velocityY = 0; this.lifetime = -1; this.createNumber = createNumber; this.createRange = createRange; this.createFunction = createFunction; this.particleType = particleType; this.particleColor = particleColor; this.particleSize = particleSize; this.particleLifetime = particleLifetime; this.isBasicParticleSystem = true; }
/// <summary> /// 새 파티클 시스템을 생성합니다. /// </summary> public ParticleSystem(float startPosX, float startPosY, float velocityX, float velocityY, int lifetime, int createNumber, float createRange, CreateFunction createFunction, Particle.Type particleType, Color particleColor, float particleSize, int particleLifetime) { //Random r = new Random(); this.positionX = startPosX;//(float)r.NextDouble() * (maxPosX - minPosX) + minPosX; this.positionY = startPosY; this.velocityX = velocityX; this.velocityY = velocityY; this.lifetime = lifetime; this.createNumber = createNumber; this.createRange = createRange; this.createFunction = createFunction; this.particleType = particleType; this.particleColor = particleColor; this.particleSize = particleSize; this.particleLifetime = particleLifetime; this.isBasicParticleSystem = false; }
protected void AddBox(float3 center, float3 size, Particle.Type type) { this.mpmParameter.newParticleBuffer.Value?.Release(); var spacing = this.spacingMap[type]; var dim = this.grid.Dim; var ssize = size * spacing; var pos = type == Particle.Type.Snow ? Tool.GenerateSphere(this.Is2D?500:3000, !this.Is2D) : Tool.GenerateBox(size * dim); for (var i = 0; i < pos.Count; ++i) { pos[i] = (center - ssize * 0.5f) * dim + pos[i] * dim * ssize; // Debug.Log(pos[i]); } this.mpmParameter.ptype.Value = (int)type; this.mpmParameter.newParticleBuffer.Value = new ComputeBuffer(pos.Count, Marshal.SizeOf <float3>()); this.parameter.activeNumberOfParticles.Value += pos.Count; this.mpmParameter.newParticleBuffer.Value.SetData(pos.ToArray()); this.dispather.Dispatch("AddParticles", pos.Count); }
/// <summary> /// 기본 파티클 시스템에 새 파티클을 createNumber만큼 추가합니다. /// </summary> public void AddParticleInBasic(Particle.Type particleType, int particleLifetime, Color particleColor, float particleSize) { if (!isBasicParticleSystem) { return; } //Console.WriteLine(particleType.ToString() + " " + particleLifetime); void particlesRemoveAtZero(object[] args) { List <Particle> particles_ = args[0] as List <Particle>; if (particles_.Count >= 200) { particles_.RemoveAt(0); } } void particlesAdd(object[] args) { List <Particle> particles_ = args[0] as List <Particle>; Particle particle_ = args[1] as Particle; particles_.Add(particle_); } // 새 파티클 생성 for (int i = 0; i < createNumber; i++) { // 한 파티클 시스템 당 최대 파티클 개수 200개로 제한 Util.TaskQueue.Add("particles", particlesRemoveAtZero, particles); ParticlePosition(out float posX, out float posY); Particle p = new Particle(particleType, posX, posY, particleLifetime, particleColor, particleSize); Util.TaskQueue.Add("particles", particlesAdd, particles, p); } }
protected Particle GenerateNewParticle(Texture2D texture, Vector2 position, Vector2 velocity, float angle, float angularVelocity, Vector4 color, float size, float ttl, float sizeVel, float alphaVel, Particle.Type type, BlendState state) // генерация новой частицы { Particle particle = new Particle(texture, position, velocity, angle, angularVelocity, color, size, ttl, sizeVel, alphaVel, type); particles.Add(particle); this.state = state; return(particle); }