/// <summary> /// 检测中断 /// </summary> /// <returns></returns> bool ProcessInterruptEveryFrame() { if (_queuedInterrupt != null) { return(false); } if (_activeActionData.InterruptList.Count == 0) { return(false); } int iCount = _activeActionData.InterruptList.Count; for (int i = 0; i < iCount; i++) { ActionInterrupt interrupt = _activeActionData.InterruptList[i]; if (InterruptEnabled(i)) { if (ProcessActionInterrupt(interrupt)) { return(true); } } } return(false); }
/// <summary> /// 处理中断 /// 立即模式 立即由切换Action. /// 等待完成 等待动画播放完成后执行. /// </summary> /// <param name="interrupt"></param> /// <returns></returns> bool LinkAction(ActionInterrupt interrupt) { if (ActionHelp.GetActionIndex(_actionGroupData, interrupt.ActionID) == -1) { Debug.LogError(string.Format("Can't find ActionID {0}", interrupt.ActionID.ToString())); return(false); } bool connectImmediately = interrupt.ConnectMode == ActionInterruptConnectMode.Immediately; if (interrupt.ConnectMode == ActionInterruptConnectMode.WaitFinish) { // 中断触发的时机是当前动画播放完成 int actualQueuedTime = interrupt.ConnectTime <= 100 ? _activeActionData.AnimTime * interrupt.ConnectTime / 100 : // [0-100] AnimTime _activeActionData.AnimTime + _activeActionData.PoseTime * (interrupt.ConnectTime - 100) / 100; if (actualQueuedTime <= _actionTime) { connectImmediately = true; } _queuedInterrupt = interrupt; _queuedInterruptTime = actualQueuedTime; } // 立即中断到指定动画 if (connectImmediately || interrupt.ConnectMode == ActionInterruptConnectMode.Immediately) { ChangeAction(interrupt.ActionID, 0); } return(true); }
private void Awake() { Ins = this; Log = new Log(); ActiveState = new List <PersistState>(); GameOverlay = new GameOverlayDialogState(); FightState = new FightState(); ReplayState = new ReplayState(); NickNameDialogState = new NickNameDialogState(); BattleStatusDialogState = new BattleStatusDialogState(); PlayerDialogState = new PlayerDialogState(); ChatDialogState = new ChatDialogState(); PsdEditDialogState = new PsdEditDialogState(); RoomChatDialogState = new RoomChatDialogState(); LoadingEx = new LoadingEXDialogState(); ItemInfoDialogState = new ItemInfoDialogState(); GunShootDialogStatus = new GunShootDialogStatus(); //面板管理器. DialogStateManager = new MainDialogStateManager(); //顺序排队弹出框. PopupStateManager = new MainPopupStateManager(); //各类游戏数据. GameStateMgr = new GameStateMgr(); UpdateHelper = new UpdateHelper(); AppInfo = new AppInfo(); CombatData = new CombatData(); GameNotice = new GameNotice(); MeteorManager = new MeteorManager(); ScriptMng = new ScriptMng(); SFXLoader = new SFXLoader(); ActionInterrupt = new ActionInterrupt(); BuffMng = new BuffMng(); EventBus = new EventBus(); NetWorkBattle = new NetWorkBattle(); SceneMng = new SceneMng(); FrameSync = new FrameSync(); MeteorBehaviour = new MeteorBehaviour(); DropMng = new DropMng(); //原版相关资源的加载器. MenuResLoader = new MenuResLoader(); SkcLoader = new SkcLoader(); BncLoader = new BncLoader(); FMCLoader = new FMCLoader(); GMBLoader = new GMBLoader(); GMCLoader = new GMCLoader(); DesLoader = new DesLoader(); FMCPoseLoader = new FMCPoseLoader(); DataMgr = new DataMgr(); SfxMeshGenerator = new SfxMeshGenerator(); RoomMng = new RoomMng(); SoundManager = new SoundManager(); ResMng = new ResMng(); DlcMng = new DlcMng(); DontDestroyOnLoad(gameObject); Log.WriteError(string.Format("GameStart AppVersion:{0}", Main.Ins.AppInfo.AppVersion())); }
/// <summary> /// 处理中断 /// </summary> /// <param name="interrupt"></param> /// <returns></returns> bool ProcessActionInterrupt(ActionInterrupt interrupt) { if (!CheckActionInterrupt(interrupt)) { return(false); } return(LinkAction(interrupt)); }
//private string beforName = string.Empty; /// <summary> /// 重置中断标记 /// </summary> void ResetInterruptList() { _actionInterruptFlag = 0; _queuedInterrupt = null; // copy the action request enabled/disabled flags. //for (int i = 0; i < _activeActionData.InterruptList.Count; i++) //{ // ActionInterrupt actionInterrupt = _activeActionData.InterruptList[i]; // _actionInterruptFlag |= (1 << i); // //if (actionInterrupt.InputEnable) // // _actionInterruptFlag |= (1 << i); //} }
void Create() { Log = new Log(); LayerManager.Init(); //不受状态机控制,仅打开和关闭的 PersistMgr = PersistDialogMgr.Ins; //面板管理器. DialogStateManager = new MainDialogMgr(); //顺序排队弹出框. PopupStateManager = new MainPopupStateManager(); //各类游戏数据. GameStateMgr = GameStateMgr.Ins; AppInfo = AppInfo.Ins; CombatData = CombatData.Ins; GameNotice = new GameNotice(); MeteorManager = MeteorManager.Ins; ScriptMng = ScriptMng.Ins; ActionInterrupt = ActionInterrupt.Ins; BuffMng = BuffMng.Ins; EventBus = new EventBus(); NetWorkBattle = NetWorkBattle.Ins; SceneMng = SceneMng.Ins; //FrameSyncLocal = FrameSyncLocal.Ins; FrameSyncServer = FrameSyncServer.Ins; MeteorBehaviour = MeteorBehaviour.Ins; DropMng = DropMng.Ins; //原版相关资源的加载器. MenuResLoader = MenuResLoader.Ins; SkcLoader = SkcLoader.Ins; BncLoader = BncLoader.Ins; FMCLoader = FMCLoader.Ins; GMBLoader = GMBLoader.Ins; GMCLoader = GMCLoader.Ins; DesLoader = DesLoader.Ins; FMCPoseLoader = FMCPoseLoader.Ins; SFXLoader = SFXLoader.Ins; AmbLoader = AmbLoader.Ins; DataMgr = DataMgr.Ins; SfxMeshGenerator = SfxMeshGenerator.Ins; RoomMng = RoomMng.Ins; SoundManager = SoundManager.Ins; DlcMng = DlcMng.Ins; PathMng = PathMng.Ins; DownloadManager = DownloadManager.Ins; DontDestroyOnLoad(gameObject); Log.WriteError(string.Format("GameStart AppVersion:{0}", Main.Ins.AppInfo.AppVersion())); }
/// <summary> /// 等待中断处理程序 /// </summary> /// <param name="deltaTime">当前帧间隔时间</param> /// <returns></returns> bool ProcessQueuedInterrupt(int deltaTime) { if (_queuedInterrupt == null) { return(false); } // 时间是否满足 if (!CheckTime(deltaTime)) { return(false); } // 误差时间,下一帧切换, 动画播放时长 - 中断时间. int nextActionTime = _actionTime + deltaTime - _queuedInterruptTime; ChangeAction(_queuedInterrupt.ActionID, nextActionTime); _queuedInterrupt = null; return(true); }
/// <summary> /// 检测中断条件 /// </summary> /// <param name="interrupt">true 触发中断,否则不处理.</param> /// <returns></returns> bool CheckActionInterrupt(ActionInterrupt interrupt) { // 检测中断条件 (与) if (interrupt.ConditionType == ConditionType.And) { for (int i = 0; i < interrupt.Conditions.Count; i++) { if (interrupt.Conditions[i].Check(_ownerUnit) == false) { return(false); } } return(true); } // 检测中断条件 (或) else { for (int i = 0; i < interrupt.Conditions.Count; i++) { if (interrupt.Conditions[i].Check(_ownerUnit)) { if (interrupt.ActionID == "W10020") { Debug.Log(string.Format("中断成功 {0} key {1} next key {2} State {3} Interrupt {4} Frame {5}", interrupt.InterruptName, _actionKey, tempNextKey, InputManager.Instance.GetKeycodeState(GameInputType.Attack).State, _actionInterruptFlag, Time.frameCount)); //Debug.log } return(true); } //else // Debug.Log(string.Format("中断失败 {0} key {1} next key {2}", interrupt.InterruptName, _actionKey, tempNextKey)); } return(false); } }
//public void ProcessKeyActionInterrupt(float delta) //{ // int preKey = _actionKey; // int nextKey = GetNextKey((int) (delta*1000)); // if (_queuedInterrupt != null) // return; // // check the action interrupts // if (_activeActionData.InterruptList.Count == 0) // return; // int iCount = _activeActionData.InterruptList.Count; // for (int i = 0; i < iCount; i++) // { // ActionInterrupt interrupt = _activeActionData.InterruptList[i]; // //if (interrupt.) // //if (interrupt.ke) // if ((preKey >= interrupt.DetectionStartTime || nextKey >= interrupt.DetectionStartTime) && // (preKey <= interrupt.DetectionEndTime || nextKey <= interrupt.DetectionEndTime)) // { // //if ((_actionInterruptFlag & (1 << i)) == 0 && interrupt.InterruptName.Contains("Idle") == false) // //{ // // Debug.Log(string.Format("开始中断检测 {0} cur {1} next {2} [start {3} end {4}]", interrupt.InterruptName, _actionKey, tempNextKey, interrupt.DetectionStartTime, interrupt.DetectionEndTime)); // //} // _actionInterruptFlag |= (1 << i); // } // else // { // //if ((_actionInterruptFlag & (1 << i)) == 1 && interrupt.InterruptName.Contains("Idle") == false) // //{ // // Debug.Log(string.Format("结束中断检测 {0} cur {1} next {2} [start {3} end {4}]", interrupt.InterruptName, _actionKey, tempNextKey, interrupt.DetectionStartTime, interrupt.DetectionEndTime)); // //} // _actionInterruptFlag &= ~(1 << i); // } // if (InterruptEnabled(i)) // { // if (ProcessActionInterrupt(interrupt)) // return; // } // } // //return false; // //ProcessActionInterruptList(_actionKey, GetNextKey((int) (delta*1000))); //} public bool ProcessActionInterruptList(int preKey, int nextKey) { if (_queuedInterrupt != null) { return(false); } // check the action interrupts if (_activeActionData.InterruptList.Count == 0) { return(false); } int iCount = _activeActionData.InterruptList.Count; for (int i = 0; i < iCount; i++) { ActionInterrupt interrupt = _activeActionData.InterruptList[i]; //if (interrupt.ke) if ((preKey >= interrupt.DetectionStartTime || nextKey >= interrupt.DetectionStartTime) && (preKey <= interrupt.DetectionEndTime || nextKey <= interrupt.DetectionEndTime)) { if ((_actionInterruptFlag & (1 << i)) == 0 && interrupt.InterruptName.Contains("Idle") == false) { Debug.Log(string.Format("开始中断检测 {0} cur {1} next {2} [start {3} end {4}]", interrupt.InterruptName, _actionKey, tempNextKey, interrupt.DetectionStartTime, interrupt.DetectionEndTime)); } _actionInterruptFlag |= (1 << i); } else { if ((_actionInterruptFlag & (1 << i)) == 1 && interrupt.InterruptName.Contains("Idle") == false) { Debug.Log(string.Format("结束中断检测 {0} cur {1} next {2} [start {3} end {4}]", interrupt.InterruptName, _actionKey, tempNextKey, interrupt.DetectionStartTime, interrupt.DetectionEndTime)); } _actionInterruptFlag &= ~(1 << i); } //if (/*interrupt.DetectionStartTime != 0 &&*/ interrupt.DetectionStartTime > preKey && // interrupt.DetectionStartTime <= nextKey) //{ // if ((_actionInterruptFlag & (1 << i)) == 0) // { // Debug.Log(string.Format("开始中断检测 {0} cur {1} next {2} [start {3} end {4}]", interrupt.InterruptName, _actionKey, tempNextKey, interrupt.DetectionStartTime, interrupt.DetectionEndTime)); // } // _actionInterruptFlag |= (1 << i); //} //if (/*interrupt.DetectionEndTime != 200 &&*/ interrupt.DetectionEndTime > preKey && // interrupt.DetectionEndTime <= nextKey) //{ // if ((_actionInterruptFlag & (1 << i)) == 1) // { // Debug.Log(string.Format("结束中断检测 {0} cur {1} next {2} [start {3} end {4}]", interrupt.InterruptName, _actionKey, tempNextKey, interrupt.DetectionStartTime, interrupt.DetectionEndTime)); // } // _actionInterruptFlag &= ~(1 << i); //} if (InterruptEnabled(i)) { if (ProcessActionInterrupt(interrupt)) { return(true); } //Debug.Log(string.Format("{0} key {1} next {2}", interrupt.InterruptName, _actionKey, nextKey)); } } return(false); }
/// <summary> /// 等待中断处理程序 /// </summary> /// <param name="deltaTime">当前帧间隔时间</param> /// <returns></returns> bool ProcessQueuedInterrupt(int deltaTime) { if (_queuedInterrupt == null) return false; // 时间是否满足 if (!CheckTime(deltaTime)) return false; // 误差时间,下一帧切换, 动画播放时长 - 中断时间. int nextActionTime = _actionTime + deltaTime - _queuedInterruptTime; ChangeAction(_queuedInterrupt.ActionID, nextActionTime); _queuedInterrupt = null; return true; }
/// <summary> /// 处理中断 /// </summary> /// <param name="interrupt"></param> /// <returns></returns> bool ProcessActionInterrupt(ActionInterrupt interrupt) { if (!CheckActionInterrupt(interrupt)) return false; return LinkAction(interrupt); }
/// <summary> /// 处理中断 /// 立即模式 立即由切换Action. /// 等待完成 等待动画播放完成后执行. /// </summary> /// <param name="interrupt"></param> /// <returns></returns> bool LinkAction(ActionInterrupt interrupt) { if (ActionHelp.GetActionIndex(_actionGroupData, interrupt.ActionID) == -1) { Debug.LogError(string.Format("Can't find ActionID {0}", interrupt.ActionID.ToString())); return false; } bool connectImmediately = interrupt.ConnectMode == ActionInterruptConnectMode.Immediately; if (interrupt.ConnectMode == ActionInterruptConnectMode.WaitFinish) { // 中断触发的时机是当前动画播放完成 int actualQueuedTime = interrupt.ConnectTime <= 100 ? _activeActionData.AnimTime * interrupt.ConnectTime / 100 : // [0-100] AnimTime _activeActionData.AnimTime + _activeActionData.PoseTime * (interrupt.ConnectTime - 100) / 100; if (actualQueuedTime <= _actionTime) connectImmediately = true; _queuedInterrupt = interrupt; _queuedInterruptTime = actualQueuedTime; } // 立即中断到指定动画 if (connectImmediately || interrupt.ConnectMode == ActionInterruptConnectMode.Immediately) { ChangeAction(interrupt.ActionID, 0); } return true; }
/// <summary> /// 检测中断条件 /// </summary> /// <param name="interrupt">true 触发中断,否则不处理.</param> /// <returns></returns> bool CheckActionInterrupt(ActionInterrupt interrupt) { // 检测中断条件 (与) if (interrupt.ConditionType == ConditionType.And) { for (int i = 0; i < interrupt.Conditions.Count; i++) { if (interrupt.Conditions[i].Check(_ownerUnit) == false) return false; } return true; } // 检测中断条件 (或) else { for (int i = 0; i < interrupt.Conditions.Count; i++) { if (interrupt.Conditions[i].Check(_ownerUnit)) { if (interrupt.ActionID == "W10020") { Debug.Log(string.Format("中断成功 {0} key {1} next key {2} State {3} Interrupt {4} Frame {5}", interrupt.InterruptName, _actionKey, tempNextKey, InputManager.Instance.GetKeycodeState(GameInputType.Attack).State, _actionInterruptFlag, Time.frameCount)); //Debug.log } return true; } //else // Debug.Log(string.Format("中断失败 {0} key {1} next key {2}", interrupt.InterruptName, _actionKey, tempNextKey)); } return false; } }
void Test_Action_0() { ActionGroupData data = new ActionGroupData { GroupNum = 0, RoleId = 1003, StartupAction = "N0000", ActionDatas = new List <ActionData>() }; ActionInterrupt interrupt; // 站立 ActionData action = null; action = new ActionData { AnimId = "N0000", AnimTime = 900, BlendTime = 100, CanMove = false, DefaultLinkActionId = "N0000", MoveSpeed = 0, Name = "Idle" }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_stand_f", Weight = 1, UseDir = false, Start = 0, End = 100 }); // Interrupt interrupt = new ActionInterrupt { ActionID = "N0030", ConditionType = ConditionType.Or, ConnectTime = 100, DetectionStartTime = 0, DetectionEndTime = 200, InterruptName = "Idle => 战斗跑步" }; interrupt.Conditions.Add(new InputCondition(InputState.KeyPressing, GameInputType.Move)); action.InterruptList.Add(interrupt); interrupt = new ActionInterrupt() { ActionID = "W10010", ConditionType = ConditionType.Or, ConnectTime = 100, DetectionStartTime = 0, DetectionEndTime = 200, InterruptName = "Idle => 普攻1", ConnectMode = ActionInterruptConnectMode.Immediately }; interrupt.Conditions.Add(new InputCondition(InputState.KeyDown, GameInputType.Attack)); interrupt.Conditions.Add(new InputCondition(InputState.KeyRelease, GameInputType.Attack)); action.InterruptList.Add(interrupt); // 跑步 action = new ActionData { AnimId = "N0030", AnimTime = 600, BlendTime = 100, CanMove = true, DefaultLinkActionId = "N0030", MoveSpeed = 500, Name = "战斗跑步" }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_runfront_01", Weight = 1, UseDir = false, Start = 0, End = 100 }); interrupt = new ActionInterrupt { ActionID = "N0000", ConditionType = ConditionType.Or, ConnectTime = 100, DetectionStartTime = 0, DetectionEndTime = 200, InterruptName = "战斗跑步 => Idle" }; interrupt.Conditions.Add(new InputCondition(InputState.KeyRelease, GameInputType.Move)); action.InterruptList.Add(interrupt); interrupt = new ActionInterrupt() { ActionID = "W10010", ConditionType = ConditionType.Or, ConnectTime = 100, DetectionStartTime = 0, DetectionEndTime = 200, InterruptName = "战斗跑步 => 普攻1", ConnectMode = ActionInterruptConnectMode.Immediately }; interrupt.Conditions.Add(new InputCondition(InputState.KeyDown, GameInputType.Attack)); interrupt.Conditions.Add(new InputCondition(InputState.KeyRelease, GameInputType.Attack)); action.InterruptList.Add(interrupt); // 普攻1 action = new ActionData() { AnimId = "W10010", AnimTime = 200, BlendTime = 100, CanMove = false, DefaultLinkActionId = "W10015", MoveSpeed = 0, Name = "普攻1", PoseTime = 50, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_01a", Weight = 1, UseDir = false, Start = 18, End = 100 }); action.EventArgses.Add(new EffectEventArgs() { ResourcePath = "Assets/LocalResources/Actor/Effect/fx_my_p_01.prefab", BindingType = EffectBindingType.BindingOnwer, Time = 20, LifeTime = 500, PositionY = 110, //LocalOffset }); action.EventArgses.Add(new VelocityEventArgs() { Time = 20, VelocityZ = 550, }); action.EventArgses.Add(new VelocityEventArgs() { Time = 70, VelocityZ = 0, }); interrupt = new ActionInterrupt(); interrupt.ActionID = "W10020"; interrupt.ConditionType = ConditionType.Or; interrupt.ConnectMode = ActionInterruptConnectMode.WaitFinish; interrupt.DetectionStartTime = 60; interrupt.DetectionEndTime = 200; interrupt.ConnectTime = 100; interrupt.InterruptName = "普攻1 => 普攻2"; //interrupt.Conditions.Add(new InputCondition(InputState.KeyRelease, GameInputType.Attack)); interrupt.Conditions.Add(new InputCondition(InputState.KeyDown, GameInputType.Attack)); action.InterruptList.Add(interrupt); // 普攻1 收僵 action = new ActionData() { AnimId = "W10015", AnimTime = 300, BlendTime = 100, CanMove = false, DefaultLinkActionId = "N0000", MoveSpeed = 0, Name = "普攻1[收僵]", }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_01b", Weight = 1, UseDir = false, Start = 0, End = 100 }); // 普攻2 action = new ActionData() { AnimId = "W10020", AnimTime = 200, BlendTime = 100, CanMove = false, DefaultLinkActionId = "W10025", MoveSpeed = 0, Name = "普攻2", PoseTime = 100, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_02a", Weight = 1, UseDir = false, Start = 0, End = 100 }); interrupt = new ActionInterrupt(); interrupt.ActionID = "W10030"; interrupt.ConditionType = ConditionType.Or; interrupt.ConnectMode = ActionInterruptConnectMode.WaitFinish; interrupt.DetectionStartTime = 60; interrupt.DetectionEndTime = 200; interrupt.ConnectTime = 100; interrupt.InterruptName = "普攻2 => 普攻3"; //interrupt.Conditions.Add(new InputCondition(InputState.KeyRelease, GameInputType.Attack)); interrupt.Conditions.Add(new InputCondition(InputState.KeyDown, GameInputType.Attack)); action.InterruptList.Add(interrupt); action.EventArgses.Add(new EffectEventArgs() { ResourcePath = "Assets/LocalResources/Actor/Effect/fx_my_p_02.prefab", BindingType = EffectBindingType.BindingOnwer, Time = 50, LifeTime = 500, PositionY = 120, //LocalOffset }); // 普攻2 收僵 action = new ActionData() { AnimId = "W10025", AnimTime = 300, BlendTime = 100, CanMove = false, DefaultLinkActionId = "N0000", MoveSpeed = 0, Name = "普攻2[收僵]", }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_02b", Weight = 1, UseDir = false, Start = 0, End = 100 }); // 普攻3 action = new ActionData() { AnimId = "W10030", AnimTime = 600, BlendTime = 0, CanMove = false, DefaultLinkActionId = "W10035", MoveSpeed = 0, Name = "普攻3", PoseTime = 0, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_03a", Weight = 1, UseDir = false, Start = 0, End = 100 }); interrupt = new ActionInterrupt(); interrupt.ActionID = "W10040"; interrupt.ConditionType = ConditionType.Or; interrupt.ConnectMode = ActionInterruptConnectMode.WaitFinish; interrupt.DetectionStartTime = 60; interrupt.DetectionEndTime = 200; interrupt.ConnectTime = 100; interrupt.InterruptName = "普攻3 => 普攻4"; //interrupt.Conditions.Add(new InputCondition(InputState.KeyRelease, GameInputType.Attack)); interrupt.Conditions.Add(new InputCondition(InputState.KeyDown, GameInputType.Attack)); action.InterruptList.Add(interrupt); action.EventArgses.Add(new EffectEventArgs() { ResourcePath = "Assets/LocalResources/Actor/Effect/fx_my_p_03.prefab", BindingType = EffectBindingType.BindingOnwer, Time = 30, LifeTime = 500, PositionY = 150, //LocalOffset }); // 普攻3 收僵 action = new ActionData() { AnimId = "W10035", AnimTime = 600, BlendTime = 0, CanMove = false, DefaultLinkActionId = "N0000", MoveSpeed = 0, Name = "普攻3 收僵", PoseTime = 0, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_03b", Weight = 1, UseDir = false, Start = 0, End = 100 }); // 普攻4 - 01 action = new ActionData() { AnimId = "W10040", AnimTime = 500, BlendTime = 100, CanMove = false, DefaultLinkActionId = "W10043", MoveSpeed = 0, Name = "普攻4 - 01", PoseTime = 0, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_04", Weight = 1, UseDir = false, Start = 0, End = 29 }); action.EventArgses.Add(new EffectEventArgs() { ResourcePath = "Assets/LocalResources/Actor/Effect/fx_my_p_04.prefab", BindingType = EffectBindingType.BindingOnwer, Time = 20, LifeTime = 500, PositionY = 120, //LocalOffset }); action.EventArgses.Add(new EffectEventArgs() { ResourcePath = "Assets/LocalResources/Actor/Effect/fx_my_p_04.prefab", BindingType = EffectBindingType.BindingOnwer, Time = 60, LifeTime = 500, PositionY = 140, //LocalOffset }); // 普攻4 - 02 action = new ActionData() { AnimId = "W10043", AnimTime = 200, BlendTime = 100, CanMove = false, DefaultLinkActionId = "W10046", MoveSpeed = 0, Name = "普攻4 - 02", PoseTime = 100, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_04", Weight = 1, UseDir = false, Start = 29, End = 66 }); action.EventArgses.Add(new EffectEventArgs() { ResourcePath = "Assets/LocalResources/Actor/Effect/fx_my_p_04b.prefab", BindingType = EffectBindingType.BindingOnwer, Time = 20, LifeTime = 500, PositionY = 100, //LocalOffset }); // 普攻4 - 收僵 action = new ActionData() { AnimId = "W10046", AnimTime = 400, BlendTime = 100, CanMove = false, DefaultLinkActionId = "N0000", MoveSpeed = 0, Name = "普攻4 - 02", PoseTime = 0, }; data.ActionDatas.Add(action); action.AnimSlotList.Add(new AnimSlotData() { Animation = "m_z_p_04", Weight = 1, UseDir = false, Start = 66, End = 100 }); _GroupDatas.Add(data); }