生成文章|

[C#]一段 C# 的代码 U3d 特效管理

2016-10-24 23:27
860
  1. //------------------------------------------------------------------------------
  2. // <auto-generated>
  3. //     此代码由工具生成。
  4. //     运行时版本:4.0.30319.17929
  5. //
  6. //     对此文件的更改可能会导致不正确的行为,并且如果
  7. //     重新生成代码,这些更改将会丢失。
  8. // </auto-generated>
  9. //------------------------------------------------------------------------------
  10. using UnityEngine;
  11. using System.Collections;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System;

  15. using GameDefine;
  16. using JT.FWW.Tools;
  17. using BlGame.GameData;
  18. using BlGame.GameEntity;
  19. using BlGame;
  20. using BlGame.Skill;
  21. using BlGame.Resource;

  22. namespace BlGame.Effect
  23. {
  24.     //特效显示等级
  25.     public enum EffectLodLevel
  26.     {
  27.         High,
  28.         Low
  29.     }
  30.     //[yaz]特效管理器修改
  31.     public class EffectManager : UnitySingleton<EffectManager>
  32.     {      
  33.         public static Dictionary<Int64, IEffect> m_EffectMap = new Dictionary<Int64, IEffect>();

  34.         //本地特效ID,服务器没传本地生成,负值
  35.         public Int64 localIndex = 0;

  36.         //是否使用缓存特效机制,默认使用
  37.         public bool CachEffect = true;

  38.         //缓存特效时间
  39.         public float CachEffectTime = 10.0f;

  40.         //特效有效距离
  41.         public float ValidDist = 40;


  42.         //特效Lod等级
  43.         public EffectLodLevel mLodLevel = EffectLodLevel.High;

  44.         //缓存特效列表,特效死亡先进入缓存,缓存周期结束进去死亡队列
  45.         //private Dictionary<IEffect.ESkillEffectType, Queue<IEffect>> CachEffectMap = new Dictionary<IEffect.ESkillEffectType, Queue<IEffect>>();

  46.         //死亡特效列表                    
  47.         private List<IEffect> deadEffectList = new List<IEffect>();
  48.         

  49.         public EffectManager()
  50.         {
  51.         }

  52.         //设置特效显示等级
  53.         public void SetEffectLodLevel(EffectLodLevel level)
  54.         {
  55.             mLodLevel = level;
  56.         }

  57.         //检测特效位置是否有效,无效就不创建特效
  58.         public bool CheckEffectValid(Vector3 effectPos, float lifeTime)
  59.         {
  60.             Vector3 localPos = PlayerManager.Instance.LocalPlayer.objTransform.position;

  61.             //计算玩家到特效位置
  62.             float dist = Vector3.Distance(localPos, effectPos);
  63.             if (dist > ValidDist && lifeTime < 1.5f)
  64.                 return false;
  65.             else
  66.                 return true;
  67.         }


  68.         //屏幕振动
  69.         public void Shakecamera(float period, float offPeriod, int shakeOrient, float shakeTime, float maxWave, float minWave)
  70.         {
  71.             ShakeCamera shakeCamera = Camera.main.GetComponent<ShakeCamera>();
  72.             if (shakeCamera == null)
  73.             {
  74.                 shakeCamera = Camera.main.gameObject.AddComponent<ShakeCamera>();                                
  75.             }
  76.             shakeCamera.ShakeScreen((ShakeCamera.ShakeOrient)shakeOrient, period, shakeTime, maxWave, minWave, offPeriod);
  77.         }

  78.         //播放声音
  79.         public virtual void PlayAudio(IEffect effect, string audio, GameObject attachNode)
  80.         {
  81.             StartCoroutine(PlayAudioCoRoutine(effect, audio, attachNode));
  82.         }
  83.         //异步播放声音
  84.         public IEnumerator PlayAudioCoRoutine(IEffect effect, string audio, GameObject attachNode)
  85.         {
  86.             //无效声音名称
  87.             if (audio == "")
  88.             {
  89.                 yield break;
  90.             }

  91.             yield return 1;

  92.             ResourceUnit clipUnit = ResourcesManager.Instance.loadImmediate(audio, ResourceType.ASSET);
  93.             AudioClip clip = clipUnit.Asset as AudioClip;

  94.             if (clip != null)
  95.             {

  96.                 //播放特效绑定的声音
  97.                 AudioSource audioSource = AudioManager.Instance.PlayEffectAudio(clip);
  98.                 SceneSoundManager.Instance.addSound(audioSource, attachNode);

  99.                 effect.mAudioSource = audioSource;
  100.             }
  101.         }
  102.       



  103.         #region 特效创建

  104.         //1.创建被动特效
  105.         public PassitiveEffect CreatePassitiveEffect(Ientity entity, uint typeid, uint projectId)
  106.         {
  107.             SkillPassiveConfigInfo skillinfo = ConfigReader.GetSkillPassiveConfig(typeid);
  108.             //判断资源路径是否有效
  109.             if (skillinfo == null || skillinfo.startEffect == "0")
  110.                 return null;

  111.             string resourcePath = GameConstDefine.LoadGameSkillEffectPath + "release/" + skillinfo.startEffect;

  112.             //加载特效信息
  113.             PassitiveEffect effect = new PassitiveEffect();
  114.             effect.entity = entity;
  115.             effect.skillID = typeid;
  116.             effect.projectID = projectId;            
  117.             effect.resPath = resourcePath;

  118.             //创建
  119.             effect.Create();

  120.             //保存到特效列表
  121.             AddEffect(effect.projectID, effect);
  122.             return effect;
  123.         }


  124.         //2.创建buff特效
  125.         public BuffEffect CreateBuffEffect(Ientity buffEntity, uint buffTypeID, uint instID)
  126.         {
  127.             BuffConfigInfo buffInfo = ConfigReader.GetBuffInfo(buffTypeID);


  128.             //判断是否有后续击飞效果
  129.             if (buffInfo != null && buffInfo.eFlyEffectID != 0)
  130.             {
  131.                 //获取击飞信息               
  132.                 SkillFlyConfig skillFlycfg = ConfigReader.GetSkillFlyConfig(buffInfo.eFlyEffectID);
  133.                 if (skillFlycfg != null && buffEntity != null)
  134.                 {
  135.                     //Iplayer player = buffEntity as Iplayer;

  136.                     //被击飞信息
  137.                     string beatFLyAction = skillFlycfg.moveAction;
  138.                     float raiseSpeed = skillFlycfg.raiseSpeed;
  139.                     float raiseAccSpeed = skillFlycfg.raiseAccSpeed;
  140.                     float fallSpeed = skillFlycfg.fallSpeed;
  141.                     float fallAccSpeed = skillFlycfg.fallAccSpeed;
  142.                     float stayTime = skillFlycfg.stayTime;
  143.                     int canbeRecover = skillFlycfg.bIsCanBeRecover;
  144.                                           
  145.                     buffEntity.OnBeatFly(buffInfo.BuffID, beatFLyAction, raiseSpeed, raiseAccSpeed, fallSpeed, fallAccSpeed, stayTime, canbeRecover);
  146.                 }
  147.             }

  148.             //判断资源路径是否有效
  149.             if (buffInfo == null || buffInfo.EffectRes == "0")
  150.                 return null;

  151.             string resourcePath = GameConstDefine.LoadGameBuffEffectPath + buffInfo.EffectRes;


  152.             //加载特效信息
  153.             BuffEffect effect = new BuffEffect();
  154.             effect.InstID = instID;
  155.             effect.entity = buffEntity;
  156.             effect.projectID = instID;         
  157.             effect.resPath = resourcePath;

  158.             //创建特效
  159.             effect.Create();

  160.             //创建声音
  161.             string soundName = GameConstDefine.LoadGameSoundPath + buffInfo.sound;
  162.             if (buffInfo.sound != "0")
  163.             {
  164.                PlayAudio(effect, soundName, effect.obj);
  165.             }

  166.             //保存特效列表
  167.             AddEffect(effect.projectID, effect);
  168.          
  169.             return effect;
  170.         }


  171.         //3.创建基于时间的特效
  172.         public BeAttackEffect CreateTimeBasedEffect(string res, float time, Ientity entity)
  173.         {
  174.             if (res == "0")
  175.                 return null;

  176.             BeAttackEffect effect = new BeAttackEffect();
  177.             //加载特效信息
  178.             effect.skillID = 0;             //技能id=0     
  179.             effect.cehuaTime = time;
  180.             effect.enTargetKey = entity.GameObjGUID;
  181.             effect.resPath = res;           
  182.             //创建
  183.             effect.Create();

  184.             AddEffect(effect.projectID, effect);
  185.             return effect;
  186.         }


  187.         //4.普通追踪特效
  188.         public FlyEffect CreateFlyEffect(UInt64 owner, UInt64 target, uint skillID, uint projectID, Vector3 position, Vector3 direction, bool isAbsorb)
  189.         {               
  190.             SkillEmitConfig skillConfig = ConfigReader.GetSkillEmitCfg(skillID);

  191.             //判断资源路径是否有效
  192.             if (skillConfig == null || skillConfig.effect == "0")
  193.                 return null;

  194.             string resourcePath = GameConstDefine.LoadGameSkillEffectPath + "release/" + skillConfig.effect;
  195.         
  196.             ////测试
  197.             //if (skillConfig.effect == "suolian")
  198.             //{
  199.             //    skillConfig.emitType = 8;
  200.             //    resourcePath = "effect/skill/release/DragEffect";
  201.             //}


  202.             Ientity entityOwner, entityTarget;
  203.             EntityManager.AllEntitys.TryGetValue(owner, out entityOwner);
  204.             EntityManager.AllEntitys.TryGetValue(target, out entityTarget);

  205.             //释放者不能为空
  206.             if (entityOwner == null)
  207.             {
  208.                 //Debug.LogError("entityOnwer is null in CreateFlyEffect!" + "skillID:" + skillID.ToString() + "projectID:" + projectID.ToString());
  209.                 return null;
  210.             }

  211.             FlyEffect effect = new FlyEffect();
  212.             effect.enOwnerKey = entityOwner.GameObjGUID;

  213.             if (entityTarget != null)
  214.                 effect.enTargetKey = entityTarget.GameObjGUID;

  215.             effect.skillID = skillID;
  216.             effect.fixPosition = position;
  217.             effect.dir = direction;
  218.             effect.isAbsorb = isAbsorb;
  219.             effect.projectID = projectID;
  220.             effect.emitType = skillConfig.emitType;


  221.             //加载特效信息
  222.             effect.cehuaTime = skillConfig.lifeTime;
  223.             effect.resPath = resourcePath;

  224.             //创建
  225.             effect.Create();

  226.             AddEffect(effect.projectID, effect);
  227.             return effect;
  228.         }


  229.         //5.普通特效
  230.         public NormalEffect CreateNormalEffect(string res, GameObject parent)
  231.         {
  232.             if (res.EndsWith("/0"))
  233.                 return null;

  234.             NormalEffect effect = new NormalEffect();

  235.             //加载特效信息
  236.             effect.Target = parent;
  237.             effect.resPath = res;
  238.          

  239.             //创建
  240.             effect.Create();

  241.             if (effect.obj == null)
  242.             {
  243.                 return null;
  244.             }
  245.             AddEffect(effect.projectID, effect);
  246.             return effect;
  247.         }

  248.         public NormalEffect CreateNormalEffect(string res, Vector3 position, Vector3 dir)
  249.         {
  250.             if (res.EndsWith("/0"))
  251.                 return null;

  252.             NormalEffect effect = new NormalEffect();

  253.             //加载特效信息
  254.             effect.resPath = res;
  255.             effect.cehuaTime = 0;
  256.             

  257.             //创建
  258.             effect.Create();
  259.             if (effect.obj == null)
  260.             {
  261.                 return null;
  262.             }
  263.             effect.obj.transform.position = position;
  264.             effect.obj.transform.rotation = Quaternion.LookRotation(dir);

  265.             AddEffect(effect.projectID, effect);
  266.             return effect;
  267.         }

  268.         //6.创建普通引导特效
  269.         public NormalEffect CreateLeadingEffect(UInt64 owner, UInt32 skillModelID, UInt32 projectid)
  270.         {
  271.             SkillLeadingonfig skillconfig = ConfigReader.GetSkillLeadingConfig(skillModelID);

  272.             //判断路径是否有效
  273.             if (skillconfig == null || skillconfig.effect == "0")
  274.             {
  275.                 return null;
  276.             }

  277.             string resourcePath = GameConstDefine.LoadGameSkillEffectPath + "release/" + skillconfig.effect;
  278.             NormalEffect effect = new NormalEffect();

  279.             //加载特效信息
  280.             effect.projectID = projectid;
  281.             effect.NEType = NormalEffect.NormalEffectType.eNE_Leading;            
  282.             effect.resPath = resourcePath;

  283.             Ientity entity = null;
  284.             EntityManager.AllEntitys.TryGetValue(owner, out entity);

  285.             //创建
  286.             if (entity != null)
  287.             {
  288.                 effect.Create();
  289.                 if (effect.obj == null)
  290.                 {
  291.                     return null;
  292.                 }
  293.                 if (null != entity.RealEntity.objPoint)
  294.                 {
  295.                     effect.obj.transform.parent = entity.RealEntity.objPoint.transform;
  296.                     effect.obj.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
  297.                 }
  298.             }

  299.             AddEffect(effect.projectID, effect);
  300.             return effect;
  301.         }

  302.         //7.创建受击特效
  303.         public BeAttackEffect CreateBeAttackEffect(UInt64 owner, UInt64 target, uint skillID)
  304.         {
  305.             SkillAccountConfig skillAccConfig = ConfigReader.GetSkillAccountCfg(skillID);

  306.             //判断是否有后续屏幕振动效果            
  307.             if (skillAccConfig != null && skillAccConfig.cameraId != 0)
  308.             {
  309.                 //振动类型1 释放为本机振动  2受机为本机振动
  310.                 bool shakeFlag = false;
  311.                 if (skillAccConfig.cameraTarget == 1)
  312.                 {
  313.                     Ientity ownerEntity = null;
  314.                     EntityManager.AllEntitys.TryGetValue(owner, out ownerEntity);

  315.                     if (ownerEntity != null && ownerEntity is Iselfplayer)
  316.                     {
  317.                         shakeFlag = true;
  318.                     }                                    
  319.                 }
  320.                 else if (skillAccConfig.cameraTarget == 2)
  321.                 {
  322.                     Ientity targetEntity = null;
  323.                     EntityManager.AllEntitys.TryGetValue(target, out targetEntity);

  324.                     if (targetEntity != null && targetEntity is Iselfplayer)
  325.                     {
  326.                         shakeFlag = true;
  327.                     }                        
  328.                 }
  329.                 else if (skillAccConfig.cameraTarget == 3)
  330.                 {
  331.                     Ientity ownerEntity = null;
  332.                     Ientity targetEntity = null;
  333.                     EntityManager.AllEntitys.TryGetValue(owner, out ownerEntity);
  334.                     EntityManager.AllEntitys.TryGetValue(target, out targetEntity);

  335.                     if ((ownerEntity != null && ownerEntity is Iselfplayer) || targetEntity != null && targetEntity is Iselfplayer)
  336.                     {
  337.                         shakeFlag = true;
  338.                     }                                                                          
  339.                 }

  340.                 if (shakeFlag)
  341.                 {
  342.                     //获屏幕振动信息               
  343.                     SkillCameraConfig skillCameracfg = ConfigReader.GetSkillCameraConfig(skillAccConfig.cameraId);
  344.                     if (skillCameracfg != null)
  345.                     {
  346.                         //被击飞信息                    
  347.                         float period = skillCameracfg.mPeriod;
  348.                         float offPeriod = skillCameracfg.mOffPeriod;
  349.                         int shakeOrient = skillCameracfg.mShakeOrient;
  350.                         float shakeTime = skillCameracfg.mShakeTime;
  351.                         float maxWave = skillCameracfg.mMaxWave;
  352.                         float minWave = skillCameracfg.mMinWave;

  353.                         Shakecamera(period, offPeriod, shakeOrient, shakeTime, maxWave, minWave);
  354.                     }
  355.                 }              
  356.             }


  357.             //判断路径是否有效
  358.             if (skillAccConfig == null || skillAccConfig.effect == "0")
  359.             {
  360.                 return null;
  361.             }


  362.             //加载特效信息
  363.             Ientity entityOwner, entityTarget;
  364.             EntityManager.AllEntitys.TryGetValue(owner, out entityOwner);
  365.             EntityManager.AllEntitys.TryGetValue(target, out entityTarget);

  366.             //根据受击特效跟玩家距离判断是否需要创建特效
  367.             if (entityTarget != null)
  368.             {
  369.                 if (!CheckEffectValid(entityTarget.objTransform.position, skillAccConfig.lifeTime))
  370.                     return null;
  371.             }

  372.             string resourcePath = GameConstDefine.LoadGameSkillEffectPath + "hit/" + skillAccConfig.effect;
  373.             BeAttackEffect effect = new BeAttackEffect();
  374.       
  375.             if (entityTarget != null)
  376.                 effect.enTargetKey = entityTarget.GameObjGUID;

  377.             if (entityOwner == null)
  378.                 return null;

  379.             effect.enOwnerKey = entityOwner.GameObjGUID;

  380.             effect.skillID = skillID;            
  381.             effect.resPath = resourcePath;
  382.             effect.cehuaTime = skillAccConfig.lifeTime;

  383.             //创建
  384.             effect.Create();
  385.             //播放声音
  386.             string soundPath = GameConstDefine.LoadGameSoundPath + skillAccConfig.sound;
  387.             if (skillAccConfig.sound != "0")
  388.                 PlayAudio(effect, soundPath, effect.obj);

  389.             AddEffect(effect.projectID, effect);
  390.             return effect;
  391.         }


  392.         //8.创建技能范围特效
  393.         public SkillAreaEffect CreateAreaEffect(UInt64 owner, uint skillID, UInt32 projectId, Vector3 skillDir, Vector3 skillPos)
  394.         {
  395.             SkillAreaConfig skillConfig = ConfigReader.GetSkillAreaConfig(skillID);
  396.             //判断路径是否有效
  397.             if (skillConfig == null || skillConfig.effect == "0")
  398.             {
  399.                 return null;
  400.             }

  401.             string resourcePath = GameConstDefine.LoadGameSkillEffectPath + "release/" + skillConfig.effect;

  402.             SkillAreaEffect effect = new SkillAreaEffect();

  403.             //加载特效信息
  404.             //Ientity entityOwner;
  405.             //EntityManager.AllEntitys.TryGetValue(owner, out entityOwner);
  406.             //if (entityOwner == null)
  407.             //{
  408.             //    //Debug.LogError("CreateAreaEffect  entityOwner is null");
  409.             //    //return null;
  410.             //}
  411.             //effect.enOwnerKey = entityOwner.GameObjGUID;
  412.             effect.skillID = skillID;
  413.             effect.dir = skillDir;
  414.             effect.fixPosition = skillPos;
  415.             effect.projectID = projectId;
  416.             

  417.             effect.resPath = resourcePath;
  418.             effect.cehuaTime = skillConfig.lifeTime;

  419.             //创建
  420.             effect.Create();

  421.             //播放声音
  422.             string soundPath = GameConstDefine.LoadGameSoundPath + skillConfig.sound;
  423.                 PlayAudio(effect, soundPath, effect.obj);

  424.             AddEffect(effect.projectID, effect);
  425.             return effect;
  426.         }

  427.         #endregion

  428.         //添加特效到EffectMap表
  429.         public void AddEffect(Int64 id, IEffect effect)
  430.         {
  431.             if (!m_EffectMap.ContainsKey(id))
  432.             {
  433.                 m_EffectMap.Add(id, effect);
  434.             }
  435.             else
  436.             {
  437.                 Debug.LogError("the id: " + id.ToString() + "effect: " + effect.resPath + "has already exsited in EffectManager::AddEffect");
  438.             }
  439.         }

  440.         //获取本地id
  441.         public Int64 GetLocalId()
  442.         {
  443.             return --localIndex;
  444.         }

  445.         //判断特效id是否有效              
  446.         public bool IsValid(Int64 projectid)
  447.         {
  448.             return m_EffectMap.ContainsKey(projectid);
  449.         }

  450.         //根据特下id获取特效
  451.         public IEffect GetEffect(Int64 projectid)
  452.         {
  453.             if (m_EffectMap.ContainsKey(projectid))
  454.             {
  455.                 return m_EffectMap[projectid];
  456.             }

  457.             return null;
  458.         }

  459.         //特效系统更新
  460.         public void UpdateSelf()
  461.         {
  462.             deadEffectList.Clear();

  463.             //检查特效是否死亡
  464.             foreach (var effect in m_EffectMap.Values)
  465.             {
  466.                 effect.Update();

  467.                 //特效死亡 或者绑定Object对象被外部删除
  468.                 if (effect.isDead == true || effect.obj == null)
  469.                 {
  470.                     deadEffectList.Add(effect);
  471.                 }
  472.             }
  473.         }

  474.         //特效系统处理特效删除
  475.         public void HandleDelete()
  476.         {
  477.             foreach (IEffect r in deadEffectList)
  478.             {
  479.                 DestroyEffect(r);
  480.             }
  481.         }

  482.         //特效删除
  483.         public void DestroyEffect(Int64 projectID)
  484.         {
  485.             if (m_EffectMap.ContainsKey(projectID))
  486.             {
  487.                 DestroyEffect(m_EffectMap[projectID]);
  488.             }
  489.         }

  490.         //特效删除
  491.         public void DestroyEffect(IEffect effect)
  492.         {
  493.             effect.Release();
  494.             m_EffectMap.Remove(effect.projectID);
  495.             effect = null;
  496.         }

  497.         //删除所有特效
  498.         public void DestroyAllEffect()
  499.         {
  500.             foreach (KeyValuePair<Int64, IEffect> pair in m_EffectMap)
  501.             {
  502.                 IEffect effect = pair.Value;
  503.                 effect.Release();
  504.                 effect = null;
  505.             }
  506.             m_EffectMap.Clear();
  507.         }

  508.         public void Clear()
  509.         {
  510.             m_EffectMap.Clear();
  511.         }

  512.         //播放技能释放声音
  513.         public static void playSkillReleaseSound(Ientity entity, int skillID)
  514.         {
  515.             if (entity == null)
  516.             {
  517.                 return;
  518.             }
  519.             SkillManagerConfig skillinfo = ConfigReader.GetSkillManagerCfg(skillID);
  520.             if (skillinfo == null)
  521.             {
  522.                 return;
  523.             }
  524.             string soundPath = GameConstDefine.LoadGameSoundPath + skillinfo.rSound;
  525.             ResourceUnit objUnit = ResourcesManager.Instance.loadImmediate(soundPath, ResourceType.ASSET);
  526.             AudioClip clip = objUnit.Asset as AudioClip;
  527.             if (clip != null)
  528.             {
  529.                 AudioSource Audio = AudioManager.Instance.PlayEffectAudio(clip);
  530.                 SceneSoundManager.Instance.addSound(Audio, entity.RealEntity.gameObject);
  531.             }
  532.         }
  533.     }      
  534. }
复制以上内容
收藏
0 条回帖
需要登陆后才可进行回复 登录

返回顶部
现在加入我们,注册一个账号 账号登陆 QQ账号登陆 微博账号登陆

微信扫一扫,马上找工作

在线客服