using Thousandto.Cfg.Data; using Thousandto.Code.Center; using Thousandto.Code.Global; using Thousandto.Code.Logic.WarningField; using Thousandto.Core.Asset; using Thousandto.Core.Base; using System; using System.Collections.Generic; using System.Text; using UnityEngine; using Thousandto.Core.PostEffect; namespace Thousandto.Code.Logic { public class SkillObjectSkill { private SkillObject _owner = null; private SkillVisualInfo _skillVisualDef = null; private float _frameTimer = 0f; public const float OneFrameTime = 1f / 30f; private uint _nonceFrame = 0; private bool _isEnd = false; private FGameObjectVFXBox _vfxIDList = new FGameObjectVFXBox(); public SkillVisualInfo SkillVisualDef { get { return _skillVisualDef; } } public SkillObject Owner { get { return _owner; } set { _owner = value; } } public bool IsEnd { get { return _isEnd; } } public bool DoCreate(SkillVisualInfo cfg, SkillObject owner) { _owner = owner; _skillVisualDef = cfg; return true; } private void DoEvent(uint frame) { for (int i = 0; i < _skillVisualDef.DataList.Count; ++i) { if (frame == _skillVisualDef.DataList[i].EventFrame) { switch (_skillVisualDef.DataList[i].EventType) { case SkillEventDefine.PlayVfx: { var objOwner = GameCenter.GameSceneSystem.FindEntity(_owner.OwnerID); if (GameObjectLimit.CanPlayVfx(objOwner, ModelTypeCode.SkillVFX)) { var vfxEvent = _skillVisualDef.DataList[i] as PlayVfxEventInfo; if (vfxEvent.VfxID > 0) { //Debug.LogError("召唤物释放技能!!"+";;;;"+ vfxEvent.VfxID); var lod = 0; if (!objOwner.IsLocalPlayer() && !objOwner.IsLocalFlySword()) {//只针对其他玩家 //这里因为GameSettingKeyCode.OtherPlayerSkillVfxLevel的值是:0屏蔽全部,1弱,2中,3强. //而lod是0最强,往下最弱. lod = FGameObjectVFXRoot.CN_VFX_LEVEL_MAX - GameCenter.GameSetting[GameSettingKeyCode.OtherPlayerSkillVfxLevel]; ; } var vfxID = new FGameObjectVFX(ModelTypeCode.SkillVFX, vfxEvent.VfxID, true, false, lod); vfxID.SetLayer(Owner.Layer); vfxID.SetParent(Owner.ModelTransform); vfxID.SetLocalPosition(Vector3.zero); vfxID.SetLocalEulerAngles(Vector3.zero); if(!SkillVisualDef.EndClearVfx) { //技能不在结束时清除的特效,强制设置为非loop vfxID.IsNotLoop = true; } vfxID.Play(); _vfxIDList.Add(vfxID); //10倍技能帧数 var vfxLifeTime = _skillVisualDef.FrameCount * OneFrameTime * 10; if (vfxLifeTime < 5f) { vfxLifeTime = 5f; } vfxID.LiftTime = vfxLifeTime; } } } break; case SkillEventDefine.PlaySfx: { var sfxEvent = _skillVisualDef.DataList[i] as PlaySfxEventInfo; AudioPlayer.PlaySfx(null, sfxEvent.Sound, true); } break; case SkillEventDefine.PlayBlur: { var owner = GameCenter.GameSceneSystem.FindEntity(Owner.OwnerID); if (owner != null && (owner.IsLocalPlayer() || owner.IsLocalFlySword())) { if (GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.EnablePostEffect) && !GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.TPSkillBloom) && GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.EnableRadialBlurEffect)) { var Info = _skillVisualDef.DataList[i] as PlayBlurEventInfo; if (Info.BlurType == 0) { PostEffectManager.Instance.PlayRadiaBlur(Info.Start, Info.End, Info.Time); } else { PostEffectManager.Instance.PlayGaussBlur(Info.GrassBlurSize, Info.Time); } } } } break; case SkillEventDefine.PlayCameraShake: { var owner = GameCenter.GameSceneSystem.FindEntity(Owner.OwnerID); if (owner != null && (owner.IsLocalPlayer() || owner.IsLocalFlySword())) { var Info = _skillVisualDef.DataList[i] as PlayCameraShakeEventInfo; if (!GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.TPSkillShake) && GameCenter.GameSetting.IsEnabled(GameSettingKeyCode.EnableShakeEffect)) { PostEffectManager.Instance.PlayCameraShake(Info.Curve, Info.CurveTotalTime, Info.CurveType, Info.CurvePower); } } } break; case SkillEventDefine.PlaySlow: { var owner = GameCenter.GameSceneSystem.FindEntity(Owner.OwnerID); if (owner != null && (owner.IsLocalPlayer() || owner.IsLocalFlySword())) { var Info = _skillVisualDef.DataList[i] as PlaySlowEventInfo; GameCenter.GameSceneSystem.DoTimeScale(Info.TimeScale, Info.Time); } } break; } } } } public void Start() { _nonceFrame = 0; _frameTimer = 0f; _vfxIDList.Clear(); DoEvent(_nonceFrame); CombatUtil.ShowWarningFiled(_skillVisualDef, _owner); } public void Stop() { _vfxIDList.Clear(SkillVisualDef.EndClearVfx); } public void Update(float dt) { if (IsEnd) return; _frameTimer += dt; while (_frameTimer >= OneFrameTime) { _frameTimer -= OneFrameTime; ++_nonceFrame; DoEvent(_nonceFrame); } if (_nonceFrame >= _skillVisualDef.FrameCount) { //技能结束 _isEnd = true; } _vfxIDList.Update(0); } } }