Пример #1
0
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        IFLLoader myTarget = (IFLLoader)target;

        if (GUILayout.Button("LoadIFL"))
        {
            myTarget.LoadIFL();
        }
    }
Пример #2
0
    //GMB文件合并了网格,应该是不用设置位置和旋转了
    public void GenerateWeaponModel(string DesFile, GMBFile fModel, DesFile fIns, float scale = 1.0f, string textureOverrite = "")
    {
        if (string.IsNullOrEmpty(DesFile) || fModel == null || fIns == null)
        {
            return;
        }
        string    matIden = DesFile;
        Transform WR      = null;

        if (R != null)
        {
            DestroyImmediate(R);
        }
        R = new GameObject().transform;
        R.gameObject.layer = LayerMask.NameToLayer("Flight");
        R.SetParent(WeaponRoot);
        R.localRotation = Quaternion.identity;
        R.localPosition = Vector3.zero;
        R.localScale    = Vector3.one;
        R.name          = matIden;
        WR = R;

        //武器挂点必须在缩放正确后才能到指定的位置
        WR.localScale = Vector3.one;
        Material[] mat = new Material[fModel.TexturesCount];
        Dictionary <int, string> iflMaterials = new Dictionary <int, string>();

        for (int x = 0; x < fModel.TexturesCount; x++)
        {
            mat[x] = null;
            string tex = "";
            if (!string.IsNullOrEmpty(textureOverrite))
            {
                tex = textureOverrite;
            }
            else
            {
                tex = fModel.TexturesNames[x];
            }
            //若不是以ifl结尾的材质,那么要分割文件后缀,若是ifl类型的,则直接是xx.ifl.bytes类型的数据,是OK的
            bool iflMaterial = true;
            if (!tex.ToLower().EndsWith(".ifl"))
            {
                iflMaterial = false;
                int del = tex.LastIndexOf('.');
                if (del != -1)
                {
                    tex = tex.Substring(0, del);
                }
            }

            if (iflMaterial)
            {
                if (!iflMaterials.ContainsKey(x))
                {
                    iflMaterials.Add(x, tex);//记录x号材质是ifl类型的材质,以后会用到,这个序号的材质并且动态更换这个材质的贴图的
                }
            }
            else
            {
                string weaponIden = string.Format("{0}_{1:D2}{2}", matIden, x, textureOverrite);//还要考虑重载贴图也要生成对应的新材质
                mat[x] = Resources.Load <Material>(weaponIden);
                if (mat[x] == null)
                {
                    Texture texture = Resources.Load <Texture>(tex);
                    if (texture == null)
                    {
                        Debug.LogError("texture miss on load gmb:" + tex + " texture name:" + tex);
                    }
                    mat[x] = new Material(ShaderUtil.Find("AlphaTexture"));
                    mat[x].SetTexture("_MainTex", texture);
                    mat[x].name = weaponIden;
                    //if (!System.IO.Directory.Exists("Assets/Materials/" + "Weapons" + "/resources/"))
                    //    System.IO.Directory.CreateDirectory("Assets/Materials/" + "Weapons" + "/resources/");
                    //AssetDatabase.CreateAsset(mat[x], "Assets/Materials/" + "Weapons" + "/resources/" + mat[x].name + ".mat");
                    //AssetDatabase.Refresh();
                }
            }
        }

        for (int i = 0; i < fIns.SceneItems.Count; i++)
        {
            GameObject objMesh         = new GameObject();
            bool       addIflComponent = false;
            int        iflParam        = -1;
            int        iflMatIndex     = 0;
            objMesh.name = fIns.SceneItems[i].name;
            objMesh.transform.localRotation = Quaternion.identity;
            objMesh.transform.localPosition = Vector3.zero;
            objMesh.transform.localScale    = Vector3.one;
            bool realObject = false;//是不是正常物体,虚拟体无需设置材质球之类
            if (i < fModel.SceneObjectsCount)
            {
                //for (int j = 0; j < fModel.SceneObjectsCount; j++)
                //{
                //if (fModel.mesh[j].name == objMesh.name)
                {
                    realObject = true;
                    Mesh w = new Mesh();
                    //前者子网格编号,后者 索引缓冲区
                    Dictionary <int, List <int> > tr = new Dictionary <int, List <int> >();
                    List <Vector3> ve  = new List <Vector3>();
                    List <Vector2> uv  = new List <Vector2>();
                    List <Vector3> nor = new List <Vector3>();
                    List <Color>   col = new List <Color>();
                    for (int k = 0; k < fModel.mesh[i].faces.Count; k++)
                    {
                        int key = fModel.mesh[i].faces[k].material;
                        if (tr.ContainsKey(key))
                        {
                            tr[key].Add(fModel.mesh[i].faces[k].triangle[0]);
                            tr[key].Add(fModel.mesh[i].faces[k].triangle[1]);
                            tr[key].Add(fModel.mesh[i].faces[k].triangle[2]);
                        }
                        else
                        {
                            tr.Add(key, new List <int>());
                            tr[key].Add(fModel.mesh[i].faces[k].triangle[0]);
                            tr[key].Add(fModel.mesh[i].faces[k].triangle[1]);
                            tr[key].Add(fModel.mesh[i].faces[k].triangle[2]);
                        }
                    }
                    for (int k = 0; k < fModel.mesh[i].vertices.Count; k++)
                    {
                        ve.Add(fModel.mesh[i].vertices[k].pos);
                        uv.Add(fModel.mesh[i].vertices[k].uv);
                        col.Add(fModel.mesh[i].vertices[k].color);
                        nor.Add(fModel.mesh[i].vertices[k].normal);
                    }
                    w.SetVertices(ve);
                    w.uv           = uv.ToArray();
                    w.subMeshCount = tr.Count;
                    int             ss        = 0;
                    List <Material> targetMat = new List <Material>();
                    foreach (var each in tr)
                    {
                        w.SetIndices(each.Value.ToArray(), MeshTopology.Triangles, ss++);
                        if (each.Key >= 0 && each.Key < fModel.shader.Length)
                        {
                            int materialIndex = fModel.shader[each.Key].TextureArg0;
                            if (materialIndex >= 0 && materialIndex < mat.Length)
                            {
                                if (mat[materialIndex] == null)
                                {
                                    targetMat.Add(new Material(Shader.Find("Unlit/Transparent")));
                                    addIflComponent = true;
                                    iflParam        = materialIndex;
                                    iflMatIndex     = targetMat.Count - 1;
                                }
                                else
                                {
                                    targetMat.Add(mat[materialIndex]);
                                }
                            }
                            else
                            {
                                //占位材质,代表原文件里用到了序号<0的材质(即空材质),这里使用默认材质代替,一般武器加载不会触发这里,但是有极个别情况
                                Material defaults = new Material(Shader.Find("Unlit/Texture"));
                                defaults.name = string.Format("{0}_{1:D2}", objMesh.name, materialIndex);
                                targetMat.Add(defaults);
                            }
                        }
                    }
                    MeshRenderer mr = objMesh.AddComponent <MeshRenderer>();
                    MeshFilter   mf = objMesh.AddComponent <MeshFilter>();
                    mf.mesh         = w;
                    mf.mesh.colors  = col.ToArray();
                    mf.mesh.normals = nor.ToArray();
                    mf.mesh.RecalculateBounds();
                    mf.mesh.RecalculateNormals();

                    mr.materials = targetMat.ToArray();
                    string vis = "";
                    if (fIns.SceneItems[i].ContainsKey("visible", out vis))
                    {
                        if (vis == "0")
                        {
                            mr.enabled = false;
                            BoxCollider box = mr.gameObject.AddComponent <BoxCollider>();
                            box.enabled = false;
                            //weaponDamage.Add(box);
                        }
                    }
                    else
                    if (fIns.SceneItems[i].name.EndsWith("Box"))
                    {
                        BoxCollider box = mr.gameObject.AddComponent <BoxCollider>();
                        box.enabled = false;
                        //weaponDamage.Add(box);
                    }
                }
            }

            objMesh.transform.SetParent(WR);
            objMesh.layer = WR.gameObject.layer;
            if (addIflComponent && iflMaterials.ContainsKey(iflParam))
            {
                IFLLoader iflL = objMesh.AddComponent <IFLLoader>();
                iflL.fileNameReadOnly = iflMaterials[iflParam];
                iflL.IFLFile          = Resources.Load <TextAsset>(iflMaterials[iflParam]);
                iflL.matIndex         = iflMatIndex;
                iflL.LoadIFL();
            }

            if (!realObject)
            {
                objMesh.transform.localRotation = fIns.SceneItems[i].quat;
                objMesh.transform.localPosition = fIns.SceneItems[i].pos;
            }
            else
            {
                objMesh.transform.localRotation = Quaternion.identity;
                objMesh.transform.localScale    = Vector3.one;
                objMesh.transform.localPosition = Vector3.zero;
            }
        }

        WR.localScale = Vector3.one * scale;
    }
Пример #3
0
    //适用于非武器类型的任意模型的显示,包括地图都可以用此方法读,且支持IFL材质,创建虚拟体,只匹配序号,不匹配名称
    public static void ShowMeteorObject(string file, Transform parent, bool gen = false)
    {
        if (file.EndsWith(".des"))
        {
            file = file.Substring(0, file.Length - 4);
        }
        DesFile fIns   = Main.Ins.DesLoader.Load(file);
        GMBFile gmb    = Main.Ins.GMBLoader.Load(file);
        GMCFile fModel = Main.Ins.GMCLoader.Load(file);

        //保存材质球
        if (Application.isEditor)
        {
            if (!System.IO.Directory.Exists("Assets/Materials/Weapons/resources/"))
            {
                System.IO.Directory.CreateDirectory("Assets/Materials/Weapons/resources/");
            }
        }

        //看des文件是否为空
        //优先GMB
        if (gmb != null)
        {
            //还未处理IFL序列图动态加载。
            Material[] mat = new Material[gmb.TexturesCount];
            for (int i = 0; i < mat.Length; i++)
            {
                mat[i] = null;
            }
            Dictionary <int, string> iflMat = new Dictionary <int, string>();//IFL材质特殊处理,IFL材质均为mobile/particle/additive
            for (int x = 0; x < gmb.TexturesCount; x++)
            {
                string tex = gmb.TexturesNames[x];
                if (tex.ToLower().EndsWith(".ifl"))
                {
                    if (!iflMat.ContainsKey(x))
                    {
                        iflMat.Add(x, tex);
                    }
                    continue;
                }

                string iden = string.Format("{0}_{1:D2}", file, x);
                mat[x] = Resources.Load <Material>(iden);
                if (mat[x] == null)
                {
                    mat[x] = new Material(ShaderMng.Find("AlphaTexture"));
                    int del = tex.LastIndexOf('.');
                    if (del != -1)
                    {
                        tex = tex.Substring(0, del);
                    }
                    Texture texture = Resources.Load <Texture>(tex);
                    if (texture == null)
                    {
                        Debug.LogError("texture miss on load gmb:" + file + " texture name:" + tex);
                    }
                    mat[x].SetTexture("_MainTex", texture);
                    mat[x].name = iden;
                    if (gen)
                    {
                        //UnityEditor.AssetDatabase.CreateAsset(mat[x], "Assets/Materials/Weapons/resources/" + mat[x].name + ".mat");
                        //UnityEditor.AssetDatabase.Refresh();
                    }
                }
            }

            for (int i = 0; i < fIns.SceneItems.Count; i++)
            {
                GameObject objMesh         = new GameObject();
                bool       addIflComponent = false;
                int        iflParam        = -1;
                int        iflMatIndex     = 0;
                objMesh.name = fIns.SceneItems[i].name;
                objMesh.transform.localRotation = Quaternion.identity;
                objMesh.transform.localPosition = Vector3.zero;
                objMesh.transform.localScale    = Vector3.one;
                objMesh.layer = parent.gameObject.layer;
                //bool realObject = false;//是不是正常物体,虚拟体无需设置材质球之类
                if (i < gmb.SceneObjectsCount)
                {
                    //for (int j = 0; j < gmb.SceneObjectsCount; j++)
                    //{
                    //    if (gmb.mesh[j].name == objMesh.name)
                    //    {
                    //realObject = true;
                    Mesh w = new Mesh();
                    //前者子网格编号,后者 索引缓冲区
                    Dictionary <int, List <int> > tr = new Dictionary <int, List <int> >();
                    List <Vector3> ve  = new List <Vector3>();
                    List <Vector2> uv  = new List <Vector2>();
                    List <Vector3> nor = new List <Vector3>();
                    List <Color>   col = new List <Color>();
                    for (int k = 0; k < gmb.mesh[i].faces.Count; k++)
                    {
                        int key = gmb.mesh[i].faces[k].material;
                        if (tr.ContainsKey(key))
                        {
                            tr[key].Add(gmb.mesh[i].faces[k].triangle[0]);
                            tr[key].Add(gmb.mesh[i].faces[k].triangle[1]);
                            tr[key].Add(gmb.mesh[i].faces[k].triangle[2]);
                        }
                        else
                        {
                            tr.Add(key, new List <int>());
                            tr[key].Add(gmb.mesh[i].faces[k].triangle[0]);
                            tr[key].Add(gmb.mesh[i].faces[k].triangle[1]);
                            tr[key].Add(gmb.mesh[i].faces[k].triangle[2]);
                        }
                    }
                    for (int k = 0; k < gmb.mesh[i].vertices.Count; k++)
                    {
                        //ve.Add(gmb.mesh[i].vertices[k].pos);
                        Vector3 vec = gmb.mesh[i].vertices[k].pos - (Vector3)fIns.SceneItems[i].pos;
                        vec = Quaternion.Inverse(fIns.SceneItems[i].quat) * vec;
                        //ve.Add(fModel.mesh[i].vertices[k].pos);
                        ve.Add(vec);
                        uv.Add(gmb.mesh[i].vertices[k].uv);
                        col.Add(gmb.mesh[i].vertices[k].color);
                        nor.Add(gmb.mesh[i].vertices[k].normal);
                    }
                    w.SetVertices(ve);
                    w.uv           = uv.ToArray();
                    w.subMeshCount = tr.Count;
                    int             ss        = 0;
                    List <Material> targetMat = new List <Material>();
                    foreach (var each in tr)
                    {
                        w.SetIndices(each.Value.ToArray(), MeshTopology.Triangles, ss++);
                        if (each.Key >= 0 && each.Key < gmb.shader.Length)
                        {
                            int materialIndex = gmb.shader[each.Key].TextureArg0;
                            if (materialIndex >= 0 && materialIndex < mat.Length)
                            {
                                if (mat[materialIndex] == null)
                                {
                                    targetMat.Add(new Material(Shader.Find("Unlit/Transparent")));
                                    addIflComponent = true;
                                    iflParam        = materialIndex;
                                    iflMatIndex     = targetMat.Count - 1;
                                }
                                else
                                {
                                    targetMat.Add(mat[materialIndex]);
                                }
                            }
                            else
                            {
                                Material defaults = Resources.Load <Material>(string.Format("{0}_{1:D2}", file, materialIndex));
                                if (defaults == null)
                                {
                                    defaults = new Material(Shader.Find("Unlit/Texture"));
                                }
                                defaults.name = string.Format("{0}_{1:D2}", file, materialIndex);
                                if (gen)
                                {
                                    //UnityEditor.AssetDatabase.CreateAsset(defaults, "Assets/Materials/Weapons/resources/" + defaults.name + ".mat");
                                    //UnityEditor.AssetDatabase.Refresh();
                                }
                                targetMat.Add(defaults);
                            }
                        }
                    }
                    MeshRenderer mr = objMesh.AddComponent <MeshRenderer>();
                    MeshFilter   mf = objMesh.AddComponent <MeshFilter>();
                    mf.mesh         = w;
                    mf.mesh.colors  = col.ToArray();
                    mf.mesh.normals = nor.ToArray();
                    mf.mesh.RecalculateBounds();
                    mf.mesh.RecalculateNormals();

                    mr.materials = targetMat.ToArray();
                    string vis = "";
                    if (fIns.SceneItems[i].ContainsKey("visible", out vis))
                    {
                        if (vis == "0")
                        {
                            mr.enabled = false;
                            //BoxCollider co = mr.gameObject.AddComponent<BoxCollider>();
                        }
                    }
                    string block = "";
                    if (fIns.SceneItems[i].ContainsKey("blockplayer", out block))
                    {
                        if (block == "no")
                        {
                            MeshCollider co = mr.gameObject.GetComponent <MeshCollider>();
                            if (co == null)
                            {
                                co = mr.gameObject.AddComponent <MeshCollider>();
                            }
                            if (co != null)
                            {
                                co.enabled   = false;
                                co.convex    = false;
                                co.isTrigger = false;
                            }
                        }
                    }
                    else
                    {
                        Collider coexist = mr.gameObject.GetComponent <Collider>();
                        if (coexist == null)
                        {
                            MeshCollider co = mr.gameObject.AddComponent <MeshCollider>();
                            co.isTrigger = false;
                        }
                    }
                }
                //}

                objMesh.transform.SetParent(parent);

                if (addIflComponent && iflMat.ContainsKey(iflParam))
                {
                    IFLLoader iflL = objMesh.AddComponent <IFLLoader>();
                    iflL.fileNameReadOnly  = iflMat[iflParam];
                    iflL.IFLFile           = Resources.Load <TextAsset>(iflMat[iflParam]);
                    iflL.matIndex          = iflMatIndex;
                    iflL.useSharedMaterial = false;
                    iflL.LoadIFL();
                }

                //如果是板凳桌子,加上双面网格,避免一些BUG
                if (parent.name.ToLower().Contains("chair") || parent.name.ToLower().Contains("desk"))
                {
                    objMesh.AddComponent <DoubleSideMeshCollider>();
                }
                objMesh.transform.localRotation = fIns.SceneItems[i].quat;
                objMesh.transform.localScale    = Vector3.one;
                objMesh.transform.localPosition = fIns.SceneItems[i].pos;
            }
        }
        else if (fModel != null)
        {
            //Debug.LogError("error !!!!!!!!!!!!!!!!!!!!!!!!! not support gmc file any more");

            Material[] mat = new Material[fModel.TexturesCount];
            for (int i = 0; i < mat.Length; i++)
            {
                mat[i] = null;
            }
            Dictionary <int, string> iflMat = new Dictionary <int, string>();//IFL材质特殊处理,IFL材质均为mobile/particle/additive

            for (int x = 0; x < fModel.TexturesCount; x++)
            {
                string tex = fModel.TexturesNames[x];
                if (tex.ToLower().EndsWith(".ifl"))
                {
                    if (!iflMat.ContainsKey(x))
                    {
                        iflMat.Add(x, tex);
                    }
                    continue;
                }

                mat[x] = Resources.Load <Material>(string.Format("{0}_{1:D2}", file, x));
                if (mat[x] == null)
                {
                    mat[x] = new Material(ShaderMng.Find("AlphaTexture"));
                    int del = tex.LastIndexOf('.');
                    if (del != -1)
                    {
                        tex = tex.Substring(0, del);
                    }
                    Texture texture = Resources.Load <Texture>(tex);
                    if (texture == null)
                    {
                        Debug.LogError("texture miss on load gmc:" + file + " texture name:" + tex);
                    }
                    mat[x].SetTexture("_MainTex", texture);
                    mat[x].name = string.Format("{0}_{1:D2}", file, x);
                    if (gen)
                    {
                        //UnityEditor.AssetDatabase.CreateAsset(mat[x], "Assets/Materials/Weapons/resources/" + mat[x].name + ".mat");
                        //UnityEditor.AssetDatabase.Refresh();
                    }
                }
                //mat[x] = Resources.Load<Material>(string.Format("{0}_{1:D2}", file, x));
                //if (mat[x] == null)
                //{
                //    mat[x] = new Material(ShaderUtil.Find("UnlitAlphaTexture"));
                //    string tex = fModel.TexturesNames[x];
                //    int del = tex.LastIndexOf('.');
                //    if (del != -1)
                //        tex = tex.Substring(0, del);
                //    Texture texture = Resources.Load<Texture>(tex);
                //    if (texture == null)
                //        Debug.LogError("texture miss on load gmc:" + file + " texture name:" + tex);
                //    mat[x].SetTexture("_MainTex", texture);
                //    mat[x].name = string.Format("{0}_{1:D2}", file, x);
                //    //AssetDatabase.CreateAsset(mat[x], "Assets/Materials/" + file + "/resources/" + mat[x].name + ".mat");
                //    //AssetDatabase.Refresh();
                //}
            }
            for (int i = 0; i < fIns.SceneItems.Count; i++)
            {
                GameObject objMesh         = new GameObject();
                bool       addIflComponent = false;
                int        iflParam        = -1;
                int        iflMatIndex     = 0;
                objMesh.name = fIns.SceneItems[i].name;
                objMesh.transform.localRotation = Quaternion.identity;
                objMesh.transform.localPosition = Vector3.zero;
                objMesh.transform.localScale    = Vector3.one;
                objMesh.layer = parent.gameObject.layer;
                //bool realObject = false;//是不是正常物体,虚拟体无需设置材质球之类
                if (i < fModel.SceneObjectsCount)
                {
                    //for (int j = 0; j < fModel.SceneObjectsCount; j++)
                    //{
                    //if (fModel.mesh[j].name == objMesh.name)
                    {
                        //realObject = true;
                        Mesh w = new Mesh();
                        //前者子网格编号,后者 索引缓冲区
                        Dictionary <int, List <int> > tr = new Dictionary <int, List <int> >();
                        List <Vector3> ve  = new List <Vector3>();
                        List <Vector2> uv  = new List <Vector2>();
                        List <Vector3> nor = new List <Vector3>();
                        List <Color>   col = new List <Color>();
                        for (int k = 0; k < fModel.mesh[i].faces.Count; k++)
                        {
                            int key = fModel.mesh[i].faces[k].material;
                            if (tr.ContainsKey(key))
                            {
                                tr[key].Add(fModel.mesh[i].faces[k].triangle[0]);
                                tr[key].Add(fModel.mesh[i].faces[k].triangle[1]);
                                tr[key].Add(fModel.mesh[i].faces[k].triangle[2]);
                            }
                            else
                            {
                                tr.Add(key, new List <int>());
                                tr[key].Add(fModel.mesh[i].faces[k].triangle[0]);
                                tr[key].Add(fModel.mesh[i].faces[k].triangle[1]);
                                tr[key].Add(fModel.mesh[i].faces[k].triangle[2]);
                            }
                        }
                        for (int k = 0; k < fModel.mesh[i].vertices.Count; k++)
                        {
                            Vector3 vec = fModel.mesh[i].vertices[k].pos - (Vector3)fIns.SceneItems[i].pos;
                            vec = Quaternion.Inverse(fIns.SceneItems[i].quat) * vec;
                            //ve.Add(fModel.mesh[i].vertices[k].pos);
                            ve.Add(vec);
                            uv.Add(fModel.mesh[i].vertices[k].uv);
                            col.Add(fModel.mesh[i].vertices[k].color);
                            nor.Add(fModel.mesh[i].vertices[k].normal);
                        }
                        w.SetVertices(ve);
                        w.uv           = uv.ToArray();
                        w.subMeshCount = tr.Count;
                        int             ss        = 0;
                        List <Material> targetMat = new List <Material>();
                        foreach (var each in tr)
                        {
                            w.SetIndices(each.Value.ToArray(), MeshTopology.Triangles, ss++);
                            if (each.Key >= 0 && each.Key < fModel.shader.Length)
                            {
                                int materialIndex = fModel.shader[each.Key].TextureArg0;
                                if (materialIndex >= 0 && materialIndex < mat.Length)
                                {
                                    if (mat[materialIndex] == null)
                                    {
                                        targetMat.Add(new Material(Shader.Find("Unlit/Transparent")));
                                        addIflComponent = true;
                                        iflParam        = materialIndex;
                                        iflMatIndex     = targetMat.Count - 1;
                                    }
                                    else
                                    {
                                        targetMat.Add(mat[materialIndex]);
                                    }
                                }
                                else
                                {
                                    //即使没有贴图,也存在材质
                                    Material defaults = Resources.Load <Material>(string.Format("{0}_{1:D2}", file, materialIndex));
                                    if (defaults == null)
                                    {
                                        defaults = new Material(Shader.Find("Unlit/Texture"));
                                    }
                                    defaults.name = string.Format("{0}_{1:D2}", file, materialIndex);
                                    if (gen)
                                    {
                                        //UnityEditor.AssetDatabase.CreateAsset(defaults, "Assets/Materials/Weapons/resources/" + defaults.name + ".mat");
                                        //UnityEditor.AssetDatabase.Refresh();
                                    }
                                    targetMat.Add(defaults);
                                }
                            }
                        }
                        MeshRenderer mr = objMesh.AddComponent <MeshRenderer>();
                        MeshFilter   mf = objMesh.AddComponent <MeshFilter>();
                        mf.mesh         = w;
                        mf.mesh.colors  = col.ToArray();
                        mf.mesh.normals = nor.ToArray();
                        mf.mesh.RecalculateBounds();
                        mf.mesh.RecalculateNormals();

                        mr.materials = targetMat.ToArray();
                        string vis = "";
                        if (fIns.SceneItems[i].ContainsKey("visible", out vis))
                        {
                            if (vis == "0")
                            {
                                mr.enabled = false;
                                //BoxCollider co = mr.gameObject.AddComponent<BoxCollider>();
                            }
                        }
                        string block = "";
                        if (fIns.SceneItems[i].ContainsKey("blockplayer", out block))
                        {
                            if (block == "no")
                            {
                                Collider co = mr.gameObject.GetComponent <MeshCollider>();
                                if (co == null)
                                {
                                    co = mr.gameObject.AddComponent <MeshCollider>();
                                }
                                if (co != null)
                                {
                                    MeshCollider mec = co as MeshCollider;
                                    if (mec != null)
                                    {
                                        mec.enabled   = false;
                                        mec.convex    = false;//unity bug
                                        mec.isTrigger = false;
                                    }
                                }
                            }
                        }
                        else
                        {
                            Collider coexist = mr.gameObject.GetComponent <Collider>();
                            if (coexist == null)
                            {
                                MeshCollider co = mr.gameObject.AddComponent <MeshCollider>();
                                co.isTrigger = false;
                            }
                        }
                    }
                }

                objMesh.transform.SetParent(parent);
                if (addIflComponent && iflMat.ContainsKey(iflParam))
                {
                    IFLLoader iflL = objMesh.AddComponent <IFLLoader>();
                    iflL.fileNameReadOnly  = iflMat[iflParam];
                    iflL.IFLFile           = Resources.Load <TextAsset>(iflMat[iflParam]);
                    iflL.matIndex          = iflMatIndex;
                    iflL.useSharedMaterial = false;
                    iflL.LoadIFL();
                }
                //如果是板凳桌子,加上双面网格,避免一些BUG
                if (parent.name.ToLower().Contains("chair") || parent.name.ToLower().Contains("desk"))
                {
                    objMesh.AddComponent <DoubleSideMeshCollider>();
                }
                objMesh.transform.localRotation = fIns.SceneItems[i].quat;
                objMesh.transform.localScale    = Vector3.one;
                objMesh.transform.localPosition = fIns.SceneItems[i].pos;
            }
        }
        else
        {
            //一个预设
            GameObject prefab = Resources.Load(file) as GameObject;
            if (prefab != null)
            {
                GameObject obj = GameObject.Instantiate(prefab, parent);
                obj.transform.localScale    = Vector3.one;
                obj.transform.localPosition = Vector3.zero;
                obj.transform.rotation      = Quaternion.identity;
                BoxCollider co = obj.GetComponentInChildren <BoxCollider>();
                co.isTrigger = true;
                int k = obj.transform.childCount;
                while (obj.transform.childCount != 0)
                {
                    Transform tri = obj.transform.GetChild(0);
                    tri.SetParent(parent);
                }
                GameObject.Destroy(obj);
                WsGlobal.SetObjectLayer(parent.gameObject, parent.gameObject.layer);
            }
        }
    }
Пример #4
0
    //public void SaveParticle(string file)
    //{
    //    if (source != null && source.particle != null)
    //    {
    //        System.IO.FileStream fs = System.IO.File.OpenWrite(file);
    //        System.IO.BinaryWriter w = new System.IO.BinaryWriter(fs);
    //        w.Write(source.particle);
    //        w.Flush();
    //        w.Close();
    //        fs.Close();
    //    }
    //}

    //原粒子系统是右手坐标系的,转移到左手坐标系后非常多问题,特别是父子关系以及,跟随和子物体旋转叠加
    public void Init(SfxEffect effect, SFXEffectPlay parent, int index, float timePlayed = 0.0f, bool preLoad = false)
    {
        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.Equals("PARTICLE"))
        {
            particle = Instantiate(Resources.Load <GameObject>("SFXParticles"), Vector3.zero, Quaternion.identity, transform).GetComponent <ParticleSystem>();
            ParticleSystem.MainModule     mainModule     = particle.main;
            ParticleSystem.EmissionModule emissionModule = particle.emission;
            ParticleSystem.ShapeModule    shapeModule    = particle.shape;

            emissionModule.rateOverTime = new ParticleSystem.MinMaxCurve(effect.MaxParticles, effect.MaxParticles);
            mainModule.startLifetime    = effect.StartLifetime;
            mainModule.maxParticles     = effect.MaxParticles;
            mainModule.startSize3D      = false;
            mainModule.startSize        = new ParticleSystem.MinMaxCurve(effect.startSizeMin, effect.startSizeMax);
            mainModule.startSpeed       = new ParticleSystem.MinMaxCurve(effect.startSpeedMin, effect.startSpeedMax);
            mainModule.loop             = true;
            mainModule.duration         = 1.0f;

            //124字节的,烟雾特效,旋转角度 0-360,shape使用box, render使用billboard
            if (effect.version == 1)
            {
                mainModule.startRotation = new ParticleSystem.MinMaxCurve(0, 360);
                shapeModule.shapeType    = ParticleSystemShapeType.Box;
                shapeModule.box          = new Vector3(effect.startSizeMin, 0, effect.startSizeMax);
                ParticleSystemRenderer r = particle.GetComponent <ParticleSystemRenderer>();
                r.renderMode      = ParticleSystemRenderMode.Billboard;
                r.minParticleSize = 0.1f;
                r.maxParticleSize = 0.1f;
            }
        }

        if (string.IsNullOrEmpty(effect.Bone0))
        {
            PositionFollow = mOwner == null ? parentSfx.transform : mOwner.transform;
        }
        else
        if (effect.Bone0.Equals("ROOT"))
        {
            PositionFollow = mOwner == null ? parent.transform : mOwner.ROOTNull;
        }
        else if (effect.Bone0.Equals("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.Equals("ROOT"))
        {
            RotateFollow = mOwner == null ? parent.transform : mOwner.ROOTNull;
        }
        else if (effect.Bone1.Equals("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.Equals("DONUT"))
        {
            //Debug.LogError("find Donut Effect");
        }
        //部分模型是要绕X旋转270的,这样他的缩放,和移动,都只能靠自己
        if (effect.EffectType.Equals("PLANE"))
        {
            meshIndex = 0;
        }
        else if (effect.EffectType.Equals("BOX"))
        {
            meshIndex = 1;
        }
        else if (effect.EffectType.Equals("DONUT"))
        {
            transform.localScale = effect.frames[0].scale;
            meshIndex            = 2;
        }
        else if (effect.EffectType.Equals("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.Equals("SPHERE"))
        {
            meshIndex = 3;
        }
        else if (effect.EffectType.Equals("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.Equals("CYLINDER"))
        {
            meshIndex = 4;
        }
        else if (effect.EffectType.Equals("BILLBOARD"))
        {
            LookAtC   = true;
            meshIndex = 5;
        }
        else if (effect.EffectType.Equals("DRAG"))
        {
            meshIndex = 6;
        }
        //决定模型
        if (meshIndex != -1 && meshIndex < GamePool.Instance.MeshMng.Meshes.Length)
        {
            if (meshIndex == 4)
            {
                mFilter.mesh = Main.Ins.SfxMeshGenerator.CreateCylinder(source.origAtt.y, source.origAtt.x, source.origScale.x);
            }
            else if (meshIndex == 3)
            {
                mFilter.mesh = Main.Ins.SfxMeshGenerator.CreateSphere(source.SphereRadius);
            }
            else if (meshIndex == 0)
            {
                mFilter.mesh = Main.Ins.SfxMeshGenerator.CreatePlane(source.origScale.x, source.origScale.y);
            }
            else
            {
                mFilter.mesh = GamePool.Instance.MeshMng.Meshes[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.Equals("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.Equals("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");//普通不透明无光照
                }
                if (texture.Equals("AItem09"))
                {
                    render.enabled = false;
                    particle.Stop();

                    /* 应该是有一个地裂的粒子特效,但是这个特效参数没分析出来.
                     *  tex = Resources.Load<Texture>("AItemParticle");
                     *  render.material.SetTexture("_MainTex", tex);
                     */
                }
                else
                {
                    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]);
                if (Main.Ins.GameStateMgr.gameStatus != null && !Main.Ins.GameStateMgr.gameStatus.DisableParticle)
                {
                    particle.Play();
                }
            }
            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);
            }
        }
        else
        {
            mRender.enabled = false;
        }
        //drag不知道有什么作用,可能只是定位用的挂载点
        if (effect.Hidden == 1 || meshIndex == 6)
        {
            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.ToUpper() == "BOX")
            {
                BoxCollider bo = gameObject.AddComponent <BoxCollider>();
                bo.center = Vector3.zero;
                bo.size   = Vector3.one;
                damageBox = bo;
            }
            else
            {
                //SphereCollider sph = gameObject.AddComponent<SphereCollider>();
                //damageBox = sph;
                //sph.radius = 1.0f;
                //sph.center = Vector3.zero;
                MeshCollider co = gameObject.AddComponent <MeshCollider>();
                co.convex    = true;
                co.isTrigger = true;
                damageBox    = co;
            }
            damageBox.enabled = false;
        }

        if (preLoad)
        {
            PlayDone = true;
            if (parentSfx != null)
            {
                parentSfx.OnPlayDone(this);
            }
            else
            {
                Destroy(gameObject);
            }
            return;
        }
    }
Пример #5
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());
    }