protected override void Start() { base.Start(); ParticleSystemInstance = this.Create(ParticleEffect.gameObject); var particles = ParticleSystemInstance.FindComponents <ParticleSystem>(); float duration = 0; foreach (var particle in particles) { if (duration < particle.duration) { duration = particle.duration; } } var sounds = ParticleSystemInstance.FindComponents <AudioSource>(); foreach (var source in sounds) { if (duration < source.clip.length) { duration = source.clip.length; } } if (DestroyAfterPlay) { Destroy(ParticleSystemInstance, duration); Destroy(this, duration); } }
public override void Load(BinaryReader reader, int size) { long start_pos = reader.BaseStream.Position; DataSize = size; Header1 = reader.ReadUInt32(); // Some PTL files are "BinaryIntermediate" files if (Header1 == 0x616E6942) { ParticleInstanceCount = 0; ParticleTypeCount = 0; reader.BaseStream.Position = start_pos; Data = reader.ReadBytes(size); return; } //Default.rm has some pre-header data: 3x (texture ID + material ID) if (Header1 > 0xFF) { IsDefault = true; ParticleTextureID_1 = Header1; ParticleMaterialID_1 = reader.ReadUInt32(); ParticleTextureID_2 = reader.ReadUInt32(); ParticleMaterialID_2 = reader.ReadUInt32(); ParticleTextureID_3 = reader.ReadUInt32(); ParticleMaterialID_3 = reader.ReadUInt32(); Header1 = reader.ReadUInt32(); } ParticleTypeCount = reader.ReadUInt32(); ParticleTypes = new ParticleSystemDefinition[ParticleTypeCount]; // size 0x33C (0x330 if header is 0x1c) if (ParticleTypeCount > 0) { for (int i = 0; i < ParticleTypeCount; i++) { ParticleTypes[i] = new ParticleSystemDefinition(); string tempName = new string(reader.ReadChars(0x10)); ParticleTypes[i].Name = tempName.Replace('\0', ' '); int bufferSize = 0x320; if (Header1 == 0x1E) { bufferSize += 0xC; } ParticleTypes[i].Remain = reader.ReadBytes(bufferSize); } } uint InstanceCheck = reader.ReadUInt32(); ParticleInstanceCount = InstanceCheck; if (!IsDefault && ParticleInstanceCount > 0 && ParticleInstanceCount < 65536) { ParticleInstances = new List <ParticleSystemInstance>(); // size 0x44 for (int i = 0; i < ParticleInstanceCount; i++) { ParticleSystemInstance ParticleInstance = new ParticleSystemInstance(); ParticleInstance.Position = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); ParticleInstance.Rot_X = reader.ReadUInt16(); ParticleInstance.Rot_Y = reader.ReadUInt16(); ParticleInstance.Rot_Z = reader.ReadUInt16(); ParticleInstance.UnkZero = reader.ReadUInt32(); string tempName = new string(reader.ReadChars(0x10)); ParticleInstance.Name = tempName.Replace('\0', ' '); ParticleInstance.UnkShorts = new ushort[12]; for (int a = 0; a < ParticleInstance.UnkShorts.Length; a++) { ParticleInstance.UnkShorts[a] = reader.ReadUInt16(); } ParticleInstance.EndZero = reader.ReadUInt16(); ParticleInstances.Add(ParticleInstance); } } else { ParticleInstanceCount = 0; } // Default.rm has some extra data (decal stuff) if (IsDefault) { DecalTextureID = InstanceCheck; DecalMaterialID = reader.ReadUInt32(); } // todo: more data after this in default int RemainBytes = (int)((start_pos + size) - reader.BaseStream.Position); if (RemainBytes > 0) { Remain = reader.ReadBytes(RemainBytes); } else { Remain = new byte[0]; } }