Fight/Actor/AI/AI_Boss_HYQ.cs
@@ -19,67 +19,6 @@ m_NormalAtkCount = 0; } private void CheckStep() { var _hero = PlayerDatas.Instance.hero; switch (m_Step) { case 0:// 检测普攻次数 if (m_NormalAtkCount > 1) { m_Step = 1; m_LockSkill = 10009; m_CanCastSkill = true; } break; case 1:// 检测血量 if (m_Owner.ActorInfo.RealHp <= m_Owner.ActorInfo.RealMaxHp * .2f) { Debug.Log("触发了动画"); m_Step = 2; } break; case 2: // Boss: 小辈感受吾真正的实力 var _model1 = ModelCenter.Instance.GetModel<GuideDialogueModel>(); _model1.dialogID = 1000; _model1.onClose = Step_1_TalkFinished; WindowCenter.Instance.Open<GuideDialogueWin>(); if (_hero != null) { _hero.Behaviour.StopKillUntilDieAI(); _hero.Behaviour.StopHandupAI(); } m_Step = 3; break; case 4:// 计算角色普攻次数 if (m_NormalAtkCount > 3) { STM_NormalAttack.OnCastNormalAttack -= OnHeroNormalAttack; m_NormalAtkCount = 0; // Boss: 哈哈哈 var _model2 = ModelCenter.Instance.GetModel<GuideDialogueModel>(); _model2.dialogID = 1000; _model2.onClose = Step_1_TalkFinished; WindowCenter.Instance.Open<GuideDialogueWin>(); if (_hero != null) { _hero.Behaviour.StopKillUntilDieAI(); _hero.Behaviour.StopHandupAI(); } m_Step = 5; } break; } } private void Step_1_TalkFinished() { m_Step = 4; m_NormalAtkCount = 0; STM_NormalAttack.OnCastNormalAttack += OnHeroNormalAttack; } private void OnHeroNormalAttack() { m_NormalAtkCount += 1; @@ -91,8 +30,6 @@ { return; } CheckStep(); // ai休眠时间 if (Time.realtimeSinceStartup - m_LastThinkTime > m_SleepTime) Fight/Actor/AI/Process/PN_AttackCount.cs
@@ -1,4 +1,41 @@ public class PN_AttackCount { using UnityEngine; public class PN_AttackCount : ProcessNode { private int m_AttackCount; public PN_AttackCount(GA_NpcClientFightNorm npcFight, int count) { m_Target = npcFight; m_AttackCount = 0; param = count; } public override void Init() { m_Target.OnAttackObj += OnAttackObj; #if UNITY_EDITOR Debug.LogFormat("开始检测NPC攻击次数, 需要攻击: {0} 次"); #endif } private void OnAttackObj(uint sid, int skillId) { m_AttackCount += 1; } public override bool IsOver() { return m_AttackCount >= param; } public override void UnInit() { m_Target.OnAttackObj -= OnAttackObj; } public override void Update() { } } Fight/Actor/AI/Process/PN_AutoAI.cs
New file @@ -0,0 +1,19 @@ public class PN_AutoAI : ProcessNode { public override void Init() { } public override bool IsOver() { return true; } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_AutoAI.cs.metacopy from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta copy to Fight/Actor/AI/Process/PN_AutoAI.cs.meta
File was copied from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: 46e2dfe81c4ce224f875ccb112fcf3fd timeCreated: 1555657870 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/PN_BeAttackCount.cs
@@ -1,4 +1,37 @@ public class PN_BeAttackCount { using System; public class PN_BeAttackCount : ProcessNode { private int m_BeAttackCount = 0; public PN_BeAttackCount(GA_NpcClientFightNorm npc, int beAttackCount) { m_BeAttackCount = 0; m_Target = npc; param = beAttackCount; } public sealed override void Init() { m_Target.OnAttacked += OnBeAttacked; } private void OnBeAttacked() { m_BeAttackCount += 1; } public sealed override bool IsOver() { return m_BeAttackCount >= param; } public sealed override void UnInit() { m_Target.OnAttacked -= OnBeAttacked; } public sealed override void Update() { } } Fight/Actor/AI/Process/PN_CastSkill.cs
New file @@ -0,0 +1,34 @@ public class PN_CastSkill : ProcessNode { public PN_CastSkill(GA_NpcClientFightNorm npc, int skillId) { m_Target = npc; param = skillId; } public sealed override void Init() { m_Target.lockSkillID = param; } public sealed override bool IsOver() { if (m_Target.SkillMgr.CurCastSkill != null) { if (m_Target.SkillMgr.CurCastSkill.id == param) { return true; } } return false; } public sealed override void UnInit() { m_Target.lockSkillID = -1; } public sealed override void Update() { } } Fight/Actor/AI/Process/PN_CastSkill.cs.metacopy from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta copy to Fight/Actor/AI/Process/PN_CastSkill.cs.meta
File was copied from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: c5954cbcedffbe644a4baf1d90b586af timeCreated: 1555657872 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/PN_CommonAttack.cs
New file @@ -0,0 +1,25 @@ public class PN_CommonAttack : ProcessNode { public PN_CommonAttack(GA_NpcClientFightNorm npc) { m_Target = npc; } public override void Init() { m_Target.lockCommonAtk = true; } public override bool IsOver() { return true; } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_CommonAttack.cs.metacopy from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta copy to Fight/Actor/AI/Process/PN_CommonAttack.cs.meta
File was copied from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: 97861257ab12fe74a9fa9bbdd109ef98 timeCreated: 1555657871 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/PN_Die.cs
New file @@ -0,0 +1,26 @@ public class PN_Die : ProcessNode { public PN_Die(GA_NpcClientFightNorm npc) { m_Target = npc; } public override void Init() { GAMgr.Instance.ServerDie(m_Target.ServerInstID); GAMgr.Instance.Release(m_Target); } public override bool IsOver() { return true; } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_Die.cs.meta
File was renamed from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: 5d04044ba0aaf7f40b2a99c7559b1535 timeCreated: 1555657871 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/PN_HpPer.cs
@@ -1,4 +1,28 @@ public class PN_HpPer public class PN_HpPer : ProcessNode { private float m_Per; public PN_HpPer(GA_NpcClientFightNorm npc, int per) { m_Target = npc; param = per; m_Per = param * Constants.F_BETA; } public override void Init() { } public override bool IsOver() { return m_Target.ActorInfo.RealHp <= (ulong)(m_Target.ActorInfo.RealMaxHp * m_Per); } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_LockHp.cs
@@ -1,4 +1,25 @@ public class PN_LockHp public class PN_LockHp : ProcessNode { public PN_LockHp(GA_NpcClientFightNorm npc, int per) { m_Target = npc; param = per; } public override void Init() { m_Target.LockHp(param * Constants.F_BETA); } public override bool IsOver() { return true; } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_OpenDialog.cs
New file @@ -0,0 +1,54 @@ using System; using Snxxz.UI; using UnityEngine; public class PN_OpenDialog : ProcessNode { private bool m_IsOver = false; public PN_OpenDialog(GA_NpcClientFightNorm npcFight, int dialogID) { m_Target = npcFight; param = dialogID; m_IsOver = false; } public sealed override void Init() { var _model = ModelCenter.Instance.GetModel<GuideDialogueModel>(); _model.dialogID = param; _model.onClose = DialogFinish; WindowCenter.Instance.Open<GuideDialogueWin>(); GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero != null) { _hero.Behaviour.StopKillUntilDieAI(); _hero.Behaviour.StopHandupAI(); } #if UNITY_EDITOR Debug.LogFormat("开始对话: {0}", param); #endif } private void DialogFinish() { m_IsOver = true; #if UNITY_EDITOR Debug.LogFormat("对话: {0} 结束", param); #endif } public sealed override bool IsOver() { return m_IsOver; } public sealed override void UnInit() { } public sealed override void Update() { } } Fight/Actor/AI/Process/PN_OpenDialog.cs.metacopy from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta copy to Fight/Actor/AI/Process/PN_OpenDialog.cs.meta
File was copied from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: 1260e6f7d972e8e48a44d89fedf743f6 timeCreated: 1555657870 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/PN_ShowMotion.cs
New file @@ -0,0 +1,34 @@ public class PN_ShowMotion : ProcessNode { public PN_ShowMotion(GA_NpcClientFightNorm npc, int id) { m_Target = npc; param = id; } public override void Init() { m_Target.IdleImmediate(); GA_Hero _hero = PlayerDatas.Instance.hero; if (_hero != null) { _hero.Behaviour.StopKillUntilDieAI(); _hero.Behaviour.StopHandupAI(); _hero.IdleImmediate(); } } public override bool IsOver() { return true; } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_ShowMotion.cs.metacopy from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta copy to Fight/Actor/AI/Process/PN_ShowMotion.cs.meta
File was copied from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: 106c7cb8f527f4a4cb1e0fee7842e721 timeCreated: 1555657870 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/PN_UnLockHp.cs
File was deleted Fight/Actor/AI/Process/PN_WaitTime.cs
New file @@ -0,0 +1,30 @@ using UnityEngine; public class PN_WaitTime : ProcessNode { private float m_StartTime; public PN_WaitTime(int ms) { param = ms; } public override void Init() { m_StartTime = Time.time; } public override bool IsOver() { int _escapeTime = (int)((Time.time - m_StartTime) * 1000); return _escapeTime > param; } public override void UnInit() { } public override void Update() { } } Fight/Actor/AI/Process/PN_WaitTime.cs.metacopy from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta copy to Fight/Actor/AI/Process/PN_WaitTime.cs.meta
File was copied from Fight/Actor/AI/Process/PN_UnLockHp.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 340d0053aa71b8245a3a68531cd61475 timeCreated: 1555595631 guid: 8216d153704cb81488e80bc6fa59ac55 timeCreated: 1555657871 licenseType: Pro MonoImporter: serializedVersion: 2 Fight/Actor/AI/Process/ProcessManager.cs.cs
@@ -5,13 +5,14 @@ using UnityEditor; #endif public class ProcessManager : Singleton<ProcessManager> public class ProcessManager { private const string SoProcessNode_Suffix = "SoProcessNode_"; private Queue<ProcessNode> m_NodeQueue = new Queue<ProcessNode>(); private ProcessNode m_Current; public void Load(int npcID) public void Load(GA_NpcClientFightNorm npc) { m_NodeQueue.Clear(); @@ -22,7 +23,7 @@ string _resourcePath = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath, "Refdata/ScriptableObject/SoProcessNode/", SoProcessNode_Suffix, npcID, npc.NpcConfig.NPCID, ".asset"); _config = AssetDatabase.LoadAssetAtPath<SoProcessNode>(_resourcePath); @@ -30,7 +31,7 @@ } else { string _assetName = StringUtility.Contact(SoProcessNode_Suffix, npcID); string _assetName = StringUtility.Contact(SoProcessNode_Suffix, npc.NpcConfig.NPCID); AssetInfo _assetInfo = new AssetInfo(ScriptableObjectLoader.bundleName, _assetName); _config = AssetBundleUtility.Instance.Sync_LoadAsset(_assetInfo) as SoProcessNode; @@ -38,7 +39,6 @@ if (_config == null) { Debug.LogErrorFormat("ProcessManager.Load() => 加载不到资源: {0}.", npcID); return; } @@ -47,24 +47,34 @@ switch (_node.nodeType) { case ProcessNode.E_ProcessType.AttackCount: m_NodeQueue.Enqueue(new PN_AttackCount(npc, _node.param)); break; case ProcessNode.E_ProcessType.AutoAI: m_NodeQueue.Enqueue(new PN_AutoAI()); break; case ProcessNode.E_ProcessType.BeAttackCount: m_NodeQueue.Enqueue(new PN_BeAttackCount(npc, _node.param)); break; case ProcessNode.E_ProcessType.CastSkill: m_NodeQueue.Enqueue(new PN_CastSkill(npc, _node.param)); break; case ProcessNode.E_ProcessType.CommonAttack: m_NodeQueue.Enqueue(new PN_CommonAttack(npc)); break; case ProcessNode.E_ProcessType.Die: m_NodeQueue.Enqueue(new PN_Die(npc)); break; case ProcessNode.E_ProcessType.HpPer: m_NodeQueue.Enqueue(new PN_HpPer(npc, _node.param)); break; case ProcessNode.E_ProcessType.LockHp: m_NodeQueue.Enqueue(new PN_LockHp(npc, _node.param)); break; case ProcessNode.E_ProcessType.OpenDialog: m_NodeQueue.Enqueue(new PN_OpenDialog(npc, _node.param)); break; case ProcessNode.E_ProcessType.ShowMotion: m_NodeQueue.Enqueue(new PN_ShowMotion(npc, _node.param)); break; } } @@ -78,10 +88,17 @@ } var _node = m_NodeQueue.Peek(); if (m_Current != _node) { _node.Init(); m_Current = _node; } _node.Update(); if (_node.IsOver()) { _node.UnInit(); m_NodeQueue.Dequeue(); } } Fight/Actor/AI/Process/ProcessNode.cs
@@ -16,6 +16,7 @@ } public int param; protected GA_NpcClientFightNorm m_Target; public abstract void Init(); public abstract void Update(); Fight/GameActor/GA_NpcClientFightNorm.cs
@@ -3,6 +3,43 @@ public class GA_NpcClientFightNorm : GActorNpcFight { private ProcessManager m_ProcessManager; public UnityEngine.Events.UnityAction<uint, int> OnAttackObj; public UnityEngine.Events.UnityAction<uint, int> OnBeAttack; public void AttackObj(uint sid, int skillId) { if (OnAttackObj != null) { OnAttackObj(sid, skillId); } } public void BeAttack(uint sid, int skillId) { if (OnBeAttack != null) { OnBeAttack(sid, skillId); } } public float lockHp { get; private set; } public void LockHp(float per) { lockHp = per; } public bool lockCommonAtk = false; public int lockSkillID = -1; public void AutoAI() { lockCommonAtk = false; lockSkillID = -1; } private HeadUpName m_HeadUpName; private LifeBar m_LifeBar; @@ -83,7 +120,10 @@ ActorInfo.HpEx = (uint)NpcConfig.MaxHPEx; ActorInfo.MaxHp = (uint)NpcConfig.DHP; ActorInfo.MaxHpEx = (uint)NpcConfig.MaxHPEx; ActorInfo.moveSpeed = 1000 / NpcConfig.OrgSpeed * .5f; if (NpcConfig.OrgSpeed != 0) { ActorInfo.moveSpeed = 1000 / NpcConfig.OrgSpeed * .5f; } ActorInfo.PlayerName = NpcConfig.charName; ActorInfo.LV = (ushort)NpcConfig.NPCLV;