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(); }
/// <summary> /// 设置数据 /// </summary> /// <param name="effectData"></param> public virtual void SetData(EffectBean effectData) { if (effectData == null) { return; } this.effectData = effectData; transform.position = effectData.effectPosition; }
/// <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(); }); }
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); }); }
/// <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); }); } }); }
/// <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); }
/// <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); }
public void ShowEffect(EffectBean effectData, Action <EffectBase> callBack = null) { ShowEffect(gameObject, effectData, callBack); }
/// <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; } }