private void drawRow(EffectBean asset)
        {
            int lv = 0;

            if (asset.FilePath == GUISetting.SelectFilePath)
            {
                GUI.color = GUISetting.SelectColor;
            }

            if (GUILayout.Button(asset.Name, "OL TextField", GUILayout.MaxWidth(200f)))
            {
                Selection.activeObject    = AssetDatabase.LoadAssetAtPath <Object>(asset.FilePath);
                GUISetting.SelectFilePath = asset.FilePath;
            }

            GUILayout.Space(50);
            GUILayout.Label(asset.AssetDesc, GUILayout.MinWidth(100f));

            setGUIColor(asset.DrawCallScore);
            GUILayout.Label(asset.DrawCallCount.ToString(), GUILayout.MinWidth(100f));
            GUI.color = Color.white;

            GUILayout.Label(asset.TextureCount.ToString(), GUILayout.MinWidth(80f));
            GUI.color = Color.white;

            setGUIColor(asset.ParticeScore);
            GUILayout.Label(asset.ParticelCount.ToString(), GUILayout.Width(100F));

            lv        = GUISetting.CalScoreLevel(asset.Score);
            GUI.color = GUISetting.ScoreColors[lv];
            GUILayout.Label(GUISetting.ScoreNames[lv], GUILayout.MinWidth(100F));
            GUI.color = Color.white;
        }
        /// <summary>
        /// 查找模型文件
        /// </summary>
        private void findAllParticleEffects()
        {
            scrollPos = Vector2.zero;
            List <ParticleEffectSettingBean> settings = OverviewSetting.Instance.EffectSettings;

            List <string> files = new List <string>();
            Dictionary <ParticleEffectSettingBean, string[]> fileMaps = new Dictionary <ParticleEffectSettingBean, string[]>();

            List <string> assetTypeList = new List <string>();

            assetTypeList.Add("ALL");

            float fileCount = 0;

            if (settings != null)
            {
                for (int i = 0; i < settings.Count; i++)
                {
                    files.Clear();
                    for (int j = 0; j < settings[i].Folder.Count; j++)
                    {
                        string rootFolder = settings[i].Folder[j];
                        if (string.IsNullOrEmpty(rootFolder))
                        {
                            continue;
                        }
                        string[] fileArr = Directory.GetFiles(rootFolder, "*.prefab", SearchOption.AllDirectories);
                        files.AddRange(fileArr);
                        fileCount += fileArr.Length;
                    }
                    fileMaps[settings[i]] = files.ToArray();
                    assetTypeList.Add(settings[i].AssetDesc);
                }
            }

            AssetAllTypes = assetTypeList.ToArray();
            assetList     = new List <EffectBean>();
            int curFileIndex = 0;

            foreach (ParticleEffectSettingBean msb in fileMaps.Keys)
            {
                string[] childFiles = fileMaps[msb];
                for (int i = 0; i < childFiles.Length; i++)
                {
                    curFileIndex++;
                    EditorUtility.DisplayProgressBar("分析中", "正在分析特效数据...", curFileIndex / fileCount);
                    EffectBean asset = parseEffectAsset(childFiles[i]);
                    asset.AssetDesc = msb.AssetDesc;

                    asset.DrawCallScore = asset.DrawCallCount / (float)msb.MaxMatrials;
                    asset.ParticeScore  = asset.ParticelCount / (float)msb.MaxParticels;
                    asset.Score         = (asset.DrawCallScore + asset.ParticeScore) * 0.5f;

                    assetList.Add(asset);
                }
            }

            EditorUtility.ClearProgressBar();
        }
示例#3
0
 /// <summary>
 /// 设置数据
 /// </summary>
 /// <param name="effectData"></param>
 public virtual void SetData(EffectBean effectData)
 {
     if (effectData == null)
     {
         return;
     }
     this.effectData    = effectData;
     transform.position = effectData.effectPosition;
 }
示例#4
0
    /// <summary>
    /// 飙血
    /// </summary>
    public void ShowBlood()
    {
        EffectBean effectData = new EffectBean();

        effectData.effectType     = EffectTypeEnum.Visual;
        effectData.effectName     = EffectInfo.Effect_Blood_1;
        effectData.effectPosition = creature.transform.position + Vector3.up;
        effectData.timeForShow    = 0.5f;
        EffectHandler.Instance.ShowEffect(effectData, (effect) =>
        {
            effect.PlayEffect();
        });
    }
示例#5
0
    public static void PlayBlockCptBreakEffect(Block block, Vector3 position)
    {
        EffectBean effectData = new EffectBean();

        effectData.timeForShow    = 5f;
        effectData.effectPosition = position + Vector3.one * 0.5f;
        effectData.effectName     = EffectInfo.BlockBreak_1;
        EffectHandler.Instance.ShowEffect(effectData, (effect) =>
        {
            //设置粒子颜色
            Material matNomral = BlockHandler.Instance.manager.GetBlockMaterial(block.blockInfo.GetBlockMaterialType());
            Texture2D texBlock = matNomral.mainTexture as Texture2D;

            Color colorStart;
            Color colorEnd;

            if ((int)block.blockInfo.GetBlockShape() > 90000)
            {
                //如果是自定义模型的方块 则直接随机获取颜色
                //colorStart = new Color(Random.Range(0f,1f), Random.Range(0f, 1f), Random.Range(0f, 1f));
                //colorEnd = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));
                colorStart = Color.gray;
                colorEnd   = Color.gray;
            }
            else
            {
                Vector2Int[] arrayUVData = block.blockInfo.GetUVPosition();
                int randomUV             = Random.Range(0, arrayUVData.Length);
                Vector2 uvStartPosition  = new Vector2(texBlock.width * (arrayUVData[randomUV].y * BlockShape.uvWidth), texBlock.width * (arrayUVData[randomUV].x * BlockShape.uvWidth));

                int randomNumber = 0;
                do
                {
                    int randomXStart = Random.Range((int)uvStartPosition.x, (int)(uvStartPosition.x + (texBlock.width * BlockShape.uvWidth)));
                    int randomYStart = Random.Range((int)uvStartPosition.y, (int)(uvStartPosition.y + (texBlock.height * BlockShape.uvWidth)));

                    int randomXEnd = Random.Range((int)uvStartPosition.x, (int)(uvStartPosition.x + (texBlock.width * BlockShape.uvWidth)));
                    int randomYEnd = Random.Range((int)uvStartPosition.y, (int)(uvStartPosition.y + (texBlock.height * BlockShape.uvWidth)));

                    colorStart = TextureUtil.GetPixel(texBlock, new Vector2Int(randomXStart, randomYStart));
                    colorEnd   = TextureUtil.GetPixel(texBlock, new Vector2Int(randomXEnd, randomYEnd));
                    randomNumber++;
                }while ((colorStart.a == 0 || colorEnd.a == 0) && randomNumber < 10);
            }

            EffectBlockBreak effectBlockCptBreak = (EffectBlockBreak)effect;
            effectBlockCptBreak.SetEffectColor(colorStart, colorEnd);
        });
    }
示例#6
0
 /// <summary>
 /// 展示粒子特效
 /// </summary>
 /// <param name="objContainer"></param>
 /// <param name="effectData"></param>
 /// <param name="callBack"></param>
 public void ShowEffect(GameObject objContainer, EffectBean effectData, Action <EffectBase> callBack = null)
 {
     manager.GetEffect(objContainer, effectData, (effect) =>
     {
         callBack?.Invoke(effect);
         if (effectData.timeForShow > 0)
         {
             //展示时间过后就删除
             this.WaitExecuteSeconds(effectData.timeForShow, () =>
             {
                 manager.DestoryEffect(effect);
             });
         }
     });
 }
示例#7
0
    /// <summary>
    /// 删除粒子
    /// </summary>
    /// <param name="effect"></param>
    public void DestoryEffect(EffectBase effect)
    {
        EffectBean effectData = effect.effectData;

        if (dicIdleEffect.TryGetValue(effectData.effectName, out Queue <EffectBase> listIdleEffect))
        {
            listIdleEffect.Enqueue(effect);
        }
        else
        {
            Queue <EffectBase> listEffect = new Queue <EffectBase>();
            listEffect.Enqueue(effect);
            dicIdleEffect.Add(effectData.effectName, listEffect);
        }
        effect.ShowObj(false);
    }
示例#8
0
    /// <summary>
    /// 创建粒子
    /// </summary>
    /// <param name="objContainer"></param>
    /// <param name="effectData"></param>
    /// <param name="completeAction"></param>
    public void GetEffect(GameObject objContainer, EffectBean effectData, Action <EffectBase> completeAction)
    {
        if (dicIdleEffect.TryGetValue(effectData.effectName, out Queue <EffectBase> listIdleEffect))
        {
            if (listIdleEffect.Count > 0)
            {
                EffectBase effect = listIdleEffect.Dequeue();
                effect.SetData(effectData);
                effect.ShowObj(true);
                completeAction?.Invoke(effect);
                return;
            }
        }

        GetModelForAddressables(dicEffectModel, $"Assets/Prefabs/Effects/{effectData.effectName}.prefab", (obj) =>
        {
            GameObject objEffects = Instantiate(objContainer, obj);
            EffectBase effect     = objEffects.GetComponent <EffectBase>();
            effect.SetData(effectData);
            completeAction?.Invoke(effect);
        });
    }
        /// <summary>
        /// 分析粒子特效
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        private EffectBean parseEffectAsset(string filePath)
        {
            EffectBean eb = new EffectBean();

            eb.Name     = Path.GetFileName(filePath);
            eb.FilePath = filePath;

            UnityEngine.Object obj  = AssetDatabase.LoadAssetAtPath <Object>(filePath);
            GameObject         gObj = GameObject.Instantiate(obj) as GameObject;

            ParticleSystem[] particleArr = gObj.GetComponentsInChildren <ParticleSystem>();

            Dictionary <string, bool> materials = new Dictionary <string, bool>();
            Dictionary <string, bool> textures  = new Dictionary <string, bool>();
            int particels = 0;

            for (int i = 0; i < particleArr.Length; i++)
            {
                Renderer renderer = particleArr[i].GetComponent <Renderer>();
                Material mat      = renderer.sharedMaterial;
                if (mat != null)
                {
                    materials[mat.name] = true;
                    if (mat.mainTexture != null)
                    {
                        textures[mat.mainTexture.name] = true;
                    }
                }
                particels += particleArr[i].maxParticles;
            }
            eb.DrawCallCount = materials.Count;
            eb.TextureCount  = textures.Count;
            eb.ParticelCount = particels;
            GameObject.DestroyImmediate(gObj);
            return(eb);
        }
示例#10
0
 public void ShowEffect(EffectBean effectData, Action <EffectBase> callBack = null)
 {
     ShowEffect(gameObject, effectData, callBack);
 }
示例#11
0
    /// <summary>
    /// 死亡
    /// </summary>
    public void Dead()
    {
        //获取所有的骨骼节点
        //List<Transform> listObjBone = CptUtil.GetAllCptInChildrenByContainName<Transform>(gameObject, "Bone");
        //for (int i = 0; i < listObjBone.Count; i++)
        //{
        //    Transform itemBone = listObjBone[i];
        //    Rigidbody boneRB = itemBone.AddComponentEX<Rigidbody>();
        //}
        Vector3 randomRotate;
        int     random = WorldRandTools.Range(0, 4);

        switch (random)
        {
        case 0:
            randomRotate = new Vector3(90, 0, 0);
            break;

        case 1:
            randomRotate = new Vector3(-90, 0, 0);
            break;

        case 2:
            randomRotate = new Vector3(0, 0, 90);
            break;

        case 3:
            randomRotate = new Vector3(0, 0, -90);
            break;

        default:
            randomRotate = new Vector3(-90, 0, 0);
            break;
        }
        //身体侧翻
        transform
        .DOLocalRotate(randomRotate, 0.5f, RotateMode.Fast)
        .OnComplete(() =>
        {
            //查询身体位置
            Transform bodyTF = CptUtil.GetCptInChildrenByName <Transform>(gameObject, "BoneBody");
            //消失烟雾
            EffectBean effectData     = new EffectBean();
            effectData.effectName     = EffectInfo.Effect_Dead_1;
            effectData.effectType     = EffectTypeEnum.Visual;
            effectData.timeForShow    = 5;
            effectData.effectPosition = bodyTF.position;
            EffectHandler.Instance.ShowEffect(effectData, (effect) => { effect.PlayEffect(); });
            //删除此物体
            Destroy(gameObject);
        });
        //关闭动画
        creatureAnim.EnabledAnim(false);
        //关闭刚体
        if (rbCreature != null)
        {
            rbCreature.isKinematic = true;
        }
        //关闭检测
        if (colliderCreature != null)
        {
            colliderCreature.enabled = false;
        }
    }