/// <summary> /// Creates GameObject containing the particle system this effect needs. /// </summary> /// <param name="parent"></param> /// <returns></returns> public static EffectInfo CreateEffectObject(Transform parent) { ParticleEffect templateParticleEffect = VehicleEffectsMod.FindEffect("Factory Smoke Small") as ParticleEffect; if (gameObject != null) { Logging.LogWarning("Creating effect object for " + effectName + " but object already exists!"); } if (templateParticleEffect != null) { gameObject = new GameObject(effectName); gameObject.transform.parent = parent; // Configure particle system CustomMovementParticleEffect dieselSmoke = gameObject.AddComponent <CustomMovementParticleEffect>(); // Set custom properties dieselSmoke.m_canUseBezier = false; dieselSmoke.m_canUseMeshData = false; dieselSmoke.m_canUsePositions = true; dieselSmoke.m_maxVisibilityDistance = templateParticleEffect.m_maxVisibilityDistance; dieselSmoke.m_minSpawnAngle = templateParticleEffect.m_minSpawnAngle; dieselSmoke.m_useSimulationTime = templateParticleEffect.m_useSimulationTime; dieselSmoke.m_velocityMultiplier = 0.0f; dieselSmoke.m_spawnAreaRadius = 0.25f; dieselSmoke.ParticleSystemOverride = templateParticleEffect.gameObject.GetComponent <ParticleSystem>(); dieselSmoke.m_minMagnitude = 0.1f; dieselSmoke.m_magnitudeAccelerationMultiplier = 1.0f; dieselSmoke.m_magnitudeSpeedMultiplier = 0; dieselSmoke.m_maxStartSpeed = templateParticleEffect.m_maxStartSpeed + 0.5f; dieselSmoke.m_minStartSpeed = templateParticleEffect.m_minStartSpeed + 0.5f; dieselSmoke.m_maxLifeTime = templateParticleEffect.m_maxLifeTime; dieselSmoke.m_minLifeTime = templateParticleEffect.m_minLifeTime; dieselSmoke.m_maxSpawnAngle = 20.0f; return(dieselSmoke); } else { Logging.LogError("Could not find default effects used for " + effectName + "!"); return(null); } }
/// <summary> /// Creates GameObject containing the particle system this effect needs. /// </summary> /// <param name="parent"></param> /// <returns></returns> public static EffectInfo CreateEffectObject(Transform parent) { ParticleEffect templateParticleEffect = VehicleEffectsMod.FindEffect("Factory Steam") as ParticleEffect; MovementParticleEffect templateMovementEffect = VehicleEffectsMod.FindEffect("Gravel Dust") as MovementParticleEffect; if (gameObject != null) { Logging.LogWarning("Creating effect object for " + effectName + " but object already exists!"); } if (templateParticleEffect != null && templateMovementEffect != null) { // Load particle system from AssetBundle because we cannot access ParticleSystem modifiers from code. // The AssetBundle used contains a GameObject prefab with a ParticleSystem attached. The following modifiers are active: // Scale over time: scaling from ~7% to 100%. // Color over time: fade out near the end of the lifespan. // Velocity limit over time is active as well. Assembly asm = Assembly.GetAssembly(typeof(VehicleEffectsMod)); var pluginInfo = PluginManager.instance.FindPluginInfo(asm); GameObject obj = null; try { string absUri = "file:///" + pluginInfo.modPath.Replace("\\", "/") + "/AssetBundles/particlesystems"; WWW www = new WWW(absUri); AssetBundle bundle = www.assetBundle; Logging.Log("Bundle loading " + ((bundle == null) ? "failed " + www.error : "succeeded")); UnityEngine.Object a = bundle.LoadAsset("ParticleSystemSteam"); Logging.Log("Asset unpacking " + ((a == null) ? "failed " : "succeeded")); obj = GameObject.Instantiate(a) as GameObject; bundle.Unload(false); } catch (Exception e) { Logging.Log("Exception trying to load bundle file!" + e.ToString()); } if (obj != null) { obj.name = effectName; } else { obj = new GameObject(effectName); } obj.transform.parent = parent; // Configure particle system var particleSystem = templateParticleEffect.GetComponent <ParticleSystem>(); var particleRenderer = templateParticleEffect.GetComponent <ParticleSystemRenderer>(); var particleRendererMov = templateMovementEffect.GetComponent <ParticleSystemRenderer>(); var psCopy = obj.GetComponent <ParticleSystem>() ?? obj.AddComponent <ParticleSystem>(); psCopy.gravityModifier = 0.2f; psCopy.startSize = 8; psCopy.time = 0; psCopy.startSpeed = 10; psCopy.startRotation = 6.283185f; psCopy.startLifetime = 5; psCopy.startDelay = 0; psCopy.startColor = Color.white; psCopy.simulationSpace = ParticleSystemSimulationSpace.World; psCopy.randomSeed = 0; psCopy.playOnAwake = false; psCopy.playbackSpeed = 0; psCopy.maxParticles = 10000; psCopy.loop = true; psCopy.hideFlags = HideFlags.None; psCopy.enableEmission = true; psCopy.emissionRate = 10; var renderCopy = obj.GetComponent <ParticleSystemRenderer>(); renderCopy.cameraVelocityScale = 0; renderCopy.lengthScale = 2; renderCopy.maxParticleSize = 20.0f; renderCopy.mesh = null; renderCopy.probeAnchor = null; renderCopy.receiveShadows = true; renderCopy.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.BlendProbes; renderCopy.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; renderCopy.sharedMaterial = particleRenderer.sharedMaterial; renderCopy.useLightProbes = false; renderCopy.velocityScale = 0; renderCopy.enabled = true; renderCopy.hideFlags = HideFlags.None; renderCopy.lightmapIndex = -1; renderCopy.lightmapScaleOffset = new Vector4(1, 1, 0, 0); renderCopy.sortingLayerID = 0; renderCopy.sortingLayerName = "Default"; renderCopy.sortingOrder = 0; renderCopy.renderMode = ParticleSystemRenderMode.Billboard; CustomMovementParticleEffect vehicleSteam = obj.AddComponent <CustomMovementParticleEffect>(); // Set custom properties vehicleSteam.m_canUseBezier = false; vehicleSteam.m_canUseMeshData = false; vehicleSteam.m_canUsePositions = true; vehicleSteam.m_maxVisibilityDistance = 1800f; vehicleSteam.m_minSpawnAngle = templateParticleEffect.m_minSpawnAngle; vehicleSteam.m_useSimulationTime = templateParticleEffect.m_useSimulationTime; vehicleSteam.m_velocityMultiplier = 1.0f; vehicleSteam.m_spawnAreaRadius = 0.25f; vehicleSteam.m_minMagnitude = 0.2f; // Gives occasional puffs of smoke when standing still vehicleSteam.m_magnitudeAccelerationMultiplier = 10; vehicleSteam.m_magnitudeSpeedMultiplier = 20; vehicleSteam.m_maxStartSpeed = 1.7f; vehicleSteam.m_minStartSpeed = 1.5f; vehicleSteam.m_maxLifeTime = 1.3f; vehicleSteam.m_minLifeTime = 1.1f; vehicleSteam.m_maxSpawnAngle = 4.0f; gameObject = obj; return(vehicleSteam); } else { Logging.LogError("Could not find default effects used for Vehicle Steam Effect!"); return(null); } }