Пример #1
0
        public static Dictionary <ParticleSystem, int> EnforceParticleSystemLimits(GameObject currentAvatar)
        {
            Dictionary <ParticleSystem, int> particleSystems = new Dictionary <ParticleSystem, int>();

            foreach (ParticleSystem ps in currentAvatar.transform.GetComponentsInChildren <ParticleSystem>(true))
            {
                int realtime_max = ps_max_particles;

                // always limit collision force
                var collision = ps.collision;
                if (collision.colliderForce > ps_max_particle_force)
                {
                    collision.colliderForce = ps_max_particle_force;
                    Debug.LogError("Collision force is restricted on avatars, particle system named " + ps.gameObject.name + " collision force restricted to " + ps_max_particle_force);
                }

                if (ps_limiter_enabled)
                {
                    if (particleSystems.Count > ps_max_systems)
                    {
                        Debug.LogError("Too many particle systems, #" + particleSystems.Count + " named " + ps.gameObject.name + " deleted");
                        ValidationUtils.RemoveComponent(ps);
                        continue;
                    }
                    else
                    {
                        var main     = ps.main;
                        var emission = ps.emission;

                        ParticleSystemRenderer renderer = ps.GetComponent <ParticleSystemRenderer>();
                        if (renderer != null)
                        {
                            if (renderer.renderMode == ParticleSystemRenderMode.Mesh)
                            {
                                Mesh[] meshes      = new Mesh[0];
                                int    highestPoly = 0;
                                renderer.GetMeshes(meshes);
                                if (meshes.Length == 0 && renderer.mesh != null)
                                {
                                    meshes = new Mesh[] { renderer.mesh };
                                }
                                // Debug.Log(meshes.Length + " meshes possible emmited meshes from " + ps.gameObject.name);
                                foreach (Mesh m in meshes)
                                {
                                    if (m.isReadable)
                                    {
                                        if (m.triangles.Length / 3 > highestPoly)
                                        {
                                            highestPoly = m.triangles.Length / 3;
                                        }
                                    }
                                    else
                                    {
                                        if (1000 > highestPoly)
                                        {
                                            highestPoly = int.MaxValue;
                                        }
                                    }
                                }
                                if (highestPoly > 0)
                                {
                                    highestPoly  = Mathf.Clamp(highestPoly / ps_mesh_particle_divider, 1, highestPoly);
                                    realtime_max = Mathf.FloorToInt((float)realtime_max / highestPoly);

                                    if (highestPoly > ps_mesh_particle_poly_limit)
                                    {
                                        Debug.LogError("Particle system named " + ps.gameObject.name + " breached polygon limits, it has been deleted");
                                        ValidationUtils.RemoveComponent(ps);
                                        continue;
                                    }
                                }
                            }
                        }


                        ParticleSystem.MinMaxCurve rate = emission.rateOverTime;

                        if (rate.mode == ParticleSystemCurveMode.Constant)
                        {
                            rate.constant = Mathf.Clamp(rate.constant, 0, ps_max_emission);
                        }
                        else if (rate.mode == ParticleSystemCurveMode.TwoConstants)
                        {
                            rate.constantMax = Mathf.Clamp(rate.constantMax, 0, ps_max_emission);
                        }
                        else
                        {
                            rate.curveMultiplier = Mathf.Clamp(rate.curveMultiplier, 0, ps_max_emission);
                        }

                        emission.rateOverTime = rate;
                        rate = emission.rateOverDistance;

                        if (rate.mode == ParticleSystemCurveMode.Constant)
                        {
                            rate.constant = Mathf.Clamp(rate.constant, 0, ps_max_emission);
                        }
                        else if (rate.mode == ParticleSystemCurveMode.TwoConstants)
                        {
                            rate.constantMax = Mathf.Clamp(rate.constantMax, 0, ps_max_emission);
                        }
                        else
                        {
                            rate.curveMultiplier = Mathf.Clamp(rate.curveMultiplier, 0, ps_max_emission);
                        }

                        emission.rateOverDistance = rate;

                        //Disable collision with PlayerLocal layer
                        collision.collidesWith &= ~(1 << 10);
                    }
                }

                particleSystems.Add(ps, realtime_max);
            }

            EnforceRealtimeParticleSystemLimits(particleSystems, true, false);

            return(particleSystems);
        }
Пример #2
0
 private void Start()
 {
     _psRenderer = GetComponent <ParticleSystemRenderer>();
     _mat        = _psRenderer.material;
 }
Пример #3
0
 void Start()
 {
     psr = starParticles.GetComponent <ParticleSystemRenderer>();
 }
        private static void AnalyzeParticleSystemRenderers(IEnumerable <ParticleSystem> particleSystems, AvatarPerformanceStats perfStats)
        {
            int   particleSystemCount           = 0;
            ulong particleTotalCount            = 0;
            ulong particleTotalMaxMeshPolyCount = 0;
            bool  particleTrailsEnabled         = false;
            bool  particleCollisionEnabled      = false;
            int   materialSlots = 0;

            Profiler.BeginSample("AnalyzeParticleSystemRenderers");
            foreach (ParticleSystem particleSystem in particleSystems)
            {
                Profiler.BeginSample("Single Particle System");
                int particleCount = particleSystem.main.maxParticles;
                if (particleCount <= 0)
                {
                    Profiler.EndSample();
                    continue;
                }

                particleSystemCount++;
                particleTotalCount += (uint)particleCount;

                ParticleSystemRenderer particleSystemRenderer = particleSystem.GetComponent <ParticleSystemRenderer>();
                if (particleSystemRenderer == null)
                {
                    Profiler.EndSample();
                    continue;
                }

                materialSlots++;

                // mesh particles
                if (particleSystemRenderer.renderMode == ParticleSystemRenderMode.Mesh && particleSystemRenderer.meshCount > 0)
                {
                    uint highestPolyCount = 0;

                    Mesh[] meshes = new Mesh[particleSystemRenderer.meshCount];
                    int    particleRendererMeshCount = particleSystemRenderer.GetMeshes(meshes);
                    for (int meshIndex = 0; meshIndex < particleRendererMeshCount; meshIndex++)
                    {
                        Mesh mesh = meshes[meshIndex];
                        if (mesh == null)
                        {
                            continue;
                        }

                        uint polyCount = MeshUtils.GetMeshTriangleCount(mesh);
                        if (polyCount > highestPolyCount)
                        {
                            highestPolyCount = polyCount;
                        }
                    }

                    ulong maxMeshParticlePolyCount = (uint)particleCount * highestPolyCount;
                    particleTotalMaxMeshPolyCount += maxMeshParticlePolyCount;
                }

                if (particleSystem.trails.enabled)
                {
                    particleTrailsEnabled = true;
                    materialSlots++;
                }

                if (particleSystem.collision.enabled)
                {
                    particleCollisionEnabled = true;
                }

                Profiler.EndSample();
            }

            Profiler.EndSample();

            perfStats.particleSystemCount      = particleSystemCount;
            perfStats.particleTotalCount       = particleTotalCount > int.MaxValue ? int.MaxValue : (int)particleTotalCount;
            perfStats.particleMaxMeshPolyCount = particleTotalMaxMeshPolyCount > int.MaxValue ? int.MaxValue : (int)particleTotalMaxMeshPolyCount;
            perfStats.particleTrailsEnabled    = particleTrailsEnabled;
            perfStats.particleCollisionEnabled = particleCollisionEnabled;
            perfStats.materialCount            = perfStats.materialCount.GetValueOrDefault() + materialSlots;
        }
Пример #5
0
        private void DoVertexStreamsGUI(RenderMode renderMode)
        {
            ParticleSystemRenderer renderer = m_ParticleSystemUI.m_ParticleSystems[0].GetComponent <ParticleSystemRenderer>();

            // render list
            m_NumTexCoords         = 0;
            m_TexCoordChannelIndex = 0;
            m_NumInstancedStreams  = 0;
            m_HasTangent           = false;
            m_HasColor             = false;
            m_HasGPUInstancing     = (renderMode == RenderMode.Mesh) ? renderer.supportsMeshInstancing : false;
            m_VertexStreamsList.DoLayoutList();

            if (!m_ParticleSystemUI.multiEdit)
            {
                // error messages
                string errors = "";

                // check we have the same streams as the assigned shader
                if (m_Material != null)
                {
                    Material material = m_Material.objectReferenceValue as Material;
                    int      totalChannelCount = m_NumTexCoords * 4 + m_TexCoordChannelIndex;
                    bool     tangentError = false, colorError = false, uvError = false;
                    bool     anyErrors = ParticleSystem.CheckVertexStreamsMatchShader(m_HasTangent, m_HasColor, totalChannelCount, material, ref tangentError, ref colorError, ref uvError);
                    if (anyErrors)
                    {
                        errors += "Vertex streams do not match the shader inputs. Particle systems may not render correctly. Ensure your streams match and are used by the shader.";
                        if (tangentError)
                        {
                            errors += "\n- TANGENT stream does not match.";
                        }
                        if (colorError)
                        {
                            errors += "\n- COLOR stream does not match.";
                        }
                        if (uvError)
                        {
                            errors += "\n- TEXCOORD streams do not match.";
                        }
                    }
                }

                // check we aren't using too many texcoords
                int maxTexCoords = ParticleSystem.GetMaxTexCoordStreams();
                if (m_NumTexCoords > maxTexCoords || (m_NumTexCoords == maxTexCoords && m_TexCoordChannelIndex > 0))
                {
                    if (errors != "")
                    {
                        errors += "\n\n";
                    }
                    errors += "Only " + maxTexCoords + " TEXCOORD streams are supported.";
                }

                // check input meshes aren't using too many UV streams
                if (renderMode == RenderMode.Mesh)
                {
                    Mesh[] meshes    = new Mesh[k_MaxNumMeshes];
                    int    numMeshes = renderer.GetMeshes(meshes);
                    for (int i = 0; i < numMeshes; i++)
                    {
                        if (meshes[i].HasChannel(VertexAttribute.TexCoord2))
                        {
                            if (errors != "")
                            {
                                errors += "\n\n";
                            }
                            errors += "Meshes may only use a maximum of 2 input UV streams.";
                        }
                    }
                }

                if (errors != "")
                {
                    GUIContent warning = EditorGUIUtility.TextContent(errors);
                    EditorGUILayout.HelpBox(warning.text, MessageType.Error, true);
                }
            }
        }
Пример #6
0
    void ChangeParticleSystemMaterial(Material material)
    {
        ParticleSystemRenderer psr = GetComponent <ParticleSystemRenderer>();

        psr.material = material;
    }
Пример #7
0
    private IEnumerator TimeForAction()
    {
        if (actionStarted)
        {
            yield break;
        }

        actionStarted = true;

        string                 attackingElement = battleSM.performList[0].chosenAttack.attackName.ToUpper();
        bool                   showParticles    = true;
        ParticleSystem         elementParticles = gameObject.GetComponentInParent <ParticleSystem>();
        ParticleSystemRenderer elementRender    = elementParticles.GetComponent <ParticleSystemRenderer>();
        ParticleSystem         damageParticles  = elementDamage.GetComponentInParent <ParticleSystem>();
        ParticleSystemRenderer damageRender     = damageParticles.GetComponent <ParticleSystemRenderer>();

        switch (attackingElement)
        {
        case "WOOD":
            elementRender.material = new Material(Resources.Load <Material>("WoodParticle"));
            damageRender.material  = new Material(Resources.Load <Material>("WoodParticle"));
            break;

        case "FIRE":
            elementRender.material = new Material(Resources.Load <Material>("FireParticle"));
            damageRender.material  = new Material(Resources.Load <Material>("FireParticle"));
            break;

        case "EARTH":
            elementRender.material = new Material(Resources.Load <Material>("EarthParticle"));
            damageRender.material  = new Material(Resources.Load <Material>("EarthParticle"));
            break;

        case "METAL":
            elementRender.material = new Material(Resources.Load <Material>("MetalParticle"));
            damageRender.material  = new Material(Resources.Load <Material>("MetalParticle"));
            break;

        case "WATER":
            elementRender.material = new Material(Resources.Load <Material>("WaterParticle"));
            damageRender.material  = new Material(Resources.Load <Material>("WaterParticle"));
            break;

        default:
            showParticles = false;
            break;
        }

        //turn on particle effect
        if (showParticles)
        {
            elementParticles.Play();
            damageParticles.Stop();
            AudioClip enemyAttackAudio = (AudioClip)Resources.Load("audio/eq_hero_magic");
            battleSM.GetComponent <AudioSource>().PlayOneShot(enemyAttackAudio, 0.5f);
        }

        //animate the enemy near the target to attack
        Vector3 targetPosition = new Vector3(actionTarget.transform.position.x + 1.5f, actionTarget.transform.position.y, actionTarget.transform.position.z);

        while (MoveTowardsTarget(targetPosition))
        {
            yield return(null);
        }

        if (showParticles)
        {
            damageParticles.Play();
        }

        //wait
        yield return(new WaitForSeconds(0.6f));

        if (showParticles)
        {
            damageParticles.Stop();
        }

        //do damage
        DoDamage();

        //turn off particle effect
        if (showParticles)
        {
            elementParticles.Stop();
        }

        //animate back to start position
        Vector3 firstPosition = startPosition;

        while (MoveTowardsTarget(firstPosition))
        {
            yield return(null);
        }

        //remove this performer from the list in battleSM
        battleSM.performList.RemoveAt(0);

        //reset the battleSM
        if (battleSM.battleState != BattleStateMachine.PerformAction.WIN && battleSM.battleState != BattleStateMachine.PerformAction.LOSE)
        {
            battleSM.battleState = BattleStateMachine.PerformAction.WAIT;
            battleSM.UpdateTurnOrder();
            //reset this state
            float delayFactor = 5f - delayValue;
            currCooldown = Mathf.Clamp(delayFactor, 0, 4);
            currentState = TurnState.PROCESSING;
        }
        else
        {
            currentState = TurnState.WAITING;
        }

        //end coroutine
        actionStarted = false;
    }
        public static void ParsePointRendering(string[] values, ParticleSystemRenderer _renderer)
        {
            if (values.Length != 1) {
                ParseHelper.LogParserError("point_rendering", _renderer.Type, "Wrong number of parameters.");
                return;
            }

            BillboardParticleRenderer renderer = (BillboardParticleRenderer)_renderer;
            renderer.PointRenderingEnabled = StringConverter.ParseBool(values[0]);
        }
Пример #9
0
 // Use this for initialization
 void Awake()
 {
     characterMovement = GetComponent <CharacterMovement>();
     aura = GetComponent <ParticleSystemRenderer>();
 }
Пример #10
0
    public void UpdateParticleSystem()
    {
        ParticleSystem refSystem = referenceLine.GetComponent <ParticleSystem>();

        ParticleSystem.MainModule                 refSetting          = refSystem.main;
        ParticleSystem.EmissionModule             refEmission         = refSystem.emission;
        ParticleSystem.RotationOverLifetimeModule refRotationLifeTime = refSystem.rotationOverLifetime;
        ParticleSystem.SizeOverLifetimeModule     refSizeLifetime     = refSystem.sizeOverLifetime;
        ParticleSystemRenderer refRenderer = refSystem.GetComponent <ParticleSystemRenderer>();

        ParticleSystem.Burst refBurst = refEmission.GetBurst(0);

        foreach (Line line in triangleComplex.lines)
        {
            ParticleSystem                            particleSystem           = line.GetComponent <ParticleSystem>();
            ParticleSystem.MainModule                 particleSettings         = particleSystem.main;
            ParticleSystem.EmissionModule             particleEmission         = particleSystem.emission;
            ParticleSystem.RotationOverLifetimeModule particleRotationLifeTime = particleSystem.rotationOverLifetime;
            ParticleSystem.SizeOverLifetimeModule     particleSizeLifetime     = particleSystem.sizeOverLifetime;
            ParticleSystemRenderer                    particleRenderer         = particleSystem.GetComponent <ParticleSystemRenderer>();

            particleSettings.customSimulationSpace = refSetting.customSimulationSpace;
            particleSettings.duration                  = refSetting.duration;
            particleSettings.emitterVelocityMode       = refSetting.emitterVelocityMode;
            particleSettings.flipRotation              = refSetting.flipRotation;
            particleSettings.gravityModifier           = refSetting.gravityModifier;
            particleSettings.gravityModifierMultiplier = refSetting.gravityModifierMultiplier;
            particleSettings.loop                     = refSetting.loop;
            particleSettings.maxParticles             = refSetting.maxParticles;
            particleSettings.playOnAwake              = refSetting.playOnAwake;
            particleSettings.prewarm                  = refSetting.prewarm;
            particleSettings.scalingMode              = refSetting.scalingMode;
            particleSettings.simulationSpace          = refSetting.simulationSpace;
            particleSettings.simulationSpeed          = refSetting.simulationSpeed;
            particleSettings.startColor               = refSetting.startColor;
            particleSettings.startDelay               = refSetting.startDelay;
            particleSettings.startDelayMultiplier     = refSetting.startDelayMultiplier;
            particleSettings.startLifetime            = refSetting.startLifetime;
            particleSettings.startLifetimeMultiplier  = refSetting.startLifetimeMultiplier;
            particleSettings.startRotation            = refSetting.startRotation;
            particleSettings.startRotation3D          = refSetting.startRotation3D;
            particleSettings.startRotationMultiplier  = refSetting.startRotationMultiplier;
            particleSettings.startRotationX           = refSetting.startRotationX;
            particleSettings.startRotationXMultiplier = refSetting.startRotationXMultiplier;
            particleSettings.startRotationY           = refSetting.startRotationY;
            particleSettings.startRotationYMultiplier = refSetting.startRotationYMultiplier;
            particleSettings.startRotationZ           = refSetting.startRotationZ;
            particleSettings.startRotationZMultiplier = refSetting.startRotationZMultiplier;
            particleSettings.startSize                = refSetting.startSize;
            particleSettings.startSize3D              = refSetting.startSize3D;
            particleSettings.startSizeMultiplier      = refSetting.startSizeMultiplier;
            particleSettings.startSizeX               = refSetting.startSizeX;
            particleSettings.startSizeXMultiplier     = refSetting.startSizeXMultiplier;
            particleSettings.startSizeY               = refSetting.startSizeY;
            particleSettings.startSizeYMultiplier     = refSetting.startSizeYMultiplier;
            particleSettings.startSizeZ               = refSetting.startSizeZ;
            particleSettings.startSizeZMultiplier     = refSetting.startSizeZMultiplier;
            particleSettings.startSpeed               = refSetting.startSpeed;
            particleSettings.startSpeedMultiplier     = refSetting.startSpeedMultiplier;
            particleSettings.stopAction               = refSetting.stopAction;
            particleSettings.useUnscaledTime          = refSetting.useUnscaledTime;

            particleEmission.burstCount                 = refEmission.burstCount;
            particleEmission.enabled                    = refEmission.enabled;
            particleEmission.rateOverDistance           = refEmission.rateOverDistance;
            particleEmission.rateOverDistanceMultiplier = refEmission.rateOverDistanceMultiplier;
            particleEmission.rateOverTime               = refEmission.rateOverTime;
            particleEmission.rateOverTimeMultiplier     = refEmission.rateOverTimeMultiplier;

            particleRotationLifeTime.enabled      = refRotationLifeTime.enabled;
            particleRotationLifeTime.separateAxes = refRotationLifeTime.separateAxes;
            particleRotationLifeTime.x            = refRotationLifeTime.x;
            particleRotationLifeTime.xMultiplier  = refRotationLifeTime.xMultiplier;
            particleRotationLifeTime.y            = refRotationLifeTime.y;
            particleRotationLifeTime.yMultiplier  = refRotationLifeTime.yMultiplier;
            particleRotationLifeTime.z            = refRotationLifeTime.z;
            particleRotationLifeTime.zMultiplier  = refRotationLifeTime.zMultiplier;

            particleSizeLifetime.enabled        = refSizeLifetime.enabled;
            particleSizeLifetime.separateAxes   = refSizeLifetime.separateAxes;
            particleSizeLifetime.size           = refSizeLifetime.size;
            particleSizeLifetime.sizeMultiplier = refSizeLifetime.sizeMultiplier;
            particleSizeLifetime.x           = refSizeLifetime.x;
            particleSizeLifetime.xMultiplier = refSizeLifetime.xMultiplier;
            particleSizeLifetime.y           = refSizeLifetime.y;
            particleSizeLifetime.yMultiplier = refSizeLifetime.yMultiplier;
            particleSizeLifetime.z           = refSizeLifetime.z;
            particleSizeLifetime.zMultiplier = refSizeLifetime.zMultiplier;

            particleRenderer.minParticleSize = refRenderer.minParticleSize;

            particleEmission.SetBursts(new ParticleSystem.Burst[] { refBurst });
        }
    }
Пример #11
0
 // Start is called before the first frame update
 void Start()
 {
     light = GetComponent <Light>();
     particleSystemRenderer = GetComponent <ParticleSystemRenderer>();
     size = transform.localScale;
 }
        public void OnGUI(float width, bool fixedWidth)
        {
            bool isRepaintEvent = Event.current.type == EventType.Repaint;

            // Name of current emitter
            string selectedEmitterName = null;

            if (m_ParticleSystems.Length > 1)
            {
                selectedEmitterName = "Multiple Particle Systems";
            }
            else if (m_ParticleSystems.Length > 0)
            {
                selectedEmitterName = m_ParticleSystems[0].gameObject.name;
            }

            if (fixedWidth)
            {
                EditorGUIUtility.labelWidth = width * 0.4f;
                EditorGUILayout.BeginVertical(GUILayout.Width(width));
            }
            else
            {
                // First make sure labelWidth is at default width, then subtract
                EditorGUIUtility.labelWidth = 0;
                EditorGUIUtility.labelWidth = EditorGUIUtility.labelWidth - 4;

                EditorGUILayout.BeginVertical();
            }

            {
                InitialModuleUI initial = (InitialModuleUI)m_Modules[0];
                for (int i = 0; i < m_Modules.Length; ++i)
                {
                    ModuleUI module = m_Modules[i];
                    if (module == null)
                    {
                        continue;
                    }

                    bool initialModule = (module == m_Modules[0]);

                    // Skip if not visible (except initial module which should always be visible)
                    if (!module.visibleUI && !initialModule)
                    {
                        continue;
                    }

                    // Module header size
                    GUIContent headerLabel = new GUIContent();
                    Rect       moduleHeaderRect;
                    if (initialModule)
                    {
                        moduleHeaderRect = GUILayoutUtility.GetRect(width, 25);
                    }
                    else
                    {
                        moduleHeaderRect = GUILayoutUtility.GetRect(width, 15);
                    }

                    // Module content here to render it below the the header
                    if (module.foldout)
                    {
                        using (new EditorGUI.DisabledScope(!module.enabled))
                        {
                            Rect moduleSize = EditorGUILayout.BeginVertical(ParticleSystemStyles.Get().modulePadding);
                            {
                                moduleSize.y      -= 4; // pull background 'up' behind title to fill rounded corners.
                                moduleSize.height += 4;
                                GUI.Label(moduleSize, GUIContent.none, ParticleSystemStyles.Get().moduleBgStyle);
                                module.OnInspectorGUI(initial);
                            }
                            EditorGUILayout.EndVertical();
                        }
                    }

                    // TODO: Get Texture instead of static preview. Render Icon (below titlebar due to rounded corners)
                    if (initialModule)
                    {
                        // Get preview of material or mesh
                        ParticleSystemRenderer renderer = m_ParticleSystems[0].GetComponent <ParticleSystemRenderer>();
                        float iconSize = 21;
                        Rect  iconRect = new Rect(moduleHeaderRect.x + 4, moduleHeaderRect.y + 2, iconSize, iconSize);

                        if (isRepaintEvent && renderer != null)
                        {
                            bool iconRendered = false;
                            int  instanceID   = 0;

                            if (!multiEdit)
                            {
                                if (renderer.renderMode == ParticleSystemRenderMode.Mesh)
                                {
                                    if (renderer.mesh != null)
                                    {
                                        instanceID = renderer.mesh.GetInstanceID();
                                    }
                                }
                                else if (renderer.sharedMaterial != null)
                                {
                                    instanceID = renderer.sharedMaterial.GetInstanceID();
                                }

                                // If the asset is dirty we ensure to get a updated one by clearing cache of temporary previews
                                if (EditorUtility.IsDirty(instanceID))
                                {
                                    AssetPreview.ClearTemporaryAssetPreviews();
                                }

                                if (instanceID != 0)
                                {
                                    Texture2D icon = AssetPreview.GetAssetPreview(instanceID);
                                    if (icon != null)
                                    {
                                        GUI.DrawTexture(iconRect, icon, ScaleMode.StretchToFill, true);
                                        iconRendered = true;
                                    }
                                }
                            }

                            // Fill so we do not see the background when we have no icon (eg multi-edit)
                            if (!iconRendered)
                            {
                                GUI.Label(iconRect, GUIContent.none, ParticleSystemStyles.Get().moduleBgStyle);
                            }
                        }

                        // Select gameObject when clicking on icon
                        if (!multiEdit && EditorGUI.DropdownButton(iconRect, GUIContent.none, FocusType.Passive, GUIStyle.none))
                        {
                            // Toggle selected particle system from selection
                            if (EditorGUI.actionKey)
                            {
                                List <int> newSelection = new List <int>();
                                int        instanceID   = m_ParticleSystems[0].gameObject.GetInstanceID();
                                newSelection.AddRange(Selection.instanceIDs);
                                if (!newSelection.Contains(instanceID) || newSelection.Count != 1)
                                {
                                    if (newSelection.Contains(instanceID))
                                    {
                                        newSelection.Remove(instanceID);
                                    }
                                    else
                                    {
                                        newSelection.Add(instanceID);
                                    }
                                }

                                Selection.instanceIDs = newSelection.ToArray();
                            }
                            else
                            {
                                Selection.instanceIDs      = new int[0];
                                Selection.activeInstanceID = m_ParticleSystems[0].gameObject.GetInstanceID();
                            }
                        }
                    }

                    // Button logic for enabledness (see below for UI)
                    Rect checkMarkRect = new Rect(moduleHeaderRect.x + 2, moduleHeaderRect.y + 1, 13, 13);
                    if (!initialModule && GUI.Button(checkMarkRect, GUIContent.none, GUIStyle.none))
                    {
                        module.enabled = !module.enabled;
                    }

                    // Button logic for plus/minus (see below for UI)
                    Rect plusRect         = new Rect(moduleHeaderRect.x + moduleHeaderRect.width - 10, moduleHeaderRect.y + moduleHeaderRect.height - 10, 10, 10);
                    Rect plusRectInteract = new Rect(plusRect.x - 4, plusRect.y - 4, plusRect.width + 4, plusRect.height + 4);
                    Rect infoRect         = new Rect(plusRect.x - 23, plusRect.y - 8, 20, 20);

                    if (initialModule && EditorGUI.DropdownButton(plusRectInteract, s_Texts.addModules, FocusType.Passive, GUIStyle.none))
                    {
                        ShowAddModuleMenu();
                    }

                    // Module header (last to become top most renderered)
                    if (!string.IsNullOrEmpty(selectedEmitterName))
                    {
                        headerLabel.text = initialModule ? selectedEmitterName : module.displayName;
                    }
                    else
                    {
                        headerLabel.text = module.displayName;
                    }
                    headerLabel.tooltip = module.toolTip;

                    bool newToggleState = module.DrawHeader(moduleHeaderRect, headerLabel);

                    if (newToggleState != module.foldout)
                    {
                        switch (Event.current.button)
                        {
                        case 0:
                            bool newFoldoutState = !module.foldout;
                            if (Event.current.control)
                            {
                                foreach (var moduleUi in m_Modules)
                                {
                                    if (moduleUi != null && moduleUi.visibleUI)
                                    {
                                        moduleUi.foldout = newFoldoutState;
                                    }
                                }
                            }
                            else
                            {
                                module.foldout = newFoldoutState;
                            }
                            break;

                        case 1:
                            if (initialModule)
                            {
                                ShowEmitterMenu();
                            }
                            else
                            {
                                ShowModuleMenu(i);
                            }
                            break;
                        }
                    }

                    // Render checkmark on top (logic: see above)
                    if (!initialModule)
                    {
                        EditorGUI.showMixedValue = module.enabledHasMultipleDifferentValues;
                        GUIStyle style = EditorGUI.showMixedValue ? ParticleSystemStyles.Get().checkmarkMixed : ParticleSystemStyles.Get().checkmark;
                        GUI.Toggle(checkMarkRect, module.enabled, GUIContent.none, style);
                        EditorGUI.showMixedValue = false;
                    }

                    // Render plus/minus on top
                    if (isRepaintEvent && initialModule)
                    {
                        GUI.Label(plusRect, GUIContent.none, ParticleSystemStyles.Get().plus);
                    }

                    if (initialModule && !string.IsNullOrEmpty(m_SupportsCullingTextLabel))
                    {
                        var supportsCullingText = new GUIContent("", ParticleSystemStyles.Get().warningIcon, m_SupportsCullingTextLabel);
                        GUI.Label(infoRect, supportsCullingText);
                    }

                    GUILayout.Space(1); // dist to next module
                } // foreach module
                GUILayout.Space(-1);
            }
            EditorGUILayout.EndVertical(); // end fixed moduleWidth

            // Apply the property, handle undo
            ApplyProperties();
        }
Пример #13
0
        private static Object ReadAsset(AssetStream stream, AssetInfo assetInfo, long offset, int size)
        {
            Object asset;

            switch (assetInfo.ClassID)
            {
            case ClassIDType.GameObject:
                asset = new GameObject(assetInfo);
                break;

            case ClassIDType.Transform:
                asset = new Transform(assetInfo);
                break;

            case ClassIDType.Camera:
                asset = new Camera(assetInfo);
                break;

            case ClassIDType.Material:
                asset = new Material(assetInfo);
                break;

            case ClassIDType.MeshRenderer:
                asset = new MeshRenderer(assetInfo);
                break;

            case ClassIDType.Texture2D:
                asset = new Texture2D(assetInfo);
                break;

            case ClassIDType.SceneSettings:
                asset = new OcclusionCullingSettings(assetInfo);
                break;

            case ClassIDType.MeshFilter:
                asset = new MeshFilter(assetInfo);
                break;

            case ClassIDType.OcclusionPortal:
                asset = new OcclusionPortal(assetInfo);
                break;

            case ClassIDType.Mesh:
                asset = new Mesh(assetInfo);
                break;

            case ClassIDType.Shader:
                asset = new Shader(assetInfo);
                break;

            case ClassIDType.TextAsset:
                asset = new TextAsset(assetInfo);
                break;

            case ClassIDType.Rigidbody2D:
                asset = new Rigidbody2D(assetInfo);
                break;

            case ClassIDType.Rigidbody:
                asset = new Rigidbody(assetInfo);
                break;

            case ClassIDType.CircleCollider2D:
                asset = new CircleCollider2D(assetInfo);
                break;

            case ClassIDType.PolygonCollider2D:
                asset = new PolygonCollider2D(assetInfo);
                break;

            case ClassIDType.BoxCollider2D:
                asset = new BoxCollider2D(assetInfo);
                break;

            case ClassIDType.PhysicsMaterial2D:
                asset = new PhysicsMaterial2D(assetInfo);
                break;

            case ClassIDType.MeshCollider:
                asset = new MeshCollider(assetInfo);
                break;

            case ClassIDType.BoxCollider:
                asset = new BoxCollider(assetInfo);
                break;

            case ClassIDType.SpriteCollider2D:
                asset = new CompositeCollider2D(assetInfo);
                break;

            case ClassIDType.EdgeCollider2D:
                asset = new EdgeCollider2D(assetInfo);
                break;

            case ClassIDType.CapsuleCollider2D:
                asset = new CapsuleCollider2D(assetInfo);
                break;

            case ClassIDType.AnimationClip:
                asset = new AnimationClip(assetInfo);
                break;

            case ClassIDType.AudioListener:
                asset = new AudioListener(assetInfo);
                break;

            case ClassIDType.AudioSource:
                asset = new AudioSource(assetInfo);
                break;

            case ClassIDType.AudioClip:
                asset = new AudioClip(assetInfo);
                break;

            case ClassIDType.RenderTexture:
                asset = new RenderTexture(assetInfo);
                break;

            case ClassIDType.Cubemap:
                asset = new Cubemap(assetInfo);
                break;

            case ClassIDType.Avatar:
                asset = new Avatar(assetInfo);
                break;

            case ClassIDType.AnimatorController:
                asset = new AnimatorController(assetInfo);
                break;

            case ClassIDType.GUILayer:
                asset = new GUILayer(assetInfo);
                break;

            case ClassIDType.Animator:
                asset = new Animator(assetInfo);
                break;

            case ClassIDType.RenderSettings:
                asset = new RenderSettings(assetInfo);
                break;

            case ClassIDType.Light:
                asset = new Light(assetInfo);
                break;

            case ClassIDType.Animation:
                asset = new Animation(assetInfo);
                break;

            case ClassIDType.MonoScript:
                asset = new MonoScript(assetInfo);
                break;

            case ClassIDType.NewAnimationTrack:
                asset = new NewAnimationTrack(assetInfo);
                break;

            case ClassIDType.FlareLayer:
                asset = new FlareLayer(assetInfo);
                break;

            case ClassIDType.Font:
                asset = new Font(assetInfo);
                break;

            case ClassIDType.PhysicMaterial:
                asset = new PhysicMaterial(assetInfo);
                break;

            case ClassIDType.SphereCollider:
                asset = new SphereCollider(assetInfo);
                break;

            case ClassIDType.CapsuleCollider:
                asset = new CapsuleCollider(assetInfo);
                break;

            case ClassIDType.SkinnedMeshRenderer:
                asset = new SkinnedMeshRenderer(assetInfo);
                break;

            case ClassIDType.BuildSettings:
                asset = new BuildSettings(assetInfo);
                break;

            case ClassIDType.AssetBundle:
                asset = new AssetBundle(assetInfo);
                break;

            case ClassIDType.WheelCollider:
                asset = new WheelCollider(assetInfo);
                break;

            case ClassIDType.MovieTexture:
                asset = new MovieTexture(assetInfo);
                break;

            case ClassIDType.TerrainCollider:
                asset = new TerrainCollider(assetInfo);
                break;

            case ClassIDType.TerrainData:
                asset = new TerrainData(assetInfo);
                break;

            case ClassIDType.LightmapSettings:
                asset = new LightmapSettings(assetInfo);
                break;

            case ClassIDType.OcclusionArea:
                asset = new OcclusionArea(assetInfo);
                break;

            case ClassIDType.NavMeshSettings:
                asset = new NavMeshSettings(assetInfo);
                break;

            case ClassIDType.ParticleSystem:
                asset = new ParticleSystem(assetInfo);
                break;

            case ClassIDType.ParticleSystemRenderer:
                asset = new ParticleSystemRenderer(assetInfo);
                break;

            case ClassIDType.SpriteRenderer:
                asset = new SpriteRenderer(assetInfo);
                break;

            case ClassIDType.Sprite:
                asset = new Sprite(assetInfo);
                break;

            case ClassIDType.Terrain:
                asset = new Terrain(assetInfo);
                break;

            case ClassIDType.AnimatorOverrideController:
                asset = new AnimatorOverrideController(assetInfo);
                break;

            case ClassIDType.CanvasRenderer:
                asset = new CanvasRenderer(assetInfo);
                break;

            case ClassIDType.Canvas:
                asset = new Canvas(assetInfo);
                break;

            case ClassIDType.RectTransform:
                asset = new RectTransform(assetInfo);
                break;

            case ClassIDType.NavMeshData:
                asset = new NavMeshData(assetInfo);
                break;

            case ClassIDType.OcclusionCullingData:
                asset = new OcclusionCullingData(assetInfo);
                break;

            case ClassIDType.SceneAsset:
                asset = new SceneAsset(assetInfo);
                break;

            case ClassIDType.LightmapParameters:
                asset = new LightmapParameters(assetInfo);
                break;

            case ClassIDType.SpriteAtlas:
                asset = new SpriteAtlas(assetInfo);
                break;

            default:
                return(null);
            }

            stream.BaseStream.Position = offset;
            if (Config.IsGenerateGUIDByContent)
            {
                byte[] data = stream.ReadBytes(size);
                asset.Read(data);

                using (MD5 md5 = MD5.Create())
                {
                    byte[] md5Hash = md5.ComputeHash(data);
                    assetInfo.GUID = new UtinyGUID(md5Hash);
                }
            }
            else
            {
                stream.AlignPosition = offset;
                asset.Read(stream);
                long read = stream.BaseStream.Position - offset;
                if (read != size)
                {
                    throw new Exception($"Read {read} but expected {size} for object {asset.GetType().Name}");
                }
            }
            return(asset);
        }
        public static void ParseAccurateFacing(string[] values, ParticleSystemRenderer _renderer)
        {
            if (values.Length != 1) {
                ParseHelper.LogParserError("accurate_facing", _renderer.Type, "Wrong number of parameters.");
                return;
            }

            BillboardParticleRenderer renderer = (BillboardParticleRenderer)_renderer;
            renderer.UseAccurateFacing = StringConverter.ParseBool(values[0]);
        }
    public void Play()
    {
        effectState = EffectState.PLAYING;

        if (audioSource != null)
        {
            if (randomizePitch)
            {
                audioSource.pitch = Random.Range(pitchMin, pitchMax);
            }
            else if (pitchChangeOverTime)
            {
                float pitchSpread  = (pitchMax - pitchMin);
                float smoothSpread = pitchSpread * 2 - pitchSpread;
                float pitchAdjust  = 0;
                if (smoothSpread != 0)
                {
                    pitchAdjust = Time.time % smoothSpread;
                }
                audioSource.pitch = pitchMin + pitchAdjust;
            }

            if (randomizeClip)
            {
                audioSource.clip = audioClips.PickRandom();
            }
            else if (audioSource.clip == null && audioClips.Count > 0)
            {
                audioSource.clip = audioClips[0];
            }

            if (audioSource != null && audioSource.clip != null)
            {
                lifetime = audioSource.clip.length;
                audioSource.Play();
            }
        }

        if (lightGlow != null)
        {
            lifetime = Mathf.Max(lifetime, lightGlow.Duration);
            lightGlow.Play();
        }

        foreach (ParticleSystem particleSystem in particleSystems)
        {
            if (particleSystem != null)
            {
                ParticleSystemRenderer particleRenderer = particleSystem.GetComponent <ParticleSystemRenderer>();
                if (particleRenderer != null)
                {
                    particleRenderers.Add(particleRenderer);
                }

                float particleSystemDuration = particleSystem.main.duration;
                lifetime = Mathf.Max(lifetime, particleSystemDuration);

                particleSystem.Play();
            }
        }

        if (cameraShake != null)
        {
            cameraShake.Shake();
        }

        if (color != Color.black)
        {
            if (useColor)
            {
                EffectColor = color;
            }
        }

        if (!loop)
        {
            if (destroyAfterComplete)
            {
                gameObject.BlowUp(lifetime);
            }
            else
            {
                StartCoroutine(PlayComplete(lifetime));
            }
        }
        else
        {
            if (loopCount > 0)
            {
                lifetime *= loopCount;
                StartCoroutine(PlayComplete(lifetime));
            }

            if (loopTime != 0)
            {
                lifetime = loopTime;
                StartCoroutine(PlayComplete(lifetime));
            }
        }
    }
 public static void ParseCommonUpDirection(string[] values, ParticleSystemRenderer _renderer)
 {
     if (values.Length != 3) {
         ParseHelper.LogParserError("common_up_vector", _renderer.Type, "Wrong number of parameters.");
         return;
     }
     BillboardParticleRenderer renderer = (BillboardParticleRenderer)_renderer;
     renderer.CommonUpVector = StringConverter.ParseVector3(values);
 }
Пример #17
0
 void Start()
 {
     _particles = GetComponent <ParticleSystemRenderer> ();
     _particles.sortingLayerName = LayerName;
 }
 /// @copydoc FactoryObj::destroyInstance
 public override void DestroyInstance(ParticleSystemRenderer inst)
 {
 }
Пример #19
0
        private IEnumerator Shoot(int index)
        {
            GameObject go = new GameObject {
                transform = { position = transform.position + Vector3.up * 13 }
            };

            go.transform.LookAt(Direction);
            int dmg = Random.Range(30, 40);

            switch (ModSettings.difficulty)
            {
            case ModSettings.Difficulty.Veteran:
                dmg = Random.Range(85, 105);
                break;

            case ModSettings.Difficulty.Elite:
                dmg = Random.Range(221, 234);
                break;

            case ModSettings.Difficulty.Master:
                dmg = Random.Range(444, 470);
                break;

            case ModSettings.Difficulty.Challenge1:
                dmg = 4124;
                break;

            case ModSettings.Difficulty.Challenge2:
                dmg = 15653;
                break;

            case ModSettings.Difficulty.Challenge3:
                dmg = 72346;
                break;

            case ModSettings.Difficulty.Challenge4:
                dmg = 85932;
                break;

            case ModSettings.Difficulty.Challenge5:
                dmg = 124636;
                break;

            case ModSettings.Difficulty.Challenge6:
                dmg = 164636;
                break;

            case ModSettings.Difficulty.Hell:
                dmg = 224636;
                break;
            }
            go.AddComponent <EnemyLaserBeam>().Initialize(dmg);
            ParticleSystem         ps   = go.AddComponent <ParticleSystem>();
            ParticleSystemRenderer rend = go.GetComponent <ParticleSystemRenderer>();

            rend.renderMode    = ParticleSystemRenderMode.Billboard;
            rend.trailMaterial = mat1;
            rend.alignment     = ParticleSystemRenderSpace.View;
            rend.material      = mat1;

            ParticleSystem.ShapeModule shape = ps.shape;
            shape.enabled = false;
            ParticleSystem.MainModule m = ps.main;
            m.simulationSpace = ParticleSystemSimulationSpace.Local;
            m.startSpeed      = 100;
            m.startLifetime   = 0.5f;
            m.startSize       = 0.1f;
            yield return(null);

            ParticleSystem.EmissionModule e = ps.emission;
            e.rateOverTime = 10f;
            ParticleSystem.SizeOverLifetimeModule sol = ps.sizeOverLifetime;
            sol.enabled        = true;
            sol.sizeMultiplier = 3;
            sol.size           = new ParticleSystem.MinMaxCurve(20, new AnimationCurve(new Keyframe[] { new Keyframe(0f, 0f, 11.34533f, 11.34533f), new Keyframe(0.1365601f, 1f, 0.4060947f, 0.4060947f), new Keyframe(1f, 0.2881376f, -0.8223371f, -0.8223371f) }));
            yield return(null);

            ParticleSystem.TrailModule trail = ps.trails;
            trail.enabled              = true;
            trail.dieWithParticles     = false;
            trail.inheritParticleColor = true;
            trail.ratio       = 0.5f;
            trail.textureMode = ParticleSystemTrailTextureMode.Stretch;
            float time = 0;

            while (time < 8)
            {
                time += Time.deltaTime;
                if (index != 0)
                {
                    float mult = index % 2 == 0 ? 1 : -1;
                    go.transform.Rotate(Vector3.up * Time.deltaTime * 100 * mult, Space.World);
                    go.transform.Rotate(go.transform.right * Time.deltaTime * 40 * Mathf.Sin(time * 6), Space.World);
                }
                yield return(null);
            }
            Destroy(go);
        }
 // Use this for initialization
 void Start()
 {
     particleSys = GetComponent <ParticleSystemRenderer>();
     rb          = GetComponent <Rigidbody2D>();
 }
Пример #21
0
    // Update is called once per frame
    void Update()
    {
        //Manage health bar.
        float divider = 0.0033f;

        Game.manager.GetComponent <GameManager>().BossHealthBar(health, divider);
        if (health < 0)
        {
            health = 0;
        }                               //You can't go negative health!

        //Set proper parent.
        transform.parent = Game.enemyHolder.transform;

        //Flash me when I'm hit.
        if (hitCounter > 0f)
        {
            hitCounter -= Time.deltaTime;
            targetColor = Game.bulletColor;
        }
        else
        {
            targetColor = Game.frontColor;
        }
        float smoothness = 5f;

        if (puppetToColor != null)
        {
            puppetToColor.GetComponent <MeshRenderer>().material.color = Color.Lerp(puppetToColor.GetComponent <MeshRenderer>().material.color, targetColor, smoothness * Time.deltaTime);
        }

        if (Game.manager.GetComponent <GameManager>().splashCounter <= 0 && !dead)
        {
            //Transition phase.
            if (p == Phase.ComingIn)
            {
                //Keep hitbox disabled.
                hitBox.enabled = false;

                //Enable introPoofEffect.
                introPoofEffect.SetActive(true);

                //Setting animation frames.
                anim.framesOffset[0] = Vector2.zero;
                anim.framesOffset[1] = new Vector2(0.2f, 0f);

                //Subtract the amount of time needed for the introduction scene.
                introWait -= Time.deltaTime;

                //Set the Form 1 and 2 puppet to be active when there are 1.9 seconds left in the intro.
                bool active = (introWait <= 1.9f);
                form1And2Holder.SetActive(active);

                //When the intro cutscene is over, go to Phase 1!
                if (introWait <= 0f)
                {
                    PlaySound.NoLoop(giggleSnd);
                    p = Phase.Phase1;
                }
            }
            else if (p == Phase.Phase1)   //Phase 1!

            //When to get rid of love text.
            {
                if (textAwayTime > 0)
                {
                    textAwayTime -= Time.deltaTime;
                }
                else
                {
                    if (!triggeredTextTween)
                    {
                        iTween.ScaleTo(textObj, iTween.Hash(
                                           "x", 0f, "y", 0f, "z", 1f,
                                           "time", 1f,
                                           "easetype", iTween.EaseType.easeInOutSine,
                                           "looptype", iTween.LoopType.none
                                           ));
                        triggeredTextTween = true;
                    }
                }

                //Kill the poof effect object, it is no longer needed.
                if (introPoofEffect != null)
                {
                    Destroy(introPoofEffect);
                }

                //Keep hitbox enabled and set it's params.
                hitBox.enabled = true;
                hitBox.size    = new Vector2(3.5f, 1.6f);
                hitBox.offset  = new Vector2(0f, -0.1f);

                //Setting animation frames.
                anim.framesOffset[0] = Vector2.zero;
                anim.framesOffset[1] = new Vector2(0.1f, 0f);

                //Setting the puppet to Color when being hit.
                puppetToColor = form1Puppet;

                //Spawning the hearts.
                heartSpawnCounter -= Time.deltaTime;
                if (heartSpawnCounter <= 0)
                {
                    PlaySound.NoLoop(smooches[Random.Range(0, smooches.Length)]);
                    Instantiate(attacks[0], new Vector3(transform.position.x, transform.position.y, 25), Quaternion.identity);
                    heartSpawnCounter = heartSpawnTime;
                }

                //When to go to phase 2.
                if (health < 250)
                {
                    PlaySound.NoLoop(sadSnd);
                    GoPhaseTwo();
                }
            }
            else if (p == Phase.Phase2)
            {
                //Keep hitbox enabled and set it's params.
                hitBox.enabled = true;
                hitBox.size    = new Vector2(3.5f, 1.6f);
                hitBox.offset  = new Vector2(0f, -0.1f);

                //Setting animation frames.
                anim.framesOffset[0] = new Vector2(0.3f, 0f);
                anim.framesOffset[1] = new Vector2(0.4f, 0f);

                //Lightning spawning.
                lightingSpawnCounter -= Time.deltaTime;
                if (lightingSpawnCounter <= 0)
                {
                    float x = Random.Range(-32f, 32f);
                    Instantiate(attacks[1], new Vector3(x, 0, 0), Quaternion.identity);
                    lightingSpawnCounter = lightingSpawnTime;
                }

                //When to start transition phase.
                if (health < 150)
                {
                    health = 149;
                    p      = Phase.Transition1;
                }
            }
            else if (p == Phase.Transition1)   //Transition to phase 3!
            //Disable the hitbox when transforming, also enable form 3 puppet.
            {
                hitBox.enabled = false;
                form3Puppet.SetActive(true);

                //Waiting to open the mouth.
                openMouthWait -= Time.deltaTime;
                if (openMouthWait > 0)
                { //Keep mouth closed until wait time is over.
                    anim.framesOffset[0] = new Vector2(0.5f, 0f);
                    anim.framesOffset[1] = new Vector2(0.6f, 0f);
                }
                else
                {
                    //Play open mouth frames.
                    anim.framesOffset[0] = new Vector2(0.7f, 0f);
                    anim.framesOffset[1] = new Vector2(0.8f, 0f);
                }

                //Updating scale of the form 3 puppet to come out of the mouth!
                if (openMouthWait > -2)
                {
                    puppet3TargetScale = new Vector3(0, 0, 1);
                }
                else
                {
                    puppet3TargetScale = new Vector3(15, 15, 1);
                }
                float smuth = 3f;
                form3Puppet.transform.localScale = Vector3.Lerp(form3Puppet.transform.localScale, puppet3TargetScale, smuth * Time.deltaTime);

                //Animate the form3puppet a bit.
                if (openMouthWait > -4f)
                {
                    frame = Vector2.zero;
                }
                else if (openMouthWait < -4f && openMouthWait > -5f)
                {
                    frame = new Vector2(0.2f, 0f);
                }
                else if (openMouthWait < -5f && openMouthWait > -6f)
                {
                    frame = new Vector2(0.4f, 0f);
                }
                else if (openMouthWait < -6f && openMouthWait > -6.25f)
                {
                    frame = new Vector2(0.2f, 0f);
                }
                else if (openMouthWait < -6.25f && openMouthWait > -6.5f)
                {
                    frame = new Vector2(0.4f, 0f);
                }
                else if (openMouthWait < -6.5f && openMouthWait > -6.75f)
                {
                    frame = new Vector2(0.2f, 0f);
                }
                else if (openMouthWait < -7f)
                {
                    frame = new Vector2(0.4f, 0f);
                }
                form3Puppet.GetComponent <MeshRenderer>().material.mainTextureOffset = frame;

                //Go to form 3!
                if (openMouthWait < -8f)
                {
                    PlaySound.NoLoop(chargeSnd);
                    p = Phase.Phase3;
                }
            }
            else if (p == Phase.Phase3)
            {
                //Destroy the unneeded puppets.
                if (form1And2Holder != null)
                {
                    Destroy(form1And2Holder);
                }

                //Determine position and velocity.
                pos = transform.position;
                vel = rig.velocity;

                //Setting hitbox properties.
                hitBox.enabled = (health > 50);
                hitBox.offset  = Vector2.zero;
                hitBox.size    = new Vector2(11f, 11f);

                //Setting which puppet to be colored when hit.
                puppetToColor = form3Puppet;

                //Enable that chomp animation.
                animForm3.enabled = true;

                //Manage flip of puppet.
                if (vel.x < 0)
                {
                    form3Puppet.transform.localScale = new Vector3(15, 15, 1);
                }
                else if (vel.x > 0)
                {
                    form3Puppet.transform.localScale = new Vector3(-15, 15, 1);
                }

                //Go towards player!
                if (!gotNewVel && Game.playerObj != null)
                {
                    Vector2 pPos  = new Vector2(Game.playerObj.transform.position.x, Game.playerObj.transform.position.y);
                    Vector2 dif   = new Vector2(pos.x, pos.y) - pPos;
                    float   speed = 20f;
                    newVel    = dif.normalized * speed;
                    vel       = -newVel;
                    gotNewVel = true;
                }

                //Going around randomly when offscreen!
                if (pos.x > 46 || pos.x < -46 || pos.y > 31 || pos.y < -31)
                {
                    //To phase 4!
                    if (health < 51)
                    {
                        arrow.SetActive(true);
                        iTween.ScaleTo(arrow, iTween.Hash(
                                           "x", 2, "y", 2, "z", 2,
                                           "time", 2f,
                                           "delay", 4f,
                                           "looptype", iTween.LoopType.none,
                                           "easetype", iTween.EaseType.easeInOutSine
                                           ));
                        arrow.transform.parent   = null;
                        arrow.transform.position = new Vector3(0, 0, 50);
                        vel = Vector2.zero;
                        form3Puppet.SetActive(false);
                        p = Phase.Phase4;
                    }

                    //1 == top, 2 == bottom, 3 == left, 4 == right.
                    int   newSide = Random.Range(1, 4);
                    float z       = 0f;
                    if (newSide == 1)
                    {
                        pos       = new Vector3(Random.Range(45f, -45f), 30, z);
                        gotNewVel = false;
                    }
                    else if (newSide == 2)
                    {
                        pos       = new Vector3(Random.Range(45f, -45f), -30, z);
                        gotNewVel = false;
                    }
                    else if (newSide == 3)
                    {
                        pos       = new Vector3(-45f, Random.Range(-30f, 30f), z);
                        gotNewVel = false;
                    }
                    else if (newSide == 4)
                    {
                        pos       = new Vector3(45f, Random.Range(-30f, 30f), z);
                        gotNewVel = false;
                    }
                }

                //Updating position and velocity.
                rig.velocity       = vel;
                transform.position = pos;
            }
            else if (p == Phase.Phase4)
            {
                //Keeping position and velocity locked at zero.
                transform.position = Vector3.zero;
                rig.velocity       = Vector2.zero;

                //Vektor says a thing to keep the player distracted from Cotton's large appear time.
                if (vektorText != null)
                {
                    vektorText.SetActive(true);
                }

                //Total time it takes to do an attack.
                totalMoveTime = (2f + 1f + 1.5f + 2f) + 1.1f;

                //Constantly goes down, when it reaches 0, it picks a new target to attack from.
                //The counter should be long enough to wait for one swipe attack to finish.
                totalForm4Counter -= Time.deltaTime;
                if (totalForm4Counter <= 0)
                {
                    attackedForm4 = true;

                    arrow.GetComponent <LookAtScript>().enabled = true;

                    if (form4Attack < 3)
                    {
                        form4Attack++;
                    }
                    else
                    {
                        form4Attack = 0;
                    }
                    float z = 0;
                    if (form4Attack == 0)
                    {
                        startPos = new Vector3(-90, 0, z); midPos = new Vector3(-75, 0, z); targetPos = new Vector3(-24, 0, z); facePos = new Vector3(0.45f, 0f, -2f);
                    }                                                                                                                                                                       //Left
                    else if (form4Attack == 1)
                    {
                        startPos = new Vector3(90, 0, z); midPos = new Vector3(75, 0, z); targetPos = new Vector3(24, 0, z); facePos = new Vector3(-0.45f, 0f, -2f);
                    }                                                                                                                                                                          //Right
                    else if (form4Attack == 2)
                    {
                        startPos = new Vector3(0, 73, z); midPos = new Vector3(0, 62, z); targetPos = new Vector3(0, 37, z); facePos = new Vector3(0f, -0.47f, -2f);
                    }                                                                                                                                                                          //Up
                    else if (form4Attack == 3)
                    {
                        startPos = new Vector3(0, -73, z); midPos = new Vector3(0, -62, z); targetPos = new Vector3(0, -37, z); facePos = new Vector3(0f, 0.47f, -2f);
                    }                                                                                                                                                                            //Down
                    form4Face.transform.localPosition = facePos;
                    form4Body.transform.localPosition = startPos;

                    //Do the tweens!
                    iTween.MoveTo(form4Body, iTween.Hash("x", midPos.x, "y", midPos.y, "z", midPos.z, "time", form4ToStartTime, "looptype", iTween.LoopType.none, "easeType", iTween.EaseType.easeInOutSine));
                    iTween.MoveTo(form4Body, iTween.Hash("x", targetPos.x, "y", targetPos.y, "z", targetPos.z, "time", form4SwipeTime, "delay", (form4ToStartTime + 1.5f), "looptype", iTween.LoopType.none, "easeType", iTween.EaseType.easeOutBounce));
                    iTween.MoveTo(form4Body, iTween.Hash("x", startPos.x, "y", startPos.y, "z", startPos.z, "time", form4BackTime, "delay", (form4ToStartTime + 1.5f + form4SwipeTime), "looptype", iTween.LoopType.none, "easeType", iTween.EaseType.easeInOutSine));

                    //Enable the form holder and allow for box management.
                    form4Holder.SetActive(true);
                    allowForm4HitboxManagement = true;
                    totalForm4Counter          = totalMoveTime;
                }

                //Manage the outer walls!
                if (form4Attack == 1 || attackedForm4)
                {
                    leftWallPos = new Vector3(0f, 0f, 10f);
                }
                else
                {
                    leftWallPos = new Vector3(-20f, 0f, 10f);
                }
                if (form4Attack == 0 || attackedForm4)
                {
                    rightWallPos = new Vector3(0f, 0f, 10f);
                }
                else
                {
                    rightWallPos = new Vector3(20f, 0f, 10f);
                }
                if (form4Attack == 3 || attackedForm4)
                {
                    upWallPos = new Vector3(0f, 0f, 10f);
                }
                else
                {
                    upWallPos = new Vector3(0f, 20f, 10f);
                }
                if (form4Attack == 2 || attackedForm4)
                {
                    downWallPos = new Vector3(0f, 0f, 10f);
                }
                else
                {
                    downWallPos = new Vector3(0f, -20f, 10f);
                }
                float wallSmooth = 2f;
                leftWall.transform.position  = Vector3.Lerp(leftWall.transform.position, leftWallPos, wallSmooth * Time.deltaTime);
                rightWall.transform.position = Vector3.Lerp(rightWall.transform.position, rightWallPos, wallSmooth * Time.deltaTime);
                upWall.transform.position    = Vector3.Lerp(upWall.transform.position, upWallPos, wallSmooth * Time.deltaTime);
                downWall.transform.position  = Vector3.Lerp(downWall.transform.position, downWallPos, wallSmooth * Time.deltaTime);

                //Play laugh sound if it hasn't played already.
                if (!playedLaughSnd)
                {
                    PlaySound.NoLoop(laughSnd);
                    playedLaughSnd = true;
                }

                //Managing the hitbox for Phase 4.
                hitBox.enabled = allowForm4HitboxManagement;
                if (allowForm4HitboxManagement)
                {
                    hitBox.offset = form4Body.transform.localPosition;
                    hitBox.size   = form4Body.transform.localScale;
                }

                //Puppet color.
                puppetToColor = form4Body;

                //Color the poofies.
                ParticleSystemRenderer dr = downPoof.GetComponent <ParticleSystemRenderer>();
                ParticleSystemRenderer ur = upPoof.GetComponent <ParticleSystemRenderer>();
                ParticleSystemRenderer lr = leftPoof.GetComponent <ParticleSystemRenderer>();
                ParticleSystemRenderer rr = rightPoof.GetComponent <ParticleSystemRenderer>();
                dr.material.color = puppetToColor.GetComponent <MeshRenderer>().material.color;
                ur.material.color = puppetToColor.GetComponent <MeshRenderer>().material.color;
                lr.material.color = puppetToColor.GetComponent <MeshRenderer>().material.color;
                rr.material.color = puppetToColor.GetComponent <MeshRenderer>().material.color;
            }
        }
        else if (p == Phase.Death)
        {
            if (form4Holder != null)
            {
                Destroy(form4Holder);
            }
            hitBox.enabled   = false;
            victoryWaitTime -= Time.deltaTime;
            if (victoryWaitTime < 0f)
            {
                Game.manager.GetComponent <GameManager>().victory = true;
            }
        }
    }
Пример #22
0
 // Update is called once per frame
 void Start()
 {
     PSR = gameObject.GetComponent <ParticleSystemRenderer>();
     //tempRend.sortingOrder = Mathf.Abs((int)transform.position.y) * -1;
     Invoke("ChangeSortingOrder", 2);
 }
Пример #23
0
    public override void gaxb_complete()
    {
        if (systemName != null)
        {
            GameObject particleSystemGO = GameObject.Find(systemName);
            if (particleSystemGO != null)
            {
                particleSystem   = particleSystemGO.GetComponent <ParticleSystem> ();
                particleRenderer = particleSystemGO.GetComponent <ParticleSystemRenderer> ();

                shim.material = new Material(particleRenderer.material);

                particleSystem.simulationSpace = ParticleSystemSimulationSpace.Local;
                particleRenderer.enabled       = false;

                designedMaxParticles = particleSystem.maxParticles;

                // create the LUTs for less CPU usages during mesh generation
                for (int i = 0; i < lutMax; i++)
                {
                    colorLUT [i] = particleSystem.startColor;
                    sizeLUT [i]  = particleSystem.startSize * 0.5f;
                }

                // support changing color over lifetime
                if (particleSystem.colorOverLifetime.enabled)
                {
                    for (int i = 0; i < lutMax; i++)
                    {
                        colorLUT [i] = particleSystem.colorOverLifetime.color.Evaluate(1.0f - (float)i / (float)lutMax);
                    }
                }

                // support changing size over lifetime
                if (particleSystem.sizeOverLifetime.enabled)
                {
                    for (int i = 0; i < lutMax; i++)
                    {
                        sizeLUT [i] = particleSystem.sizeOverLifetime.size.Evaluate(1.0f - (float)i / (float)lutMax) * 0.5f;
                    }
                }


                // prepare texture sheet animation
                textureSheetAnimation          = particleSystem.textureSheetAnimation;
                textureSheetAnimationFrames    = 0;
                textureSheedAnimationFrameSize = Vector2.zero;
                if (textureSheetAnimation.enabled)
                {
                    textureSheetAnimationFrames    = textureSheetAnimation.numTilesX * textureSheetAnimation.numTilesY;
                    textureSheedAnimationFrameSize = new Vector2(1f / textureSheetAnimation.numTilesX, 1f / textureSheetAnimation.numTilesY);

                    // support texture sheet animations changing over lifetime
                    for (int i = 0; i < lutMax; i++)
                    {
                        float frameProgress = (float)i / (float)lutMax;
                        frameProgress = Mathf.Repeat((1.0f - frameProgress) * textureSheetAnimation.cycleCount, 1);
                        int frame = 0;

                        switch (textureSheetAnimation.animation)
                        {
                        case ParticleSystemAnimationType.WholeSheet:
                            frame = Mathf.FloorToInt(frameProgress * textureSheetAnimationFrames);
                            break;

                        case ParticleSystemAnimationType.SingleRow:
                            frame = Mathf.FloorToInt(frameProgress * textureSheetAnimation.numTilesX);

                            int row = textureSheetAnimation.rowIndex;
                            frame += row * textureSheetAnimation.numTilesX;
                            break;
                        }

                        frame %= textureSheetAnimationFrames;

                        float x  = (frame % textureSheetAnimation.numTilesX) * textureSheedAnimationFrameSize.x;
                        float y  = Mathf.FloorToInt(frame / textureSheetAnimation.numTilesX) * textureSheedAnimationFrameSize.y;
                        float x2 = x + textureSheedAnimationFrameSize.x;
                        float y2 = y - textureSheedAnimationFrameSize.y;

                        sheetLUT [i] = new Vector4(x, y, x2, y2);
                    }
                }

                // If we have one of our custom UI emitters, then fill the positionLUT to allow quick spawning
                UpdatePositionTable();

                autoEvent = new AutoResetEvent(false);

                workerThread      = new Thread(ParticleThread);
                workerThread.Name = "PUParticles";
                workerThread.Start();
            }
        }

        ScheduleForUpdate();


        // If we emit particles ourselves, we need to clear any particles which the system may have already spawned
        if (emitMode == PlanetUnity2.ParticleEmitMode.Edge ||
            emitMode == PlanetUnity2.ParticleEmitMode.Center ||
            emitMode == PlanetUnity2.ParticleEmitMode.Fill ||
            emitMode == PlanetUnity2.ParticleEmitMode.Image)
        {
            particleSystem.enableEmission = false;
            particleSystem.Clear(true);
        }
    }
Пример #24
0
        protected bool Initialize()
        {
            // initialize members
            if (_transform == null)
            {
                _transform = transform;
            }

            // prepare particle system
            ParticleSystemRenderer renderer = GetComponent <ParticleSystemRenderer>();
            bool setParticleSystemMaterial  = false;

            if (_particleSystem == null)
            {
                _particleSystem = GetComponent <ParticleSystem>();

                if (_particleSystem == null)
                {
                    return(false);
                }

                // get current particle texture
                if (renderer == null)
                {
                    renderer = _particleSystem.gameObject.AddComponent <ParticleSystemRenderer>();
                }
                Material currentMaterial = renderer.sharedMaterial;
                if (currentMaterial && currentMaterial.HasProperty("_MainTex"))
                {
                    particleTexture = currentMaterial.mainTexture;
                }

                // automatically set scaling
                ParticleSystem.MainModule main = _particleSystem.main;
                main.scalingMode = ParticleSystemScalingMode.Local;

                _particles = null;
                setParticleSystemMaterial = true;
            }
            else
            {
                if (Application.isPlaying)
                {
                    setParticleSystemMaterial = (renderer.material == null);
                }
#if UNITY_EDITOR
                else
                {
                    setParticleSystemMaterial = (renderer.sharedMaterial == null);
                }
#endif
            }

            // automatically set material to UI/Particles/Hidden shader, and get previous texture
            if (setParticleSystemMaterial)
            {
                Material material = new Material(Shader.Find("UI/Particles/Hidden"));
                if (Application.isPlaying)
                {
                    renderer.material = material;
                }
#if UNITY_EDITOR
                else
                {
                    material.hideFlags      = HideFlags.DontSave;
                    renderer.sharedMaterial = material;
                }
#endif
            }

            // prepare particles array
            if (_particles == null)
            {
                ParticleSystem.MainModule main = _particleSystem.main;
                _particles = new ParticleSystem.Particle[main.maxParticles];
            }

            // prepare uvs
            if (particleTexture)
            {
                _uv = new Vector4(0, 0, 1, 1);
            }
            else if (particleSprite)
            {
                _uv = UnityEngine.Sprites.DataUtility.GetOuterUV(particleSprite);
            }

            // prepare texture sheet animation
            _textureSheetAnimation          = _particleSystem.textureSheetAnimation;
            _textureSheetAnimationFrames    = 0;
            _textureSheedAnimationFrameSize = Vector2.zero;
            if (_textureSheetAnimation.enabled)
            {
                _textureSheetAnimationFrames    = _textureSheetAnimation.numTilesX * _textureSheetAnimation.numTilesY;
                _textureSheedAnimationFrameSize = new Vector2(1f / _textureSheetAnimation.numTilesX, 1f / _textureSheetAnimation.numTilesY);
            }

            return(true);
        }
Пример #25
0
        protected bool Initialize()
        {
            // initialize members
            if (_transform == null)
            {
                _transform = transform;
            }
            if (pSystem == null)
            {
                pSystem = GetComponent <ParticleSystem>();

                if (pSystem == null)
                {
                    return(false);
                }

#if UNITY_5_5_OR_NEWER
                mainModule = pSystem.main;
                if (pSystem.main.maxParticles > 14000)
                {
                    mainModule.maxParticles = 14000;
                }
#else
                if (pSystem.maxParticles > 14000)
                {
                    pSystem.maxParticles = 14000;
                }
#endif

                pRenderer = pSystem.GetComponent <ParticleSystemRenderer>();
                if (pRenderer != null)
                {
                    pRenderer.enabled = false;
                }

                if (material == null)
                {
                    var foundShader = Shader.Find("UI Extensions/Particles/Additive");
                    if (foundShader)
                    {
                        material = new Material(foundShader);
                    }
                }

                currentMaterial = material;
                if (currentMaterial && currentMaterial.HasProperty("_MainTex"))
                {
                    currentTexture = currentMaterial.mainTexture;
                    if (currentTexture == null)
                    {
                        currentTexture = Texture2D.whiteTexture;
                    }
                }
                material = currentMaterial;
                // automatically set scaling
#if UNITY_5_5_OR_NEWER
                mainModule.scalingMode = ParticleSystemScalingMode.Hierarchy;
#else
                pSystem.scalingMode = ParticleSystemScalingMode.Hierarchy;
#endif

                particles = null;
            }
#if UNITY_5_5_OR_NEWER
            if (particles == null)
            {
                particles = new ParticleSystem.Particle[pSystem.main.maxParticles];
            }
#else
            if (particles == null)
            {
                particles = new ParticleSystem.Particle[pSystem.maxParticles];
            }
#endif

            imageUV = new Vector4(0, 0, 1, 1);

            // prepare texture sheet animation
            textureSheetAnimation          = pSystem.textureSheetAnimation;
            textureSheetAnimationFrames    = 0;
            textureSheetAnimationFrameSize = Vector2.zero;
            if (textureSheetAnimation.enabled)
            {
                textureSheetAnimationFrames    = textureSheetAnimation.numTilesX * textureSheetAnimation.numTilesY;
                textureSheetAnimationFrameSize = new Vector2(1f / textureSheetAnimation.numTilesX, 1f / textureSheetAnimation.numTilesY);
            }

            return(true);
        }
Пример #26
0
    public void Init()
    {
        mCanvas   = this.gameObject.GetComponent <CanvasGroup>();
        mSprite   = gameObject.GetComponent <SpriteRenderer>();
        mMesh     = this.gameObject.GetComponent <MeshRenderer>();
        mTexture  = this.gameObject.GetComponent <GUITexture>();
        mText     = this.gameObject.GetComponent <GUIText>();
        mTextMesh = this.gameObject.GetComponent <TextMesh>();
        mTextUI   = this.gameObject.GetComponent <Text>();
        mImageUI  = this.gameObject.GetComponent <Image>();
        mParticle = this.gameObject.GetComponent <ParticleSystemRenderer>();

        if (mTexture == null && mMesh == null && mText == null && mTextMesh == null && mTextUI == null && mImageUI == null && mCanvas == null && mSprite == null)
        {
            throw new UnityException("Incorrect usage of SCFade. Apply it to Uni2DSprite, GUITexture, GUIText, EasyFontTextMesh, Text, Image, Canvas objects! Object name is " + gameObject.name);
        }

        else if (mCanvas)
        {
            mType     = Type.Canvas;
            fadeValue = mCanvas.alpha;
        }

        else if (mTexture)
        {
            mType     = Type.GUITexture;
            fadeValue = mTexture.color.a * 2;
        }

        else if (mSprite)
        {
            mType     = Type.SpriteRenderer;
            fadeValue = mSprite.color.a;
        }


        else if (mText)
        {
            mType     = Type.GUIText;
            fadeValue = mText.color.a;
        }

        else if (mTextMesh)
        {
            mType     = Type.TextMesh;
            fadeValue = mTextMesh.color.a;
        }

        else if (mTextUI)
        {
            mType     = Type.Text;
            fadeValue = mTextUI.color.a;
        }

        else if (mImageUI)
        {
            mType     = Type.Image;
            fadeValue = mImageUI.color.a;
        }

        else if (mMesh)
        {
            mType     = Type.MeshRenderer;
            fadeValue = mMesh.material.GetColor("_TintColor").a;
        }

        else if (mParticle)
        {
            mType     = Type.Particle;
            fadeValue = mParticle.material.GetColor("_TintColor").a;
        }
    }
Пример #27
0
    IEnumerator PlayEffectFrame()
    {
        while (playedIndex < source.frames.Count)
        {
            //某帧锁定
            if (pause)
            {
                yield return(0);

                continue;
            }
            if (playedTime < source.frames[0].startTime && mRender.enabled)
            {
                mRender.enabled = false;
            }
            else if (playedTime >= source.frames[0].startTime && !mRender.enabled && source.Hidden == 0)
            {
                mRender.enabled = true;
            }

            while (playedTime < source.frames[0].startTime)
            {
                yield return(0);
            }

            float timeRatio2 = (playedTime - source.frames[playedIndex - 1].startTime) / (source.frames[playedIndex].startTime - source.frames[playedIndex - 1].startTime);

            string vertexColor = "_TintColor";
            if (source.BlendType == 2)
            {
                vertexColor = "_InvColor";
            }

            if (source.EffectType == "BOX")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = new Vector3(source.origScale.x * source.frames[playedIndex - 1].scale.x, source.origScale.y * source.frames[playedIndex - 1].scale.y, source.origScale.z * source.frames[playedIndex - 1].scale.z);
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Lerp(new Vector3(source.origScale.x * source.frames[playedIndex - 1].scale.x, source.origScale.y * source.frames[playedIndex - 1].scale.y, source.origScale.z * source.frames[playedIndex - 1].scale.z), new Vector3(source.origScale.x * source.frames[playedIndex].scale.x, source.origScale.y * source.frames[playedIndex].scale.y, source.origScale.z * source.frames[playedIndex].scale.z), timeRatio2);
                }
            }
            else if (source.EffectType == "CYLINDER")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = source.frames[playedIndex - 1].scale;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                }
                //if (source.frames[playedIndex].startTime <= playedTime)
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;

                //    if (PositionFollow != null)
                //        transform.position = PositionFollow.position + source.frames[playedIndex].pos;
                //    else
                //        transform.position = source.frames[playedIndex].pos;
                //    transform.localScale = source.frames[playedIndex].scale;
                //    mRender.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                //    mRender.material.SetColor(vertexColor, source.frames[playedIndex].colorRGB);
                //    playedIndex++;
                //}
                //else
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    else
                //        transform.rotation = Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    if (PositionFollow != null)
                //        transform.position = PositionFollow.position + Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    else
                //        transform.position = Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);

                //    mRender.material.SetFloat("_Intensity", Mathf.Lerp(source.frames[playedIndex - 1].TailFlags[9], source.frames[playedIndex].TailFlags[9], timeRatio2));
                //    mRender.material.SetColor(vertexColor, Color.Lerp(source.frames[playedIndex - 1].colorRGB, source.frames[playedIndex].colorRGB, timeRatio2));
                //}
            }
            else if (source.EffectType == "PLANE")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = source.frames[playedIndex - 1].scale;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                }
                //if (source.frames[playedIndex].startTime <= playedTime)
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;

                //    if (PositionFollow != null)
                //        transform.position = PositionFollow.position + source.frames[playedIndex].pos;
                //    else
                //        transform.position = source.frames[playedIndex].pos;

                //    transform.localScale = new Vector3(source.origScale.x * source.frames[playedIndex].scale.x, source.origScale.y * source.frames[playedIndex].scale.y, source.origScale.z * source.frames[playedIndex].scale.z);
                //    mRender.material.SetColor(vertexColor, source.frames[playedIndex].colorRGB);
                //    mRender.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                //    playedIndex++;
                //}
                //else
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    else
                //        transform.rotation = Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    if (PositionFollow != null)
                //        transform.localPosition = PositionFollow.position + Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    else
                //        transform.position = Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    transform.localScale = Vector3.Lerp(new Vector3(source.origScale.x * source.frames[playedIndex - 1].scale.x, source.origScale.y * source.frames[playedIndex - 1].scale.y, source.origScale.z * source.frames[playedIndex - 1].scale.z), new Vector3(source.origScale.x * source.frames[playedIndex].scale.x, source.origScale.y * source.frames[playedIndex].scale.y, source.origScale.z * source.frames[playedIndex].scale.z), timeRatio2);

                //    mRender.material.SetFloat("_Intensity", Mathf.Lerp(source.frames[playedIndex - 1].TailFlags[9], source.frames[playedIndex].TailFlags[9], timeRatio2));
                //    mRender.material.SetColor(vertexColor, Color.Lerp(source.frames[playedIndex - 1].colorRGB, source.frames[playedIndex].colorRGB, timeRatio2));
                //}
            }
            else if (source.EffectType == "SPHERE")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = source.frames[playedIndex - 1].scale;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Slerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                }
                //if (source.frames[playedIndex].startTime <= playedTime)
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;

                //    if (source.localSpace == 1)
                //    {
                //        if (RotateFollow != null)
                //        {
                //            Vector3 targetPos = RotateFollow.TransformPoint(source.frames[playedIndex].pos) - RotateFollow.position;
                //            if (PositionFollow != null)
                //                transform.position = PositionFollow.position + targetPos;
                //            else
                //                transform.position = targetPos;
                //        }
                //    }
                //    else
                //    {
                //        if (PositionFollow != null)
                //            transform.position = PositionFollow.position + source.frames[playedIndex].pos;
                //        else
                //            transform.position = source.frames[playedIndex].pos;
                //    }

                //    //if (PositionFollow != null)
                //    //    transform.position = PositionFollow.position + source.frames[playedIndex].pos;
                //    //else
                //    //    transform.position = source.frames[playedIndex].pos;
                //    transform.localScale = source.frames[playedIndex].scale;
                //    mRender.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                //    mRender.material.SetColor(vertexColor, source.frames[playedIndex].colorRGB);
                //    playedIndex++;
                //}
                //else
                //{
                //    //旋转用球面插值
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    else
                //        transform.rotation = Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);

                //    if (source.localSpace == 1)
                //    {
                //        if (RotateFollow != null)
                //        {
                //            Vector3 targetPos = RotateFollow.TransformPoint(Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2)) - RotateFollow.position;
                //            if (PositionFollow != null)
                //                transform.position = PositionFollow.position + targetPos;
                //            else
                //                transform.position = targetPos;
                //        }
                //    }
                //    else
                //    {
                //        if (PositionFollow != null)
                //            transform.position = PositionFollow.position + Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //        else
                //            transform.position = Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    }

                //    ////移动用直线插值,
                //    //if (PositionFollow != null)
                //    //    transform.position = PositionFollow.position + Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    //else
                //    //    transform.localPosition = Vector3.Lerp(source.frames[playedIndex - 1].pos , source.frames[playedIndex].pos, timeRatio2);
                //    transform.localScale = Vector3.Slerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                //    mRender.material.SetFloat("_Intensity", Mathf.Lerp(source.frames[playedIndex - 1].TailFlags[9], source.frames[playedIndex].TailFlags[9], timeRatio2));
                //    mRender.material.SetColor(vertexColor, Color.Lerp(source.frames[playedIndex - 1].colorRGB, source.frames[playedIndex].colorRGB, timeRatio2));
                //}
            }
            else if (source.EffectType == "BILLBOARD")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.LookAt(Camera.main.transform);
                    transform.localScale = new Vector3(source.origScale.x * source.frames[playedIndex - 1].scale.x, source.origScale.y * source.frames[playedIndex - 1].scale.y, source.origScale.z * source.frames[playedIndex - 1].scale.z);
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.LookAt(Camera.main.transform);
                    transform.localScale = Vector3.Lerp(new Vector3(source.origScale.x * source.frames[playedIndex - 1].scale.x, source.origScale.y * source.frames[playedIndex - 1].scale.y, source.origScale.z * source.frames[playedIndex - 1].scale.z), new Vector3(source.origScale.x * source.frames[playedIndex].scale.x, source.origScale.y * source.frames[playedIndex].scale.y, source.origScale.z * source.frames[playedIndex].scale.z), timeRatio2);
                }
                //if (source.frames[playedIndex].startTime <= playedTime)
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;

                //    if (source.localSpace == 1)
                //    {
                //        if (RotateFollow != null)
                //        {
                //            Vector3 targetPos = RotateFollow.TransformPoint(source.frames[playedIndex].pos) - RotateFollow.position;
                //            if (PositionFollow != null)
                //                transform.position = PositionFollow.position + targetPos;
                //            else
                //                transform.position = targetPos;
                //        }
                //        else
                //            Debug.LogError("缺少惯性坐标系骨骼");
                //    }
                //    else
                //    {
                //        if (PositionFollow != null)
                //            transform.position = PositionFollow.position + source.frames[playedIndex].pos;
                //        else
                //            transform.position = source.frames[playedIndex].pos;
                //    }

                //    transform.localScale = new Vector3(source.origScale.x * source.frames[playedIndex].scale.x, source.origScale.y * source.frames[playedIndex].scale.y, source.origScale.z * source.frames[playedIndex].scale.z);
                //    //transform.LookAt(Camera.main.transform);
                //    mRender.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                //    mRender.material.SetColor(vertexColor, new Color(source.frames[playedIndex].colorRGB.r, source.frames[playedIndex].colorRGB.g, source.frames[playedIndex].colorRGB.b, source.frames[playedIndex].colorRGB.a));

                //    playedIndex++;
                //    //playedTime = 0.0f;
                //}
                //else
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;

                //    if (source.localSpace == 1)
                //    {
                //        if (PositionFollow != null)
                //        {
                //            Vector3 targetPos = RotateFollow.TransformPoint(Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2)) - RotateFollow.position;
                //            if (PositionFollow != null)
                //                transform.position = PositionFollow.position + targetPos;
                //            else
                //                transform.position = targetPos;
                //        }
                //        else
                //            Debug.LogError("缺少惯性坐标骨骼");
                //    }
                //    else
                //    {
                //        if (PositionFollow != null)
                //            transform.position = PositionFollow.position + Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //        else
                //            transform.position = Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    }

                //    transform.localScale = Vector3.Lerp(new Vector3(source.origScale.x * source.frames[playedIndex - 1].scale.x, source.origScale.y * source.frames[playedIndex - 1].scale.y, source.origScale.z * source.frames[playedIndex - 1].scale.z), new Vector3(source.origScale.x * source.frames[playedIndex].scale.x, source.origScale.y * source.frames[playedIndex].scale.y, source.origScale.z * source.frames[playedIndex].scale.z), timeRatio2);
                //    //transform.LookAt(Camera.main.transform);
                //    mRender.material.SetFloat("_Intensity", Mathf.Lerp(source.frames[playedIndex - 1].TailFlags[9], source.frames[playedIndex].TailFlags[9], timeRatio2));
                //    mRender.material.SetColor(vertexColor, Color.Lerp(new Color(source.frames[playedIndex - 1].colorRGB.r, source.frames[playedIndex - 1].colorRGB.g, source.frames[playedIndex - 1].colorRGB.b, source.frames[playedIndex - 1].colorRGB.a), new Color(source.frames[playedIndex].colorRGB.r, source.frames[playedIndex].colorRGB.g, source.frames[playedIndex].colorRGB.b, source.frames[playedIndex].colorRGB.a), timeRatio2));

                //}
            }
            else if (source.EffectType == "MODEL")
            {
                //第一帧开始时间为-1.表示无限时播放
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = source.frames[playedIndex - 1].scale;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Slerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                }
            }
            else if (source.EffectType == "PARTICLE")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    //transform.localScale = source.frames[playedIndex - 1].scale;
                    ParticleSystemRenderer render = particle.GetComponent <ParticleSystemRenderer>();
                    render.material.SetColor("_Color", source.frames[playedIndex - 1].colorRGB);
                    render.material.SetColor(vertexColor, source.frames[playedIndex - 1].colorRGB);
                    //粒子不要设置强度了,原版本的粒子实现和UNITY的不一样render.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                    particle.Emit(1);
                    //particle.Simulate();
                    playedIndex++;
                    //playedTime = 0.0f;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    //transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                    //ParticleSystemRenderer render = particle.GetComponent<ParticleSystemRenderer>();
                    //render.material.SetColor("_Color", new Color(source.frames[playedIndex].colorRGB.r, source.frames[playedIndex].colorRGB.g, source.frames[playedIndex].colorRGB.b, source.frames[playedIndex].colorRGB.a));
                    //render.material.SetColor(vertexColor, new Color(source.frames[playedIndex].colorRGB.r, source.frames[playedIndex].colorRGB.g, source.frames[playedIndex].colorRGB.b, source.frames[playedIndex].colorRGB.a));
                    //particle.Emit(1);
                    //render.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                }
            }
            else if (source.EffectType == "DONUT")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = source.frames[playedIndex - 1].scale;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                }
                //if (source.frames[playedIndex].startTime <= playedTime)
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;
                //    transform.localPosition = source.frames[playedIndex].pos;
                //    transform.localScale = source.frames[playedIndex].scale;
                //    mRender.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                //    mRender.material.SetColor(vertexColor, source.frames[playedIndex].colorRGB);
                //    playedIndex++;
                //    //playedTime = 0.0f;
                //}
                //else
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    transform.localPosition = Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                //    mRender.material.SetFloat("_Intensity", Mathf.Lerp(source.frames[playedIndex - 1].TailFlags[9], source.frames[playedIndex].TailFlags[9], timeRatio2));
                //    mRender.material.SetColor(vertexColor, Color.Lerp(source.frames[playedIndex - 1].colorRGB, source.frames[playedIndex].colorRGB, timeRatio2));
                //}
            }
            else if (source.EffectType == "DRAG")
            {
                if (source.frames[playedIndex].startTime <= playedTime)
                {
                    OnNewFrame(vertexColor);
                    transform.localScale = source.frames[playedIndex - 1].scale;
                }
                else
                {
                    OnLastFrame(timeRatio2, vertexColor);
                    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                }
                //if (source.frames[playedIndex].startTime <= playedTime)
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        transform.rotation = source.frames[playedIndex].quat;
                //    transform.localPosition = source.frames[playedIndex].pos;
                //    transform.localScale = source.frames[playedIndex].scale;
                //    mRender.material.SetFloat("_Intensity", source.frames[playedIndex].TailFlags[9]);
                //    mRender.material.SetColor(vertexColor, source.frames[playedIndex].colorRGB);
                //    playedIndex++;
                //    //playedTime = 0.0f;
                //}
                //else
                //{
                //    if (RotateFollow != null)
                //        transform.rotation = RotateFollow.rotation * source.frames[playedIndex].quat;
                //    else
                //        RotateFollow.transform.rotation = Quaternion.Slerp(source.frames[playedIndex - 1].quat, source.frames[playedIndex].quat, timeRatio2);
                //    transform.localPosition = Vector3.Lerp(source.frames[playedIndex - 1].pos, source.frames[playedIndex].pos, timeRatio2);
                //    transform.localScale = Vector3.Lerp(source.frames[playedIndex - 1].scale, source.frames[playedIndex].scale, timeRatio2);
                //    mRender.material.SetFloat("_Intensity", Mathf.Lerp(source.frames[playedIndex - 1].TailFlags[9], source.frames[playedIndex].TailFlags[9], timeRatio2));
                //    mRender.material.SetColor(vertexColor, Color.Lerp(source.frames[playedIndex - 1].colorRGB, source.frames[playedIndex].colorRGB, timeRatio2));
                //}
            }

            yield return(0);
        }
        //?是循环还是删除
        //playedIndex = 0;
        //yield return 0;
        PlayDone = true;
        if (parentSfx != null)
        {
            parentSfx.OnPlayDone(this);
        }
        else
        {
            Destroy(gameObject);
        }
        yield break;
    }
Пример #28
0
        protected bool Initialize()
        {
            // initialize members
            if (_transform == null)
            {
                _transform = transform;
            }
            if (_particleSystem == null)
            {
                _particleSystem = GetComponent <ParticleSystem>();

                if (_particleSystem == null)
                {
                    return(false);
                }

                // automatically set material to UI/Particles/Hidden shader, and get previous texture
                ParticleSystemRenderer renderer = _particleSystem.GetComponent <ParticleSystemRenderer>();
                if (renderer == null)
                {
                    renderer = _particleSystem.gameObject.AddComponent <ParticleSystemRenderer>();
                }
                Material currentMaterial = renderer.sharedMaterial;
                if (currentMaterial && currentMaterial.HasProperty("_MainTex"))
                {
                    particleTexture = currentMaterial.mainTexture;
                }
                Material material = new Material(Shader.Find("Particles/Alpha Blended"));         // TODO - You should create this discard shader
                if (Application.isPlaying)
                {
                    renderer.material = material;
                }
            #if UNITY_EDITOR
                else
                {
                    material.hideFlags      = HideFlags.DontSave;
                    renderer.sharedMaterial = material;
                }
            #endif

                // automatically set scaling
                _particleSystem.scalingMode = ParticleSystemScalingMode.Hierarchy;

                _particles = null;
            }
            if (_particles == null)
            {
                _particles = new ParticleSystem.Particle[_particleSystem.maxParticles];
            }

            // prepare uvs
            if (particleTexture)
            {
                _uv = new Vector4(0, 0, 1, 1);
            }
            else if (particleSprite)
            {
                _uv = UnityEngine.Sprites.DataUtility.GetOuterUV(particleSprite);
            }

            // prepare texture sheet animation
            _textureSheetAnimation          = _particleSystem.textureSheetAnimation;
            _textureSheetAnimationFrames    = 0;
            _textureSheedAnimationFrameSize = Vector2.zero;
            if (_textureSheetAnimation.enabled)
            {
                _textureSheetAnimationFrames    = _textureSheetAnimation.numTilesX * _textureSheetAnimation.numTilesY;
                _textureSheedAnimationFrameSize = new Vector2(1f / _textureSheetAnimation.numTilesX, 1f / _textureSheetAnimation.numTilesY);
            }

            return(true);
        }
Пример #29
0
    //原粒子系统是右手坐标系的,转移到左手坐标系后非常多问题,特别是父子关系以及,跟随和子物体旋转叠加
    public void Init(SfxEffect effect, SFXEffectPlay parent, int index, float timePlayed = 0.0f)
    {
        playedTime         = timePlayed;
        PlayDone           = false;
        transform.rotation = Quaternion.identity;
        effectIndex        = index;
        parentSfx          = parent;//当找不到跟随者的时候,向父询问其他特效是否包含此名称.
        name       = effect.EffectName;
        EffectType = effect.EffectType;
        //一个是跟随移动,一个是跟随旋转
        mOwner = parent.GetComponent <MeteorUnit>();
        source = effect;
        if (effect.EffectType == "PARTICLE")
        {
            particle = Instantiate(Resources.Load <GameObject>("SFXParticles"), Vector3.zero, Quaternion.identity, transform).GetComponent <ParticleSystem>();
        }

        if (string.IsNullOrEmpty(effect.Bone0))
        {
            PositionFollow = mOwner == null ? parentSfx.transform : mOwner.transform;
        }
        else
        if (effect.Bone0 == "ROOT")
        {
            PositionFollow = mOwner == null ? parent.transform : mOwner.ROOTNull;
        }
        else if (effect.Bone0 == "Character")//根骨骼上一级,角色,就是不随着b骨骼走,但是随着d_base走
        {
            PositionFollow = mOwner == null ? parent.transform: mOwner.RootdBase;
        }
        else
        {
            PositionFollow = FindFollowed(effect.Bone0);
        }

        if (string.IsNullOrEmpty(effect.Bone1))
        {
            RotateFollow = mOwner == null ? parent.transform : mOwner.transform;
        }
        else
        if (effect.Bone1 == "ROOT")
        {
            RotateFollow = mOwner == null ? parent.transform : mOwner.ROOTNull;
        }
        else if (effect.Bone1 == "Character")
        {
            RotateFollow = mOwner == null ? parent.transform : mOwner.RootdBase;
        }
        else
        {
            RotateFollow = FindFollowed(effect.Bone1);
        }

        if (PositionFollow != null)
        {
            transform.position = PositionFollow.transform.position;
        }

        mRender = gameObject.GetComponent <MeshRenderer>();
        mFilter = gameObject.GetComponent <MeshFilter>();
        int meshIndex = -1;

        if (effect.EffectType == "DONUT")
        {
            //Debug.LogError("find Donut Effect");
        }
        //部分模型是要绕X旋转270的,这样他的缩放,和移动,都只能靠自己
        if (effect.EffectType == "PLANE")
        {
            meshIndex = 0;
        }
        else if (effect.EffectType == "BOX")
        {
            meshIndex = 1;
        }
        else if (effect.EffectType == "DONUT")
        {
            transform.localScale = effect.frames[0].scale;
            meshIndex            = 2;
        }
        else if (effect.EffectType == "MODEL")//自行加载模型
        {
            transform.localScale = effect.frames[0].scale;
            transform.rotation   = RotateFollow.rotation * effect.frames[0].quat;
            transform.position   = PositionFollow.position + effect.frames[0].pos;
            if (!string.IsNullOrEmpty(effect.Tails[0]))
            {
                string[] des = effect.Tails[0].Split(new char[] { '\\' }, System.StringSplitOptions.RemoveEmptyEntries);
                if (des.Length != 0)
                {
                    WsGlobal.ShowMeteorObject(des[des.Length - 1], transform);
                }
            }
            //这个时候,不要用自带的meshfilter了,让他自己处理显示问题,只要告诉他在哪个地方显示
            meshIndex = 100;
        }
        else if (effect.EffectType == "SPHERE")
        {
            meshIndex = 3;
        }
        else if (effect.EffectType == "PARTICLE")
        {
            if (!string.IsNullOrEmpty(effect.Tails[0]))
            {
                PositionFollow = FindFollowed(effect.Tails[0]);
            }
            if (!string.IsNullOrEmpty(effect.Tails[1]))
            {
                RotateFollow = FindFollowed(effect.Tails[1]);
            }
            if (PositionFollow != null)
            {
                transform.position = PositionFollow.transform.position;
            }
            meshIndex = 101;
        }
        else if (effect.EffectType == "CYLINDER")
        {
            //InitializeQuat = new Quaternion(0.7170f, 0, 0, -0.7170f);
            //InitializeQuat = Quaternion.identity;
            meshIndex = 4;
        }
        else if (effect.EffectType == "BILLBOARD")
        {
            LookAtC   = true;
            meshIndex = 5;
        }
        else if (effect.EffectType == "DRAG")
        {
            meshIndex = 6;
        }
        //决定模型
        if (meshIndex != -1 && meshIndex < mesh.Length)
        {
            if (meshIndex == 4)
            {
                mFilter.mesh = SfxMeshGenerator.Instance.CreateCylinder(source.origAtt.y, source.origAtt.x, source.origScale.x);
            }
            else if (meshIndex == 3)
            {
                mFilter.mesh = SfxMeshGenerator.Instance.CreateSphere(source.SphereScale);
            }
            else if (meshIndex == 0)
            {
                mFilter.mesh = SfxMeshGenerator.Instance.CreatePlane(source.origScale.x, source.origScale.y);
            }
            else
            {
                mFilter.mesh = mesh[meshIndex];
            }
        }
        if (effect.Texture.ToLower().EndsWith(".bmp") || effect.Texture.ToLower().EndsWith(".jpg") || effect.Texture.ToLower().EndsWith(".tga"))
        {
            texture = effect.Texture.Substring(0, effect.Texture.Length - 4);
            tex     = Resources.Load <Texture>(texture);
        }
        else if (effect.Texture.ToLower().EndsWith(".ifl"))
        {
            iflTexture         = gameObject.AddComponent <IFLLoader>();
            iflTexture.IFLFile = Resources.Load <TextAsset>(effect.Texture);
            if (effect.EffectType == "PARTICLE")
            {
                iflTexture.SetTargetMeshRenderer(particle.GetComponent <ParticleSystemRenderer>());
            }
            iflTexture.LoadIFL();//传递false表示由特效控制每一帧的切换时间.
            tex = iflTexture.GetTexture(0);
        }
        //else
        //    print("effect contains other prefix:" + effect.Texture == null ? " texture is null" : effect.Texture);
        if (tex != null)
        {
            if (effect.EffectType == "PARTICLE")
            {
                ParticleSystemRenderer render = particle.GetComponent <ParticleSystemRenderer>();
                if (effect.BlendType == 0)
                {
                    render.material.shader = Shader.Find("Unlit/Texture");//普通不透明无光照
                }
                else
                if (effect.BlendType == 1)
                {
                    render.material.shader = Shader.Find("UnlitAdditive");//滤色 加亮 不透明
                }
                else
                if (effect.BlendType == 2)
                {
                    render.material.shader = Shader.Find("UnlitAdditive");//反色+透明度
                }
                else if (effect.BlendType == 3)
                {
                    render.material.shader = Shader.Find("Mobile/Particles/Alpha Blended");//不滤色,支持透明
                }
                else if (effect.BlendType == 4)
                {
                    render.material.shader = Shader.Find("Custom/MeteorBlend4");//滤色,透明
                }
                else
                {
                    render.material.shader = Shader.Find("Unlit/Texture");//普通不透明无光照
                }
                render.material.SetTexture("_MainTex", tex);
                render.material.SetColor("_Color", effect.frames[0].colorRGB);
                render.material.SetColor("_TintColor", effect.frames[0].colorRGB);
                render.material.SetFloat("_Intensity", effect.frames[0].TailFlags[9]);
                //particle.Emit(1);
            }
            else
            {
                if (effect.BlendType == 0)
                {
                    mRender.material.shader = Shader.Find("Unlit/Texture");//普通不透明无光照
                }
                else
                if (effect.BlendType == 1)
                {
                    mRender.material.shader = Shader.Find("UnlitAdditive");//滤色 加亮 不透明
                }
                else
                if (effect.BlendType == 2)
                {
                    mRender.material.shader = Shader.Find("UnlitAdditive");//反色+透明度
                }
                else if (effect.BlendType == 3)
                {
                    mRender.material.shader = Shader.Find("Mobile/Particles/Alpha Blended");//不滤色,支持透明
                }
                else if (effect.BlendType == 4)
                {
                    mRender.material.shader = Shader.Find("Custom/MeteorBlend4");//滤色,透明
                }
                else
                {
                    mRender.material.shader = Shader.Find("Unlit/Texture");//普通不透明无光照
                }
                if (effect.BlendType == 2)
                {
                    mRender.material.SetColor("_InvColor", effect.frames[0].colorRGB);
                }
                else
                {
                    mRender.material.SetColor("_Color", effect.frames[0].colorRGB);
                    mRender.material.SetColor("_TintColor", effect.frames[0].colorRGB);
                }
                mRender.material.SetFloat("_Intensity", effect.frames[0].TailFlags[9]);
                mRender.material.SetTexture("_MainTex", tex);
                if (effect.uSpeed != 0.0f || effect.vSpeed != 0.0f)
                {
                    tex.wrapMode = TextureWrapMode.Repeat;
                }
                else
                {
                    tex.wrapMode = TextureWrapMode.Clamp;
                }
                mRender.material.SetFloat("_u", effect.uSpeed);
                mRender.material.SetFloat("_v", effect.vSpeed);
            }
        }

        if (effect.Hidden == 1)
        {
            if (particle != null)
            {
                ParticleSystemRenderer render = particle.GetComponent <ParticleSystemRenderer>();
                if (render != null)
                {
                    render.enabled = false;
                }
            }
            mRender.enabled = false;
        }
        if (effect.EffectName.StartsWith("Attack"))
        {
            if (effect.EffectType == "SPHERE")
            {
                damageBox = gameObject.AddComponent <SphereCollider>();
            }
            else
            {
                damageBox = gameObject.AddComponent <BoxCollider>();
            }
            damageBox.enabled = false;
        }

        playCoroutine = StartCoroutine(PlayEffectFrame());
    }
Пример #30
0
		public override void CopyParametersTo( ParticleSystemRenderer other )
		{
			BillboardParticleRenderer otherBpr = (BillboardParticleRenderer)other;
			Debug.Assert( otherBpr != null );
			otherBpr.BillboardType = this.BillboardType;
			otherBpr.CommonUpVector = this.CommonUpVector;
			otherBpr.CommonDirection = this.CommonDirection;
		}
Пример #31
0
 private void Awake()
 {
     particle = GetComponent <ParticleSystem>();
     pr       = GetComponent <ParticleSystemRenderer>();
 }
        public static void ParseBillboardType(string[] values, ParticleSystemRenderer _renderer)
        {
            if (values.Length != 1) {
                ParseHelper.LogParserError("billboard_type", _renderer.Type, "Wrong number of parameters.");
                return;
            }

            // lookup the real enum equivalent to the script value
            object val = ScriptEnumAttribute.Lookup(values[0], typeof(BillboardType));

            BillboardParticleRenderer renderer = (BillboardParticleRenderer)_renderer;
            // if a value was found, assign it
            if (val != null)
                renderer.BillboardType = (BillboardType)val;
            else
                ParseHelper.LogParserError("billboard_type", _renderer.Type, "Invalid enum value");
        }
Пример #33
0
 // Use this for initialization
 void Start()
 {
     ps     = this.GetComponent <ParticleSystem>();
     render = this.GetComponent <ParticleSystemRenderer>();
 }
        public static void ParseDepthOffset(string[] values, ParticleSystemRenderer _renderer)
        {
            if (values.Length != 1) {
                ParseHelper.LogParserError("depth_offset", _renderer.Type, "Wrong number of parameters.");
                return;
            }

            BillboardParticleRenderer renderer = (BillboardParticleRenderer)_renderer;
            renderer.DepthOffset = StringConverter.ParseFloat(values[0]);
        }
Пример #35
0
        public override void OnLoad()
        {
            base.OnLoad();
            itemDef.name = "MysticsItems_CrystalWorld";
            SetItemTierWhenAvailable(ItemTier.Tier3);
            itemDef.tags = new ItemTag[]
            {
                ItemTag.Damage,
                ItemTag.Utility,
                ItemTag.AIBlacklist,
                ItemTag.CannotCopy
            };
            itemDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Crystal World/Model.prefab"));
            itemDef.pickupIconSprite  = Main.AssetBundle.LoadAsset <Sprite>("Assets/Items/Crystal World/Icon.png");
            itemDef.pickupModelPrefab.AddComponent <CrystalWorldContainer>();
            itemDisplayPrefab = PrepareItemDisplayModel(PrefabAPI.InstantiateClone(itemDef.pickupModelPrefab, itemDef.pickupModelPrefab.name + "Display", false));
            onSetupIDRS      += () =>
            {
                AddDisplayRule("CommandoBody", "Stomach", new Vector3(-0.17426F, 0.07766F, -0.05266F), new Vector3(16.68701F, 66.665F, 36.228F), new Vector3(0.042F, 0.042F, 0.042F));
                AddDisplayRule("HuntressBody", "Muzzle", new Vector3(-0.1516F, -0.0345F, -0.09869F), new Vector3(355.162F, 32.177F, 180.96F), new Vector3(0.042F, 0.042F, 0.042F));
                AddDisplayRule("Bandit2Body", "Stomach", new Vector3(0.19815F, 0.04837F, 0.02337F), new Vector3(350.191F, 244.703F, 340.178F), new Vector3(0.037F, 0.037F, 0.037F));
                AddDisplayRule("ToolbotBody", "Chest", new Vector3(3.83001F, 1.891F, 0.03063F), new Vector3(29.795F, 9.384F, 2.716F), new Vector3(0.489F, 0.489F, 0.489F));
                AddDisplayRule("EngiBody", "Chest", new Vector3(-0.20791F, 0.30973F, 0.18735F), new Vector3(4.991F, 46.464F, 181.437F), new Vector3(0.065F, 0.065F, 0.065F));
                AddDisplayRule("EngiTurretBody", "Head", new Vector3(0F, 0.56045F, 0F), new Vector3(33.04002F, 48.09F, 359.072F), new Vector3(0.168F, 0.168F, 0.168F));
                AddDisplayRule("EngiWalkerTurretBody", "Head", new Vector3(0F, 0.78124F, 0.82794F), new Vector3(22.677F, 152.024F, 24.393F), new Vector3(0.134F, 0.163F, 0.131F));
                AddDisplayRule("MageBody", "Chest", new Vector3(0.06498F, 0.25775F, 0.30228F), new Vector3(0.366F, 347.899F, 165.881F), new Vector3(0.0827F, 0.0827F, 0.0827F));
                AddDisplayRule("MercBody", "HandR", new Vector3(0.00372F, 0.11846F, 0.0863F), new Vector3(0F, 0F, 0F), new Vector3(0.07229F, 0.07229F, 0.07217F));
                AddDisplayRule("TreebotBody", "FlowerBase", new Vector3(-0.45015F, 0.77395F, -0.18053F), new Vector3(0F, 0F, 0F), new Vector3(0.29135F, 0.29135F, 0.29135F));
                AddDisplayRule("LoaderBody", "MechUpperArmL", new Vector3(0.07707F, 0.07703F, -0.00595F), new Vector3(7.628F, 218.893F, 342.184F), new Vector3(0.10413F, 0.10413F, 0.10413F));
                AddDisplayRule("CrocoBody", "SpineChest2", new Vector3(-1.42325F, 2.10075F, 1.05927F), new Vector3(337.83F, 226.76F, 273.311F), new Vector3(0.411F, 0.411F, 0.411F));
                AddDisplayRule("CaptainBody", "MuzzleGun", new Vector3(-0.0034F, 0.03444F, -0.31976F), new Vector3(0F, 0F, 0F), new Vector3(0.04057F, 0.03674F, 0.04057F));
                AddDisplayRule("BrotherBody", "UpperArmL", new Vector3(0.02255F, -0.01451F, -0.00259F), new Vector3(303.36F, 82.77999F, 101.5723F), new Vector3(0.05297F, 0.08504F, 0.08504F));
                AddDisplayRule("ScavBody", "UpperArmL", new Vector3(0.32551F, 0.61566F, 1.17648F), new Vector3(0F, 0F, 0F), new Vector3(2.65712F, 2.73031F, 2.65712F));
                if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper)
                {
                    AddDisplayRule("SniperClassicBody", "Chest", new Vector3(0.1151F, 0.32048F, -0.33018F), new Vector3(10.681F, 0.007F, 0.071F), new Vector3(0.07588F, 0.07588F, 0.07588F));
                }
                AddDisplayRule("RailgunnerBody", "Backpack", new Vector3(0.09864F, 0.17726F, -0.08467F), new Vector3(0F, 0F, 0F), new Vector3(0.09998F, 0.09998F, 0.09998F));
                AddDisplayRule("VoidSurvivorBody", "Chest", new Vector3(0.36683F, 0.1762F, 0.00002F), new Vector3(0F, 0F, 0F), new Vector3(0.16615F, 0.16615F, 0.16615F));
            };
            ballPrefab = PrefabAPI.InstantiateClone(itemDef.pickupModelPrefab, "MysticsItems_CrystalWorldBall", false);

            // DefaultDisplayRule("Head", new Vector3(0f, 0.5f, 0f), new Vector3(0f, -90f, 180f), new Vector3(0.2f, 0.2f, 0.2f));

            /*
             * How the world projection works:
             * When a model (aka a World Container) is spawned in, a random Crystal World is also created at very distant coords
             * Each Crystal World has a Camera that renders the World to a RenderTexture, with a custom skybox
             * Each active camera has a Projector child that draws the RenderTexture as billboards where the Containers are right now, and outputs it into the final Projection RenderTexture
             * Active cameras also have a Container Prerender component that sets every active container's inner display texture to the texture with projections
             */

            // Register all worlds using the same code block
            string[] worldsToLoad =
            {
                "Crystallize",
                "In Circles"
            };
            foreach (string worldName in worldsToLoad)
            {
                GameObject world        = Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Crystal World/Worlds/" + worldName + ".prefab");
                GameObject cameraObject = world.transform.Find("CameraPivot").Find("Camera").gameObject;
                cameraObject.AddComponent <CrystalWorldCamera>();
                RenderTexture renderTexture = null;
                if (!Main.isDedicatedServer)
                {
                    renderTexture = new RenderTexture(1028, 1028, 0, RenderTextureFormat.ARGB32)
                    {
                        name = "Crystal World \"" + worldName + "\""
                    }
                }
                ;
                cameraObject.GetComponent <Camera>().targetTexture = renderTexture;
                foreach (Transform worldObjectTransform in world.transform)
                {
                    GameObject worldObject = worldObjectTransform.gameObject;
                    Renderer   renderer    = worldObject.GetComponent <MeshRenderer>();
                    if (renderer)
                    {
                        Material material = renderer.material;
                        if (material.shader.name == "Standard")
                        {
                            HopooShaderToMaterial.Standard.Apply(material);
                            HopooShaderToMaterial.Standard.DisableEverything(material);
                        }
                    }
                }
                // Run specific per-world code
                switch (worldName)
                {
                case "Crystallize":
                    ParticleSystemRenderer snowRenderer = world.transform.Find("Snow").gameObject.GetComponent <ParticleSystemRenderer>();
                    Material snowMaterial = new Material(HopooShaderToMaterial.Standard.shader);
                    snowRenderer.material = snowMaterial;
                    HopooShaderToMaterial.Standard.Emission(snowMaterial, 2f, Color.white);
                    break;
                }
                worlds.Add(new WorldInfo
                {
                    prefab            = world,
                    shownInContainers = new List <GameObject>(),
                    renderTexture     = renderTexture
                });
            }

            On.RoR2.SceneCamera.Awake += (orig, self) =>
            {
                orig(self);
                GameObject projector = new GameObject
                {
                    name = "Crystal World Projector"
                };
                projector.transform.SetParent(self.transform);
                projector.transform.localPosition = Vector3.zero;
                projector.transform.localRotation = Quaternion.identity;
                CrystalWorldProjector          component          = projector.AddComponent <CrystalWorldProjector>();
                CrystalWorldContainerPrerender prerenderComponent = self.gameObject.AddComponent <CrystalWorldContainerPrerender>();
                prerenderComponent.renderTexture = component.projectionRenderTexture;
            };

            pulsePrefab = Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Crystal World/Explosion.prefab");
            EffectComponent effectComponent = pulsePrefab.AddComponent <EffectComponent>();

            effectComponent.applyScale      = true;
            effectComponent.disregardZScale = false;
            effectComponent.soundName       = "Play_item_proc_iceRingSpear";
            VFXAttributes vfxAttributes = pulsePrefab.AddComponent <VFXAttributes>();

            vfxAttributes.vfxPriority  = VFXAttributes.VFXPriority.Always;
            vfxAttributes.vfxIntensity = VFXAttributes.VFXIntensity.Medium;
            pulsePrefab.AddComponent <DestroyOnTimer>().duration = 1f;

            GameObject     ppHolder = pulsePrefab.transform.Find("PP").gameObject;
            SphereCollider ppSphere = ppHolder.AddComponent <SphereCollider>();

            ppSphere.radius    = 60f;
            ppSphere.isTrigger = true;
            ppHolder.layer     = LayerIndex.postProcess.intVal;
            PostProcessVolume pp = ppHolder.AddComponent <PostProcessVolume>();

            pp.blendDistance = 30f;
            pp.isGlobal      = false;
            pp.weight        = 0.2f;
            pp.priority      = 10;
            PostProcessProfile ppProfile = ScriptableObject.CreateInstance <PostProcessProfile>();

            ppProfile.name = "ppCrystalWorldExplosion";
            ColorGrading colorGrading = ppProfile.AddSettings <ColorGrading>();
            Color        c            = Color.white;
            float        intensity    = 3f;

            c.r *= intensity; c.g *= intensity; c.b *= intensity;
            colorGrading.colorFilter.value         = c;
            colorGrading.colorFilter.overrideState = true;
            colorGrading.saturation.value          = -100f;
            colorGrading.saturation.overrideState  = true;
            colorGrading.contrast.value            = -100f;
            colorGrading.contrast.overrideState    = true;
            pp.sharedProfile = ppProfile;

            PostProcessDuration postProcessDuration = ppHolder.AddComponent <PostProcessDuration>();

            postProcessDuration.ppVolume      = pp;
            postProcessDuration.ppWeightCurve = new AnimationCurve
            {
                keys = new Keyframe[]
                {
                    new Keyframe(0f, 0.35f),
                    new Keyframe(1f, 0f)
                }
            };
            postProcessDuration.maxDuration = 1f;

            MysticsItemsContent.Resources.effectPrefabs.Add(pulsePrefab);

            On.RoR2.HoldoutZoneController.Awake += (orig, self) =>
            {
                orig(self);
                MysticsItemsCrystalWorldTeleporterEffect component = self.GetComponent <MysticsItemsCrystalWorldTeleporterEffect>();
                if (!component)
                {
                    component = self.gameObject.AddComponent <MysticsItemsCrystalWorldTeleporterEffect>();
                    switch (MysticsRisky2Utils.Utils.TrimCloneFromString(self.gameObject.name))
                    {
                    case "Teleporter1":
                        component.displayModel = true;
                        component.offset       = new Vector3(0f, 3f, 0f);
                        break;

                    case "LunarTeleporter Variant":
                        component.displayModel = true;
                        component.offset       = new Vector3(0f, 3f, 0f);
                        break;
                    }
                }
            };
        }
 public override void CopyParametersTo(ParticleSystemRenderer other)
 {
     BillboardParticleRenderer otherBpr = (BillboardParticleRenderer)other;
     Debug.Assert(otherBpr != null);
     otherBpr.BillboardType = this.BillboardType;
     otherBpr.BillboardOrigin = this.BillboardOrigin;
     otherBpr.CommonUpVector = this.CommonUpVector;
     otherBpr.CommonDirection = this.CommonDirection;
     otherBpr.DepthOffset = this.DepthOffset;
     otherBpr.UseAccurateFacing = this.UseAccurateFacing;
 }
Пример #37
0
 void Start()
 {
     particleRenderer = GetComponent <ParticleSystemRenderer>();
 }
Пример #38
0
 public dynamic LoadComponent(Stream stream, int index, NotLoaded comp)
 {
     stream.Position = comp.offset;
     try
     {
         switch (comp.classID1)
         {
         case UnityClassID.AnimationClip:
             {
                 AnimationClip animationClip = new AnimationClip(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, animationClip, comp);
                 animationClip.LoadFrom(stream);
                 return animationClip;
             }
         case UnityClassID.Animator:
             {
                 Animator animator = new Animator(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, animator, comp);
                 animator.LoadFrom(stream);
                 return animator;
             }
         case UnityClassID.AnimatorController:
             {
                 AnimatorController animatorController = new AnimatorController(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, animatorController, comp);
                 animatorController.LoadFrom(stream);
                 return animatorController;
             }
         case UnityClassID.AssetBundle:
             {
                 AssetBundle assetBundle = new AssetBundle(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, assetBundle, comp);
                 assetBundle.LoadFrom(stream);
                 return assetBundle;
             }
         case UnityClassID.AudioClip:
             {
                 if (loadingReferencials)
                 {
                     return comp;
                 }
                 AudioClip ac = new AudioClip(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, ac, comp);
                 ac.LoadFrom(stream);
                 return ac;
             }
         case UnityClassID.AudioListener:
             {
                 AudioListener audioListener = new AudioListener(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, audioListener, comp);
                 audioListener.LoadFrom(stream);
                 return audioListener;
             }
         case UnityClassID.AudioSource:
             {
                 AudioSource audioSrc = new AudioSource(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, audioSrc, comp);
                 audioSrc.LoadFrom(stream);
                 return audioSrc;
             }
         case UnityClassID.Avatar:
             {
                 if (loadingReferencials)
                 {
                     return comp;
                 }
                 Avatar avatar = new Avatar(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, avatar, comp);
                 avatar.LoadFrom(stream);
                 return avatar;
             }
         case UnityClassID.BoxCollider:
             {
                 BoxCollider boxCol = new BoxCollider(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, boxCol, comp);
                 boxCol.LoadFrom(stream);
                 return boxCol;
             }
         case UnityClassID.Camera:
             {
                 Camera camera = new Camera(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, camera, comp);
                 camera.LoadFrom(stream);
                 return camera;
             }
         case UnityClassID.CapsuleCollider:
             {
                 CapsuleCollider capsuleCol = new CapsuleCollider(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, capsuleCol, comp);
                 capsuleCol.LoadFrom(stream);
                 return capsuleCol;
             }
         case UnityClassID.Cubemap:
             {
                 Cubemap cubemap = new Cubemap(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, cubemap, comp);
                 cubemap.LoadFrom(stream);
                 Parser.Textures.Add(cubemap);
                 return cubemap;
             }
         case UnityClassID.EllipsoidParticleEmitter:
             {
                 EllipsoidParticleEmitter ellipsoid = new EllipsoidParticleEmitter(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, ellipsoid, comp);
                 ellipsoid.LoadFrom(stream);
                 return ellipsoid;
             }
         case UnityClassID.FlareLayer:
             {
                 FlareLayer flareLayer = new FlareLayer(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, flareLayer, comp);
                 flareLayer.LoadFrom(stream);
                 return flareLayer;
             }
         case UnityClassID.Light:
             {
                 Light light = new Light(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, light, comp);
                 light.LoadFrom(stream);
                 return light;
             }
         case UnityClassID.LinkToGameObject:
             {
                 LinkToGameObject link = new LinkToGameObject(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, link, comp);
                 link.LoadFrom(stream);
                 return link;
             }
         case UnityClassID.LinkToGameObject223:
             {
                 LinkToGameObject223 link = new LinkToGameObject223(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, link, comp);
                 link.LoadFrom(stream);
                 return link;
             }
         case UnityClassID.LinkToGameObject225:
             {
                 LinkToGameObject225 link = new LinkToGameObject225(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, link, comp);
                 link.LoadFrom(stream);
                 return link;
             }
         case UnityClassID.GameObject:
             {
                 GameObject gameObj = new GameObject(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, gameObj, comp);
                 gameObj.LoadFrom(stream);
                 return gameObj;
             }
         case UnityClassID.Material:
             {
                 Material mat = new Material(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, mat, comp);
                 mat.LoadFrom(stream);
                 return mat;
             }
         case UnityClassID.Mesh:
             {
                 if (loadingReferencials)
                 {
                     return comp;
                 }
                 Mesh mesh = new Mesh(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, mesh, comp);
                 mesh.LoadFrom(stream);
                 return mesh;
             }
         case UnityClassID.MeshCollider:
             {
                 MeshCollider meshCol = new MeshCollider(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, meshCol, comp);
                 meshCol.LoadFrom(stream);
                 return meshCol;
             }
         case UnityClassID.MeshFilter:
             {
                 MeshFilter meshFilter = new MeshFilter(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, meshFilter, comp);
                 meshFilter.LoadFrom(stream);
                 return meshFilter;
             }
         case UnityClassID.MeshRenderer:
             {
                 MeshRenderer meshRenderer = new MeshRenderer(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, meshRenderer, comp);
                 meshRenderer.LoadFrom(stream);
                 return meshRenderer;
             }
         default:
             if (comp.classID2 == UnityClassID.MonoBehaviour)
             {
                 if (Types.Count > 0)
                 {
                     MonoBehaviour monoBehaviour = new MonoBehaviour(this, comp.pathID, comp.classID1, comp.classID2);
                     ReplaceSubfile(index, monoBehaviour, comp);
                     monoBehaviour.LoadFrom(stream);
                     return monoBehaviour;
                 }
                 else
                 {
                     string message = comp.classID2 + " unhandled because of absence of Types in Cabinet (*.assets)";
                     if (!reported.Contains(message))
                     {
                         Report.ReportLog(message);
                         reported.Add(message);
                     }
                     return comp;
                 }
             }
             else
             {
                 string message = "Unhandled class: " + comp.classID1 + "/" + comp.classID2;
                 if (!reported.Contains(message))
                 {
                     Report.ReportLog(message);
                     reported.Add(message);
                 }
             }
             break;
         case UnityClassID.MonoScript:
             {
                 if (loadingReferencials)
                 {
                     return comp;
                 }
                 MonoScript monoScript = new MonoScript(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, monoScript, comp);
                 monoScript.LoadFrom(stream);
                 return monoScript;
             }
         case UnityClassID.MultiLink:
             {
                 MultiLink multi = new MultiLink(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, multi, comp);
                 multi.LoadFrom(stream);
                 return multi;
             }
         case UnityClassID.ParticleAnimator:
             {
                 ParticleAnimator particleAnimator = new ParticleAnimator(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, particleAnimator, comp);
                 particleAnimator.LoadFrom(stream);
                 return particleAnimator;
             }
         case UnityClassID.ParticleRenderer:
             {
                 ParticleRenderer particleRenderer = new ParticleRenderer(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, particleRenderer, comp);
                 particleRenderer.LoadFrom(stream);
                 return particleRenderer;
             }
         case UnityClassID.ParticleSystem:
             {
                 ParticleSystem particleSystem = new ParticleSystem(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, particleSystem, comp);
                 particleSystem.LoadFrom(stream);
                 return particleSystem;
             }
         case UnityClassID.ParticleSystemRenderer:
             {
                 ParticleSystemRenderer particleSystemRenderer = new ParticleSystemRenderer(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, particleSystemRenderer, comp);
                 particleSystemRenderer.LoadFrom(stream);
                 return particleSystemRenderer;
             }
         case UnityClassID.Projector:
             {
                 Projector projector = new Projector(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, projector, comp);
                 projector.LoadFrom(stream);
                 return projector;
             }
         case UnityClassID.Rigidbody:
             {
                 RigidBody rigidBody = new RigidBody(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, rigidBody, comp);
                 rigidBody.LoadFrom(stream);
                 return rigidBody;
             }
         case UnityClassID.Shader:
             {
                 Shader shader = new Shader(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, shader, comp);
                 shader.LoadFrom(stream);
                 return shader;
             }
         case UnityClassID.SkinnedMeshRenderer:
             {
                 SkinnedMeshRenderer sMesh = new SkinnedMeshRenderer(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, sMesh, comp);
                 sMesh.LoadFrom(stream);
                 return sMesh;
             }
         case UnityClassID.SphereCollider:
             {
                 SphereCollider sphereCol = new SphereCollider(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, sphereCol, comp);
                 sphereCol.LoadFrom(stream);
                 return sphereCol;
             }
         case UnityClassID.Sprite:
             {
                 Sprite sprite = new Sprite(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, sprite, comp);
                 sprite.LoadFrom(stream);
                 return sprite;
             }
         case UnityClassID.SpriteRenderer:
             {
                 SpriteRenderer spriteRenderer = new SpriteRenderer(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, spriteRenderer, comp);
                 spriteRenderer.LoadFrom(stream);
                 return spriteRenderer;
             }
         case UnityClassID.TextAsset:
             {
                 if (loadingReferencials)
                 {
                     return comp;
                 }
                 TextAsset ta = new TextAsset(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, ta, comp);
                 ta.LoadFrom(stream);
                 return ta;
             }
         case UnityClassID.Texture2D:
             {
                 if (loadingReferencials)
                 {
                     return comp;
                 }
                 Texture2D tex = new Texture2D(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, tex, comp);
                 tex.LoadFrom(stream);
                 Parser.Textures.Add(tex);
                 return tex;
             }
         case UnityClassID.Transform:
             {
                 Transform trans = new Transform(this, comp.pathID, comp.classID1, comp.classID2);
                 ReplaceSubfile(index, trans, comp);
                 trans.LoadFrom(stream);
                 return trans;
             }
         }
     }
     catch
     {
         Report.ReportLog("Failed to load " + comp.classID1 + "/" + comp.classID2 + " PathID=" + comp.pathID);
         foreach (NotLoaded notLoaded in RemovedList)
         {
             if (notLoaded == comp)
             {
                 RemovedList.Remove(notLoaded);
                 Components.RemoveAt(index);
                 notLoaded.replacement = null;
                 Components.Insert(index, notLoaded);
                 break;
             }
         }
     }
     return null;
 }
Пример #39
0
        /// <summary>
        /// 计算这个Unit的AABB
        /// </summary>
        /// <returns>false:无法计算出这个Unit的AABB</returns>
        protected virtual bool CaculateAABB(bool isExporting, ref Bounds aabb)
        {
            Renderer[] renderers = transform.GetComponentsInChildren <Renderer>();
            // 用来防止Encapsulate(new Bounds())
            bool initializedAABB = false;

            for (int iRenderer = 0; iRenderer < renderers.Length; iRenderer++)
            {
                Renderer iterRenderer = renderers[iRenderer];
                if (iterRenderer is ParticleSystemRenderer)
                {
                    continue;
                }

                if (initializedAABB)
                {
                    aabb.Encapsulate(iterRenderer.bounds);
                }
                else
                {
                    initializedAABB = true;
                    aabb            = iterRenderer.bounds;
                }
            }

            ParticleSystem[] particleSystems = transform.GetComponentsInChildren <ParticleSystem>();
            for (int iParticle = 0; iParticle < particleSystems.Length; iParticle++)
            {
                ParticleSystem iterParticle = particleSystems[iParticle];
                Bounds         particleAABB;
                // 只有导出时才计算粒子的AABB,否则只计算粒子的坐标
                if (isExporting)
                {
                    ParticleSystemRenderer iterRenderer = iterParticle.GetComponent <ParticleSystemRenderer>();
                    if (iterRenderer)
                    {
                        particleAABB = iterRenderer.bounds;
                    }
                    else
                    {
                        particleAABB = new Bounds(iterParticle.transform.position, Vector3.zero);
                    }
                }
                else
                {
                    particleAABB = new Bounds(iterParticle.transform.position, Vector3.zero);
                }

                if (initializedAABB)
                {
                    aabb.Encapsulate(particleAABB);
                }
                else
                {
                    initializedAABB = true;
                    aabb            = particleAABB;
                }
            }

            return(initializedAABB);
        }