Beispiel #1
0
    static void _CopyParticleSystem(ParticleSystem original, GameObject copyTo)
    {
        ParticleSystem ps = null;

        if ((ps = copyTo.GetComponent <ParticleSystem>()) == null)
        {
            ps = copyTo.AddComponent <ParticleSystem>();
        }
        SerializedObject   newPsSerial = new SerializedObject(ps);
        SerializedObject   srcPsSerial = new SerializedObject(original);
        SerializedProperty srcProperty = srcPsSerial.FindProperty("InitialModule.startLifetime");

        LegacyToShurikenConverter.SetShurikenMinMaxCurve(newPsSerial, "InitialModule.startLifetime", 0.3f, 0.4f, true);
        newPsSerial.Update();
    }
Beispiel #2
0
 void ConvertLegacyParticles()
 {
     systemParent = LegacyToShurikenConverter.Convert(systemParent);
     UpdateParent(systemParent);
 }
Beispiel #3
0
    void BakeAtlas()
    {
        UpdateParent(systemParent);

        if (!parentIsOk)
        {
            return;
        }
        if (viewDirection == Vector3.zero)
        {
            return;
        }

        finalTime = (overrideSystemDuration) ? customDuration : systemDuration;

        GameObject cam = new GameObject("__Camera", typeof(Camera));

        cam.transform.rotation       = Quaternion.LookRotation(viewDirection);
        renderCamera                 = cam.camera;
        renderCamera.orthographic    = true;
        renderCamera.backgroundColor = bgColor == BackgroundColor.Black ? new Color(0, 0, 0, 0) : new Color(0.5f, 0.5f, 0.5f, 0);
        renderCamera.cullingMask     = 1 << useLayer;

        GameObject lighte = new GameObject("__Light", typeof(Light));

        lighte.transform.rotation = Quaternion.LookRotation(lightDirection);
        lighte.light.renderMode   = LightRenderMode.ForcePixel;
        lighte.light.type         = LightType.Directional;
        lighte.light.color        = dirLightColor;

        RenderTexture rt = new RenderTexture(cellSizeX, cellSizeY, 16);

        rt.isPowerOfTwo            = true;
        renderCamera.targetTexture = rt;

        bool  oldfog     = RenderSettings.fog;
        Color oldAmbient = RenderSettings.ambientLight;

        RenderSettings.fog          = false;
        RenderSettings.ambientLight = ambientLightColor;

        bool hasAlpha    = false;
        bool hasSolid    = false;
        bool hasAdditive = false;

        OriginalRendererState[] oldStates = new OriginalRendererState[renderers.Length];
        for (int i1 = 0; i1 < renderers.Length; i1++)
        {
            OriginalRendererState s = new OriginalRendererState();
            s.layer     = renderers[i1].gameObject.layer;
            s.materials = renderers[i1].sharedMaterials;
            List <Material> newMaterials = new List <Material>();
            foreach (Material m in renderers[i1].sharedMaterials)
            {
                if (!hasAlpha)
                {
                    hasAlpha = m.shader.name.Contains("Alpha Blended");
                }
                if (!hasSolid)
                {
                    hasSolid = !m.shader.name.Contains("Particle") && !m.shader.name.Contains("Transparent");
                }
                if (!hasAdditive)
                {
                    hasAdditive = m.shader.name.Contains("Additive");
                }
            }
            foreach (Material m in renderers[i1].sharedMaterials)
            {
                bool bg = m.shader.name.Contains("Particle") && m.shader.name.Contains("Additive") && !hasAlpha;
                if (bg)
                {
                    Material newMat = new Material(m);
                    if (newMat.HasProperty("_Color"))
                    {
                        newMat.color = Color.Lerp(newMat.color, Color.clear, 0.3f);
                    }
                    if (newMat.HasProperty("_TintColor"))
                    {
                        newMat.SetColor("_TintColor", Color.Lerp(newMat.GetColor("_TintColor"), Color.clear, 0.3f));
                    }
                    newMat.shader = Shader.Find("Particles/Alpha Blended");
                    newMaterials.Add(newMat);
                }
                Material newMat1 = new Material(m);
                if (newMat1.shader.name == "Particles/Additive")
                {
                    newMat1.shader = addPlusOne;
                }
                if (newMat1.shader.name == "Particles/Additive (Soft)")
                {
                    newMat1.shader = addSoftPlusOne;
                }
                if (bg)
                {
                    if (newMat1.HasProperty("_Color"))
                    {
                        newMat1.color = Color.Lerp(newMat1.color, Color.clear, 0.3f);
                    }
                    if (newMat1.HasProperty("_TintColor"))
                    {
                        newMat1.SetColor("_TintColor", Color.Lerp(newMat1.GetColor("_TintColor"), Color.clear, 0.3f));
                    }
                }
                newMaterials.Add(newMat1);
            }
            renderers[i1].sharedMaterials = newMaterials.ToArray();
            oldStates[i1] = s;
            renderers[i1].gameObject.layer = useLayer;
        }


        //	sets systemBounds & usedBoundsCenter
        GetBounds();

        cam.transform.position        = usedBoundsCenter - viewDirection.normalized * systemBounds.size.z * 1.4f * cameraPad;
        renderCamera.aspect           = (float)cellSizeX / cellSizeY;
        renderCamera.orthographicSize = Mathf.Max(systemBounds.extents.x / renderCamera.aspect, systemBounds.extents.y) * cameraPad;
        renderCamera.nearClipPlane    = systemBounds.size.z * 0.25f * cameraPad;
        renderCamera.farClipPlane     = systemBounds.size.z * 3 * cameraPad;


        Texture2D copyTex = new Texture2D(cellSizeX, cellSizeY, TextureFormat.RGB24, false);
        //Texture2D copyTex2 = new Texture2D( cellSizeX*0.5f, cellSizeY*0.5f, TextureFormat.RGB24, false );
        Texture2D tex  = new Texture2D(atlasSizeX, atlasSizeY, TextureFormat.ARGB32, false);
        Texture2D texA = new Texture2D(atlasSizeX, atlasSizeY, TextureFormat.ARGB32, false);

        RenderSheet(copyTex, renderCamera, tex);

        renderCamera.backgroundColor = Color.black;
        for (int i1 = 0; i1 < renderers.Length; i1++)
        {
            List <Material> newMaterials = new List <Material>();
            foreach (Material m in oldStates[i1].materials)
            {
                Material newMat = new Material(m);
                if (m.shader.name.Contains("Particle"))
                {
                    newMat.shader = m.shader.name.Contains("Additive") ? addAlpha : blendAlpha;
                }
                else
                {
                    newMat.shader = solidAlpha;
                }
                newMaterials.Add(newMat);
            }
            renderers[i1].sharedMaterials = newMaterials.ToArray();
        }

        RenderSheet(copyTex, renderCamera, texA);

        for (var i1 = 0; i1 < renderers.Length; i1++)
        {
            renderers[i1].gameObject.layer = oldStates[i1].layer;
            renderers[i1].sharedMaterials  = oldStates[i1].materials;
        }

        int   x          = 0;
        int   y          = 0;
        float avgHueTilt = 0f;
        float avgHueDist = 0f;

        while (x < tex.width)
        {
            y = 0;
            while (y < tex.height)
            {
                Color    c   = tex.GetPixel(x, y);
                HSBColor hsb = HSBColor.FromColor(c);
                Color    cA  = texA.GetPixel(x, y);
                float    a   = (cA.r + cA.g + cA.b) * 0.33f;
                Vector4  cv  = new Vector4(c.r, c.g, c.b, 1);
                if (bgColor == BackgroundColor.Gray)
                {
                    Vector4 delta = new Vector4(c.r - 0.5f, c.g - 0.5f, c.b - 0.5f, 1);
                    if (a != 0)
                    {
                        cv += delta / a;
                    }
                }
                else
                {
                    cv /= a;
                }
                Color    nc   = new Color(cv.x, cv.y, cv.z, a * a);
                HSBColor nhsb = HSBColor.FromColor(nc);
                nhsb.h = hsb.h;
                float tilt = nhsb.h - (float)((int)nhsb.h % 60);
                avgHueTilt += tilt;
                avgHueDist += Mathf.Abs(tilt);
                tex.SetPixel(x, y, HSBColor.ToColor(nhsb));
                y++;
            }
            x++;
        }
        if (autoHueAdjust > 1f)
        {
            avgHueDist /= (tex.width * tex.height);
            for (x = 0; x < tex.width; x++)
            {
                for (y = 0; y < tex.height; y++)
                {
                    Color    c   = tex.GetPixel(x, y);
                    HSBColor hsb = HSBColor.FromColor(c);
                    hsb.h += avgHueDist * (autoHueAdjust * 0.01f) * (avgHueTilt > 0 ? -1 : 1);
                    tex.SetPixel(x, y, HSBColor.ToColor(hsb));
                }
            }
        }
        tex.Apply();

        path = EditorUtility.SaveFilePanelInProject("Save texture as PNG", path, "png", "Please enter a file name to save the texture to");
        if (path.Length != 0)
        {
            byte[] bytes = tex.EncodeToPNG();
            if (bytes != null)
            {
                File.WriteAllBytes(path, bytes);
                AssetDatabase.Refresh();
            }
        }

        RenderTexture.active = null;

        DestroyImmediate(copyTex);
        DestroyImmediate(tex);
        DestroyImmediate(texA);
        DestroyImmediate(rt);
        DestroyImmediate(lighte);

        RenderSettings.fog          = oldfog;
        RenderSettings.ambientLight = oldAmbient;

        float origSize = renderCamera.orthographicSize * 2;

        Vector3    pos        = systemParent.position + Vector3.right * origSize;
        Quaternion rot        = systemParent.rotation;
        Vector3    localScale = Vector3.one;
        Transform  p          = null;

        if (systemTarget)
        {
            pos        = systemTarget.position;
            rot        = systemTarget.rotation;
            localScale = systemTarget.localScale;
            p          = systemTarget.parent;
            DestroyImmediate(systemTarget.gameObject);
        }

        systemTarget = Instantiate(systemParent, pos, rot) as Transform;
        systemTarget.gameObject.name = systemParent.gameObject.name + " packed";
        systemTarget.parent          = p;
        systemTarget.localScale      = localScale;

        List <Renderer>              theRenderers       = new List <Renderer>();
        List <Animation>             theAnimations      = new List <Animation>();
        List <SpritePackerAnimation> theProviders       = new List <SpritePackerAnimation>();
        List <ParticleSystem>        theParticleSystems = new List <ParticleSystem>();

        //List<ParticleEmitter> theParticleEmitters = new List<ParticleEmitter>();
        //FindAllInterestingComponents(theRenderers, theAnimations, theProviders, theParticleSystems, theParticleEmitters, systemTarget);
        FindAllInterestingComponents(theRenderers, theAnimations, theProviders, theParticleSystems, systemTarget);
        foreach (Renderer r in theRenderers)
        {
            DestroyImmediate(r);
        }
        foreach (Animation r in theAnimations)
        {
            DestroyImmediate(r);
        }
        //foreach(SpritePackerAnimation r in theProviders)  Destroy(r);
        foreach (ParticleSystem r in theParticleSystems)
        {
            DestroyImmediate(r);
        }
        //foreach(ParticleEmitter r in theParticleEmitters)  DestroyImmediate(r);
        List <GameObject> objects = new List <GameObject>();

        FindAllGameObjects(objects, systemTarget);
        foreach (GameObject g in objects)
        {
            g.transform.parent = systemTarget;
        }
        foreach (GameObject g in objects)
        {
            Component[] cs = g.GetComponents <Component>();
            if (cs.Length == 1)
            {
                DestroyImmediate(g);
            }
        }

        GameObject go = new GameObject(systemParent.name + " sprite");

        go.transform.parent        = systemTarget;
        go.transform.localPosition = systemParent.InverseTransformPoint(usedBoundsCenter);

        ParticleSystem         ps        = go.AddComponent <ParticleSystem>();
        ParticleSystemRenderer psr       = go.GetComponent <ParticleSystemRenderer>();
        SerializedObject       psSerial  = new SerializedObject(ps);
        SerializedObject       psrSerial = new SerializedObject(psr);

        psSerial.Update();
        psrSerial.Update();

        psSerial.FindProperty("UVModule.enabled").boolValue = true;
        psSerial.FindProperty("UVModule.tilesX").intValue   = numberOfColumns;
        psSerial.FindProperty("UVModule.tilesY").intValue   = numberOfRows;

        psSerial.FindProperty("EmissionModule.m_BurstCount").intValue = 1;
        psSerial.FindProperty("EmissionModule.time0").floatValue      = 0;
        psSerial.FindProperty("EmissionModule.cnt0").intValue         = 1;
        LegacyToShurikenConverter.SetShurikenMinMaxCurve(psSerial, "EmissionModule.rate", 0, 0, true);

        psSerial.FindProperty("lengthInSec").floatValue = finalTime;
        LegacyToShurikenConverter.SetShurikenMinMaxCurve(psSerial, "InitialModule.startLifetime", finalTime - 0.01f, finalTime - 0.01f, true);
        LegacyToShurikenConverter.SetShurikenMinMaxCurve(psSerial, "InitialModule.startSize", origSize, origSize, true);

        psSerial.FindProperty("ShapeModule.radius").floatValue = 0;

        psSerial.FindProperty("ShapeModule.type").intValue = (int)ShapeTypes.Sphere;

        LegacyToShurikenConverter.SetShurikenMinMaxCurve(psSerial, "InitialModule.startSpeed", 0, 0, true);

        psSerial.ApplyModifiedProperties();
        psrSerial.ApplyModifiedProperties();

        string name1 = hasAlpha || hasSolid || !hasAdditive ? "SpritePacker/PackedBlend" : "SpritePacker/PackedAdditive";

        if (hasSolid && !hasAlpha && !hasAdditive)
        {
            name1 = "SpritePacker/PackedCutout";
        }
        Material mat = new Material(Shader.Find(name1));

        mat.mainTexture = AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)) as Texture2D;

        psr.sharedMaterial = mat;

        DestroyImmediate(cam);

        Debug.Log("Create Particle Animation done, saved to:  " + path);

        if (path.LastIndexOf("/") != -1)
        {
            path = path.Substring(path.LastIndexOf("/") + 1);
        }
    }