| Core/GameEngine/Model/Config/GuardConfig.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Core/GameEngine/Model/Config/GuardConfig.cs.meta | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Core/GameEngine/Model/ConfigManager.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/Actor/GuardPickupItem.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/Actor/State/GuardState/GuardDance_2.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/Actor/State/GuardState/GuardIdle.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/Actor/State/GuardState/GuardRun.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/GameActor/GA_Guard.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/GameActor/GActorPlayerBase.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Fight/Stage/Dungeon/DropItemManager.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| System/Guard/GuardModel.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Core/GameEngine/Model/Config/GuardConfig.cs
New file @@ -0,0 +1,55 @@ //-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Friday, November 09, 2018 //-------------------------------------------------------- using UnityEngine; using System; namespace TableConfig { public partial class GuardConfig : ConfigBase { public int id { get ; private set ; } public string modelName { get ; private set; } public int npcId { get ; private set ; } public int[] effectIds; public int autoPick { get ; private set ; } public override string getKey() { return id.ToString(); } public override void Parse() { try { id=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; modelName = rawContents[1].Trim(); npcId=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0; string[] effectIdsStringArray = rawContents[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries); effectIds = new int[effectIdsStringArray.Length]; for (int i=0;i<effectIdsStringArray.Length;i++) { int.TryParse(effectIdsStringArray[i],out effectIds[i]); } autoPick=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0; } catch (Exception ex) { DebugEx.Log(ex); } } } } Core/GameEngine/Model/Config/GuardConfig.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 1a445b5683377cd4fab13919de01e956 timeCreated: 1541756083 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Core/GameEngine/Model/ConfigManager.cs
@@ -201,6 +201,7 @@ AddAsyncTask<WHYJRewardConfig>(); AddAsyncTask<TalentConfig>(); AddAsyncTask<ChatBubbleBoxConfig>(); AddAsyncTask<GuardConfig>(); while (!AllCompleted()) { var completedCount = 0; Fight/Actor/GuardPickupItem.cs
@@ -1,88 +1,87 @@ using System; using System.Collections.Generic; using UnityEngine; public class GuardPickupItem : MonoBehaviour { public GA_Guard guard; public List<SFXController> sfxCtrlList = new List<SFXController>(); private void OnEnable() { DropItemManager.guardPickupCallBack += GuardPickupCallBack; } private void GuardPickupCallBack(List<Vector3> list) { if (guard == null || !guard.IsStateActive) { return; } for (int i = 0; i < list.Count; i++) { var fx = SFXPlayUtility.Instance.PlayBattleEffect(guard.guardEffects[2], list[i], guard.Root.position - list[i]); if (fx != null) { fx.duration = 0; sfxCtrlList.Add(fx); } } } private void LateUpdate() { if (guard == null || !guard.IsStateActive) { return; } for (int i = 0; i < sfxCtrlList.Count; i++) { if (sfxCtrlList[i] == null) { sfxCtrlList.RemoveAt(i); i--; continue; } Transform tr = sfxCtrlList[i].gameObject.transform; var dis = Vector3.Distance(tr.position, guard.Root.position); if (guard.GuardianPickFxSpeed == 0) { guard.GuardianPickFxSpeed = 4.0f; } var duration = dis / guard.GuardianPickFxSpeed; if (duration > Time.deltaTime) { tr.position = Vector3.MoveTowards(tr.position, guard.Root.position, Time.deltaTime * guard.GuardianPickFxSpeed); } else { tr.position = guard.Root.position; SFXPlayUtility.Instance.Release(sfxCtrlList[i]); sfxCtrlList.RemoveAt(i); i--; } } } private void OnDisable() { DropItemManager.guardPickupCallBack -= GuardPickupCallBack; ClearFx(); } public void ClearFx() { for (int i = 0; i < sfxCtrlList.Count; i++) { if (sfxCtrlList[i] == null) { sfxCtrlList.RemoveAt(i); i--; continue; } SFXPlayUtility.Instance.Release(sfxCtrlList[i]); sfxCtrlList.RemoveAt(i); i--; } } } using Snxxz.UI; using System; using System.Collections.Generic; using UnityEngine; public class GuardPickupItem : MonoBehaviour { public GA_Guard guard; List<SFXController> m_SFXControllers = new List<SFXController>(); GuardModel model { get { return ModelCenter.Instance.GetModel<GuardModel>(); } } private void OnEnable() { DropItemManager.guardPickupCallBack += GuardPickupCallBack; } private void GuardPickupCallBack(List<Vector3> list) { if (guard == null || !guard.IsStateActive) { return; } for (int i = 0; i < list.Count; i++) { var fx = SFXPlayUtility.Instance.PlayBattleEffect(guard.pickEffectIds[2], list[i], guard.Root.position - list[i]); if (fx != null) { fx.duration = 0; m_SFXControllers.Add(fx); } } } private void LateUpdate() { if (guard == null || !guard.IsStateActive) { return; } for (int i = 0; i < m_SFXControllers.Count; i++) { if (m_SFXControllers[i] == null) { m_SFXControllers.RemoveAt(i); i--; continue; } Transform tr = m_SFXControllers[i].gameObject.transform; var dis = Vector3.Distance(tr.position, guard.Root.position); var duration = dis / (model.pickUpSfxSpeed == 0f ? 4f : model.pickUpSfxSpeed); if (duration > Time.deltaTime) { tr.position = Vector3.MoveTowards(tr.position, guard.Root.position, Time.deltaTime * model.pickUpSfxSpeed); } else { tr.position = guard.Root.position; SFXPlayUtility.Instance.Release(m_SFXControllers[i]); m_SFXControllers.RemoveAt(i); i--; } } } private void OnDisable() { DropItemManager.guardPickupCallBack -= GuardPickupCallBack; ReleaseSfx(); } public void ReleaseSfx() { for (int i = 0; i < m_SFXControllers.Count; i++) { if (m_SFXControllers[i] == null) { m_SFXControllers.RemoveAt(i); i--; continue; } SFXPlayUtility.Instance.Release(m_SFXControllers[i]); m_SFXControllers.RemoveAt(i); i--; } } } Fight/Actor/State/GuardState/GuardDance_2.cs
@@ -1,78 +1,81 @@ using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; public class GuardDance_2 : SMB_Base { private SFXController _sfXctl; protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnEnter(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } guard.isBreakGuardDance = false; if (_sfXctl == null) { var mountPoint = guard.Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); _sfXctl = SFXPlayUtility.Instance.PlayBattleEffect(guard.guardEffects[1], owner); if (_sfXctl != null) { _sfXctl.duration = 0; _sfXctl.transform.SetParent(mountPoint); _sfXctl.transform.localPosition = Vector3.zero; } } else { _sfXctl.SetActive(true); } } protected override void OnExit(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnExit(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } animator.speed = guard.GuardianAnimatorSpeed; guard.isBreakGuardDance = false; ReleaseSFX(); } protected override void OnUpdate(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnUpdate(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } if (guard.isBreakGuardDance) { animator.speed = guard.GuardianBreakSpeed; } if (stateInfo.normalizedTime >= 0.96f && !animator.IsInTransition(0)) { owner.Idle(); } } void ReleaseSFX() { if (_sfXctl != null) { SFXPlayUtility.Instance.Release(_sfXctl); _sfXctl = null; } } } using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using Snxxz.UI; public class GuardDance_2 : SMB_Base { private SFXController _sfXctl; GuardModel model { get { return ModelCenter.Instance.GetModel<GuardModel>(); } } protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnEnter(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } guard.stopDanceState = false; if (_sfXctl == null) { var mountPoint = guard.Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); _sfXctl = SFXPlayUtility.Instance.PlayBattleEffect(guard.pickEffectIds[1], owner); if (_sfXctl != null) { _sfXctl.duration = 0; _sfXctl.transform.SetParent(mountPoint); _sfXctl.transform.localPosition = Vector3.zero; } } else { _sfXctl.SetActive(true); } } protected override void OnExit(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnExit(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } animator.speed = guard.animatorSpeed; guard.stopDanceState = false; ReleaseSFX(); } protected override void OnUpdate(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnUpdate(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } if (guard.stopDanceState) { animator.speed = model.stopAnimationSpeed; } if (stateInfo.normalizedTime >= 0.96f && !animator.IsInTransition(0)) { owner.Idle(); } } void ReleaseSFX() { if (_sfXctl != null) { SFXPlayUtility.Instance.Release(_sfXctl); _sfXctl = null; } } } Fight/Actor/State/GuardState/GuardIdle.cs
@@ -1,41 +1,44 @@ using UnityEngine; public class GuardIdle : SMB_Base { private float idleTime = 0; private float m_Time = 0; protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnEnter(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } m_Time = 0; idleTime = UnityEngine.Random.Range(guard.GuardianRandomIdleMin, guard.GuardianRandomIdleMax); } protected override void OnExit(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnExit(owner, animator, stateInfo, layerIndex); } protected override void OnUpdate(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnUpdate(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null || guard.targetPlayer == null || guard.targetPlayer.Root == null) return; guard.Root.LookAt(guard.targetPlayer.Root.position.SetY(guard.Root.position.y)); m_Time += Time.deltaTime; if (m_Time > idleTime) { m_Time = 0; guard.Dance(); } } } using Snxxz.UI; using UnityEngine; public class GuardIdle : SMB_Base { private float idleTime = 0; private float m_Time = 0; GuardModel model { get { return ModelCenter.Instance.GetModel<GuardModel>(); } } protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnEnter(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null) { return; } m_Time = 0; idleTime = UnityEngine.Random.Range(model.idleTimeMin, model.idleTimeMax); } protected override void OnExit(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnExit(owner, animator, stateInfo, layerIndex); } protected override void OnUpdate(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnUpdate(owner, animator, stateInfo, layerIndex); GA_Guard guard = owner as GA_Guard; if (guard == null || guard.targetPlayer == null || guard.targetPlayer.Root == null) return; guard.Root.LookAt(guard.targetPlayer.Root.position.SetY(guard.Root.position.y)); m_Time += Time.deltaTime; if (m_Time > idleTime) { m_Time = 0; guard.Dance(); } } } Fight/Actor/State/GuardState/GuardRun.cs
@@ -1,24 +1,24 @@ using Snxxz.UI; using System.Collections.Generic; using UnityEngine; using System; public class GuardRun : SMB_Base { [HideInInspector] public Vector3 nextPosition; private Vector3 lastPosition; private SFXController _sfXctl; private Vector3 m_NextPosition; private Vector3 m_LastPosition; private SFXController m_SFXController; private float m_Time; private float guardClosingTime = 0; private List<int> dropItemList = new List<int>(); private GA_Guard guard; private float m_PickUpPackTime = 0; private float m_Duration = 0; private float m_PickUpTime = 0; private float m_PickUpDelayTime = 1.0f; private List<int> dropItems = new List<int>(); PlayerPackModel _playerPack; PlayerPackModel playerPack private GA_Guard guard; GuardModel model { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } get { return ModelCenter.Instance.GetModel<GuardModel>(); } } protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) @@ -29,32 +29,28 @@ { return; } if (_sfXctl == null) if (m_SFXController == null) { var mountPoint = guard.Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); _sfXctl = SFXPlayUtility.Instance.PlayBattleEffect(guard.guardEffects[1], owner); if (_sfXctl != null) m_SFXController = SFXPlayUtility.Instance.PlayBattleEffect(guard.pickEffectIds[1], owner); if (m_SFXController != null) { _sfXctl.duration = 0; _sfXctl.transform.SetParent(mountPoint); _sfXctl.transform.localPosition = Vector3.zero; m_SFXController.duration = 0; m_SFXController.transform.SetParent(mountPoint); m_SFXController.transform.localPosition = Vector3.zero; } } else { _sfXctl.SetActive(true); m_SFXController.SetActive(true); } m_Time = 0; switch (guard.guardState) { case GA_Guard.GuardState.Track: { } break; case GA_Guard.GuardState.Dance: { } break; case GA_Guard.GuardState.Inter: { @@ -62,10 +58,10 @@ { return; } nextPosition = guard.targetPlayer.Root.position.SetY(0); lastPosition = guard.Root.position; guard.Forward = nextPosition - guard.Root.position; guardClosingTime = Vector3.Distance(nextPosition, guard.Root.position) / guard.GuardianSpeed; m_NextPosition = guard.targetPlayer.Root.position.SetY(0); m_LastPosition = guard.Root.position; guard.Forward = m_NextPosition - guard.Root.position; m_Duration = Vector3.Distance(m_NextPosition, guard.Root.position) / model.speed; } break; case GA_Guard.GuardState.PickUp: @@ -78,7 +74,7 @@ public void OnPickUpEnter() { m_PickUpPackTime = 0.0f; m_PickUpTime = 0.0f; DTC0702_tagDropItemDisappear.OnDropItemDisapperEvent -= OnDropItemDisapperEvent; DTC0702_tagDropItemDisappear.OnDropItemDisapperEvent += OnDropItemDisapperEvent; OnDropItemDisapperEvent(); @@ -90,9 +86,9 @@ { return; } dropItemList.Clear(); DropItemManager.TryGetGuardPickUpItem(guard, ref dropItemList); dropItemList.Sort(Compare); dropItems.Clear(); DropItemManager.TryGetGuardPickUpItem(guard.Root.position, ref dropItems); dropItems.Sort(Compare); RequestDropItem(); } @@ -122,10 +118,10 @@ break; case GA_Guard.GuardState.Track: { var _heroPos = hero.Root.position; if (MathUtility.CalDistance(guard.Root.position, _heroPos) > guard.GuardianImpendRange * guard.GuardianImpendRange) var targetPosition = hero.Root.position; if (MathUtility.CalDistance(guard.Root.position, targetPosition) > model.impendRange * model.impendRange) { guard.Root.LookAt(new Vector3(_heroPos.x, _heroPos.y + guard.GuardianHeight, _heroPos.z)); guard.Root.LookAt(new Vector3(targetPosition.x, targetPosition.y + model.height, targetPosition.z)); guard.Root.Translate(Vector3.forward * hero.ActorInfo.moveSpeed * Time.deltaTime); } else @@ -136,14 +132,14 @@ break; case GA_Guard.GuardState.Dance: { var _heroPos = hero.Root.position; nextPosition = _heroPos + hero.Root.right.normalized * 0.6f - hero.Forward * 0.3f; nextPosition.y = _heroPos.y + guard.GuardianHeight; var dis = Vector3.Distance(nextPosition, guard.Root.position); var targetPosition = hero.Root.position; m_NextPosition = targetPosition + hero.Root.right.normalized * 0.6f - hero.Forward * 0.3f; m_NextPosition.y = targetPosition.y + model.height; var dis = Vector3.Distance(m_NextPosition, guard.Root.position); if (dis > 0.1f) { guard.Forward = nextPosition - guard.Root.position; var deltapos = Vector3.Lerp(guard.Root.position, nextPosition, hero.ActorInfo.moveSpeed * Time.deltaTime); guard.Forward = m_NextPosition - guard.Root.position; var deltapos = Vector3.Lerp(guard.Root.position, m_NextPosition, hero.ActorInfo.moveSpeed * Time.deltaTime); guard.Root.position = deltapos; } else @@ -156,8 +152,8 @@ case GA_Guard.GuardState.Inter: { m_Time += Time.deltaTime; guard.Root.position = Vector3.Lerp(lastPosition, nextPosition, Mathf.Min(1, m_Time / guardClosingTime)); if (m_Time >= guardClosingTime) guard.Root.position = Vector3.Lerp(m_LastPosition, m_NextPosition, Mathf.Min(1, m_Time / m_Duration)); if (m_Time >= m_Duration) { ReleaseSFX(); (owner as GA_Guard).Disappear(); @@ -166,15 +162,15 @@ break; case GA_Guard.GuardState.PickUp: { m_PickUpPackTime += Time.deltaTime; if (guard.Root.position != nextPosition) m_PickUpTime += Time.deltaTime; if (guard.Root.position != m_NextPosition) { m_Time += Time.deltaTime; guard.Root.position = Vector3.Lerp(lastPosition, nextPosition, Mathf.Min(1, m_Time / guardClosingTime)); if (m_Time >= guardClosingTime) guard.Root.position = Vector3.Lerp(m_LastPosition, m_NextPosition, Mathf.Min(1, m_Time / m_Duration)); if (m_Time >= m_Duration) { RequestDropItem(); DropItemManager.CheckGuardPickUpItem(guard); DropItemManager.CheckGuardPickUpItem(guard.Root.position); } } else @@ -192,44 +188,44 @@ Vector3 ypos; DropItemManager.TryGetDropPositionFromInstanceId(x, out xpos); DropItemManager.TryGetDropPositionFromInstanceId(y, out ypos); float xdis = Vector3.Distance(xpos, nextPosition); float ydis = Vector3.Distance(ypos, nextPosition); float xdis = Vector3.Distance(xpos, m_NextPosition); float ydis = Vector3.Distance(ypos, m_NextPosition); return -xdis.CompareTo(ydis); } void RequestDropItem() { m_Time = 0; if (dropItemList.Count == 0) if (dropItems.Count == 0) { guard.guardState = GA_Guard.GuardState.Track; return; } lastPosition = guard.Root.position; m_LastPosition = guard.Root.position; if (guard.targetPlayer == null) { return; } if (DropItemManager.TryGetDropPositionFromInstanceId(dropItemList[0], out nextPosition)) if (DropItemManager.TryGetDropPositionFromInstanceId(dropItems[0], out m_NextPosition)) { nextPosition.y = guard.targetPlayer.Root.position.y + guard.GuardianHeight; guard.Forward = nextPosition - lastPosition; m_NextPosition.y = guard.targetPlayer.Root.position.y + model.height; guard.Forward = m_NextPosition - m_LastPosition; } if (dropItemList.Count > 0 && Vector3.Distance(guard.Root.position, nextPosition) < 0.1f && m_PickUpPackTime >= m_PickUpDelayTime) if (dropItems.Count > 0 && Vector3.Distance(guard.Root.position, m_NextPosition) < 0.1f && m_PickUpTime >= m_PickUpDelayTime) { m_PickUpPackTime = 0.0f; DropItemManager.CheckGuardPickUpItem(guard); m_PickUpTime = 0.0f; DropItemManager.CheckGuardPickUpItem(guard.Root.position); } guardClosingTime = Vector3.Distance(lastPosition, nextPosition) / guard.GuardianSpeed; m_Duration = Vector3.Distance(m_LastPosition, m_NextPosition) / model.speed; } void ReleaseSFX() { if (_sfXctl != null) if (m_SFXController != null) { SFXPlayUtility.Instance.Release(_sfXctl); _sfXctl = null; SFXPlayUtility.Instance.Release(m_SFXController); m_SFXController = null; } } } Fight/GameActor/GA_Guard.cs
@@ -15,21 +15,6 @@ Inter, } #region 配置 public float GuardianSpeed; public float GuardianCanPickupRange; public float GuardianPickupRange; public float GuardianTraceRange; public float GuardianImpendRange; public float GuardianRandomIdleMin; public float GuardianRandomIdleMax; public float GuardianBreakSpeed; public float GuardianHeight; public float GuardianPickFxSpeed; public float GuardianResetRange; public bool GuardianCanPick; #endregion #region 动作Action public static readonly int GuardAction_Idle = 0; public static readonly int GuardAction_Dance1 = 1; @@ -37,33 +22,29 @@ public static readonly int GuardAction_Run = 3; #endregion private bool _isStateActive = true; //是否状态机开启 public bool IsStateActive { get { return _isStateActive; } set { _isStateActive = value; } } public bool IsStateActive { get; set; }//是否状态机开启 public bool guardPick { get; private set; } public float GuardianAnimatorSpeed { get; private set; } public float animatorSpeed { get; private set; } public bool isBreakGuardDance { get; set; } public bool stopDanceState { get; set; } PlayerPackModel _playerPack; PlayerPackModel playerPack { get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } } public GuardState guardState { get; set; } PlayerDeadModel _deadModel; PlayerDeadModel DeadModel { get { return _deadModel ?? (_deadModel = ModelCenter.Instance.GetModel<PlayerDeadModel>()); } } public int targetPlayerId { get; private set; } public int itemID { get; set; } public int[] pickEffectIds { get; private set; } public bool IsHeroControl { get { return targetPlayerId == PlayerDatas.Instance.PlayerId; } } public bool IsPlayerDie { get; private set; } public GuardState guardState { get; set; } PlayerDeadModel deadModel { get { return ModelCenter.Instance.GetModel<PlayerDeadModel>(); } } GuardModel model { get { return ModelCenter.Instance.GetModel<GuardModel>(); } } public GActorPlayerBase targetPlayer { @@ -80,45 +61,14 @@ } } public int targetPlayerId public GuardPickupItem pickUpBehaviour { get; private set; } TeamModel m_TeamModel; TeamModel teamModel { get { return m_TeamModel ?? (m_TeamModel = ModelCenter.Instance.GetModel<TeamModel>()); } } public bool IsControlHero { get { return targetPlayerId == PlayerDatas.Instance.PlayerId; } } public GameObject guardPrefabModel { get; private set; } public int itemID { get; set; } public int[] guardEffects { get; private set; } public GuardPickupItem guardPickupItem { get; private set; } public bool IsPlayerDie { get; private set; } private DungeonOpenTimeConfig dungeonCfg; private DungeonOpenTimeConfig dungeonConfig { get; set; } private SFXController m_SFXController = null; public sealed override void Die() { } public sealed override void Hurt() { } @@ -127,29 +77,29 @@ protected sealed override void OnInit(GameNetPackBasic package) { targetPlayerId = (int)(ServerInstID / 100); DeadModel.AllPlayerDieEvent += AllPlayerDieEvent; DeadModel.AllPlayerRebornEvent += AllPlayerRebornEvent; deadModel.AllPlayerDieEvent += AllPlayerDieEvent; deadModel.AllPlayerRebornEvent += AllPlayerRebornEvent; DTC0429_tagObjResetPos.ResetPlayerPosEvent += ResetPlayerPosEvent; if (IsControlHero) if (IsHeroControl) { dungeonCfg = Config.Instance.Get<DungeonOpenTimeConfig>(PlayerDatas.Instance.baseData.MapID); dungeonConfig = Config.Instance.Get<DungeonOpenTimeConfig>(PlayerDatas.Instance.baseData.MapID); PlayerDatas.Instance.PlayerDataRefreshInfoEvent += RefreshInfo; StageManager.Instance.onStageLoadFinish += OnStageLoadFinish; } IsPlayerDie = false; if (IsControlHero) if (IsHeroControl) { guardPickupItem = Root.AddMissingComponent<GuardPickupItem>(); guardPickupItem.guard = this; pickUpBehaviour = Root.AddMissingComponent<GuardPickupItem>(); pickUpBehaviour.guard = this; } else { guardPickupItem = Root.GetComponent<GuardPickupItem>(); if (guardPickupItem != null) pickUpBehaviour = Root.GetComponent<GuardPickupItem>(); if (pickUpBehaviour != null) { Object.DestroyImmediate(guardPickupItem); Object.DestroyImmediate(pickUpBehaviour); } } @@ -163,89 +113,50 @@ public void InitBase() { #region 配置 FuncConfigConfig funcCfg = Config.Instance.Get<FuncConfigConfig>("GuardianSpeed"); if (funcCfg != null) var config = Config.Instance.Get<GuardConfig>(itemID); if (config != null) { float.TryParse(funcCfg.Numerical1, out GuardianSpeed); float.TryParse(funcCfg.Numerical2, out GuardianBreakSpeed); float.TryParse(funcCfg.Numerical3, out GuardianPickFxSpeed); pickEffectIds = config.effectIds; guardPick = config.autoPick == 1; } funcCfg = Config.Instance.Get<FuncConfigConfig>("GuardianPickupRange"); if (funcCfg != null) { float.TryParse(funcCfg.Numerical1, out GuardianCanPickupRange); float.TryParse(funcCfg.Numerical2, out GuardianPickupRange); } funcCfg = Config.Instance.Get<FuncConfigConfig>("GuardianTraceRange"); if (funcCfg != null) { float.TryParse(funcCfg.Numerical1, out GuardianTraceRange); float.TryParse(funcCfg.Numerical2, out GuardianResetRange); } funcCfg = Config.Instance.Get<FuncConfigConfig>("GuardianImpendRange"); if (funcCfg != null) { float.TryParse(funcCfg.Numerical1, out GuardianImpendRange); } funcCfg = Config.Instance.Get<FuncConfigConfig>("GuardianRandomIdle"); if (funcCfg != null) { float.TryParse(funcCfg.Numerical1, out GuardianRandomIdleMin); float.TryParse(funcCfg.Numerical2, out GuardianRandomIdleMax); } funcCfg = Config.Instance.Get<FuncConfigConfig>("GuardianHigh"); if (funcCfg != null) { float.TryParse(funcCfg.Numerical1, out GuardianHeight); } funcCfg = Config.Instance.Get<FuncConfigConfig>(StringUtility.Contact("SH", itemID)); if (funcCfg != null) { guardEffects = ConfigParse.GetMultipleStr<int>(funcCfg.Numerical3); int _val = 0; int.TryParse(funcCfg.Numerical4, out _val); GuardianCanPick = _val == 1; } #endregion InitializeModelRes(); } protected sealed override void OnUnit() { DeadModel.AllPlayerDieEvent -= AllPlayerDieEvent; DeadModel.AllPlayerRebornEvent -= AllPlayerRebornEvent; deadModel.AllPlayerDieEvent -= AllPlayerDieEvent; deadModel.AllPlayerRebornEvent -= AllPlayerRebornEvent; DTC0429_tagObjResetPos.ResetPlayerPosEvent -= ResetPlayerPosEvent; if (IsControlHero) if (IsHeroControl) { PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= RefreshInfo; StageManager.Instance.onStageLoadFinish -= OnStageLoadFinish; ClearGuardPickupItem(); ReleasePickUpBehaviour(); } if (sfxController != null) if (m_SFXController != null) { SFXPlayUtility.Instance.Release(sfxController); SFXPlayUtility.Instance.Release(m_SFXController); } if (m_Animator != null) { m_Animator.speed = GuardianAnimatorSpeed; m_Animator.speed = animatorSpeed; NextAction = GuardAction_Idle; } IsStateActive = false; dungeonCfg = null; guardPickupItem = null; dungeonConfig = null; pickUpBehaviour = null; base.OnUnit(); } private void ClearGuardPickupItem() private void ReleasePickUpBehaviour() { if (guardPickupItem != null) if (pickUpBehaviour != null) { guardPickupItem.ClearFx(); pickUpBehaviour.ReleaseSfx(); } } @@ -261,20 +172,25 @@ IEnumerator Co_StagePrepare() { yield return null; if (MathUtility.CalDistance(Root.position, targetPlayer.Root.position) > GuardianResetRange * GuardianResetRange) { ResetPos(targetPlayer.Root.position.x, targetPlayer.Root.position.z); } if (sfxController == null || !sfxController.gameObject.activeSelf) { sfxController = SFXPlayUtility.Instance.PlayBattleEffect(guardEffects[0], this, NpcConfig != null ? NpcConfig.ModeProportion : 1); if (sfxController != null) { var mountPoint = Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); sfxController.duration = 0; sfxController.transform.SetParent(mountPoint); sfxController.transform.localPosition = Vector3.zero; } if (Root != null && targetPlayer != null) { var targetPosition = targetPlayer.Root.position; if (MathUtility.CalDistance(Root.position, targetPosition) > model.resetDistance * model.resetDistance) { SetPosition(targetPosition.x, targetPosition.z); } if (m_SFXController == null || !m_SFXController.gameObject.activeSelf) { m_SFXController = SFXPlayUtility.Instance.PlayBattleEffect(pickEffectIds[0], this, NpcConfig != null ? NpcConfig.ModeProportion : 1); if (m_SFXController != null) { var mountPoint = Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); m_SFXController.duration = 0; m_SFXController.transform.SetParent(mountPoint); m_SFXController.transform.localPosition = Vector3.zero; } } } } @@ -296,7 +212,7 @@ { m_Animator.enabled = true; } ResetPos(vNetData.PosX / 2, vNetData.PosY / 2); SetPosition(vNetData.PosX / 2, vNetData.PosY / 2); } } @@ -308,9 +224,10 @@ { return; } if (MathUtility.CalDistance(Root.position, targetPlayer.Root.position) > GuardianResetRange * GuardianResetRange) if (MathUtility.CalDistance(Root.position, targetPlayer.Root.position) > model.resetDistance * model.resetDistance) { ResetPos(vNetData.PosX / 2, vNetData.PosY / 2); SetPosition(vNetData.PosX / 2, vNetData.PosY / 2); } } } @@ -319,52 +236,50 @@ { if (refreshType == PlayerDataRefresh.MapID) { dungeonCfg = Config.Instance.Get<DungeonOpenTimeConfig>(PlayerDatas.Instance.baseData.MapID); dungeonConfig = Config.Instance.Get<DungeonOpenTimeConfig>(PlayerDatas.Instance.baseData.MapID); } } public SFXController sfxController = null; private void InitializeModelRes() { IsStateActive = true; var bornpos = targetPlayer.Root.position + targetPlayer.Root.right * 0.6f - targetPlayer.Forward * 0.3f; bornpos.y = targetPlayer.Root.position.y + model.height; Pos = bornpos; m_Model.SetLayer(LayerUtility.Monster, true); var mountPoint = Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); sfxController = SFXPlayUtility.Instance.PlayBattleEffect(guardEffects[0], this, NpcConfig != null ? NpcConfig.ModeProportion : 1); m_SFXController = SFXPlayUtility.Instance.PlayBattleEffect(pickEffectIds[0], this, NpcConfig != null ? NpcConfig.ModeProportion : 1); if (sfxController != null) if (m_SFXController != null) { sfxController.duration = 0; sfxController.transform.SetParent(mountPoint); sfxController.transform.localPosition = Vector3.zero; m_SFXController.duration = 0; m_SFXController.transform.SetParent(mountPoint); m_SFXController.transform.localPosition = Vector3.zero; } m_Animator.SetInteger(GAStaticDefine.Param_ActorInstID, (int)ClientInstID); m_Animator.enabled = true; GuardianAnimatorSpeed = m_Animator.speed; animatorSpeed = m_Animator.speed; Idle(); if (IsControlHero) if (IsHeroControl) { //GameObject _prefab = InstanceResourcesLoader.LoadNpc(NpcConfig.NPCID); //if (GAMgr.Instance.needDestroyPrefabList.Contains(_prefab)) //{ // GAMgr.Instance.needDestroyPrefabList.Remove(_prefab); //} GameObjectPoolManager.Instance.AddDontDestroyGoInstID(m_Model.GetInstanceID()); } } private void ResetPos(float posx, float posz) private void SetPosition(float x, float z) { if (targetPlayer == null) { return; } var pos = new Vector3(posx, 0, posz) + targetPlayer.Root.right.normalized * 0.6f - targetPlayer.Forward * 0.3f; pos.y = targetPlayer.Root.position.y + GuardianHeight; var pos = new Vector3(x, 0, z) + targetPlayer.Root.right.normalized * 0.6f - targetPlayer.Forward * 0.3f; pos.y = targetPlayer.Root.position.y + model.height; if (m_Model) { Root.position = pos; @@ -386,12 +301,12 @@ { m_Model.transform.localScale = new Vector3(NpcConfig.ModeProportion, NpcConfig.ModeProportion, NpcConfig.ModeProportion); } if (CheckPlayerDie()) if (IsPlayerDied()) { return; } CheckDistance(); if (IsControlHero && GuardianCanPick) if (IsHeroControl && guardPick) { if (CheckPickupItem()) { @@ -403,21 +318,23 @@ private void CheckDistance() { var _height = targetPlayer.Root.position.y + GuardianHeight; if (MathUtility.CalDistance(Root.position, targetPlayer.Root.position) > GuardianResetRange * GuardianResetRange) var _height = targetPlayer.Root.position.y + model.height; var targetPosition = targetPlayer.Root.position; if (MathUtility.CalDistance(Root.position, targetPosition) > model.resetDistance * model.resetDistance) { ResetPos(targetPlayer.Root.position.x, targetPlayer.Root.position.z); SetPosition(targetPosition.x, targetPosition.z); } else if (Mathf.Abs(Root.position.y - _height) > 2) { ResetPos(targetPlayer.Root.position.x, targetPlayer.Root.position.z); SetPosition(targetPosition.x, targetPosition.z); } } public void Disappear() { IsStateActive = false; ClearGuardPickupItem(); ReleasePickUpBehaviour(); if (m_Model) { @@ -427,7 +344,7 @@ if (m_Animator) { m_Animator.enabled = false; m_Animator.speed = GuardianAnimatorSpeed; m_Animator.speed = animatorSpeed; } } @@ -439,9 +356,10 @@ private bool CheckTrack() { if (MathUtility.CalDistance(Root.position, targetPlayer.Root.position) > GuardianTraceRange * GuardianTraceRange && guardState != GuardState.Track) if (MathUtility.CalDistance(Root.position, targetPlayer.Root.position) > model.traceRange * model.traceRange && guardState != GuardState.Track) { isBreakGuardDance = true; stopDanceState = true; NextAction = GuardAction_Run; guardState = GuardState.Track; return true; @@ -449,13 +367,13 @@ return false; } private bool CheckPlayerDie() private bool IsPlayerDied() { if (IsPlayerDie) { if (guardState != GuardState.Track && guardState != GuardState.Inter) { isBreakGuardDance = true; stopDanceState = true; guardState = GuardState.Inter; NextAction = GuardAction_Run; } @@ -466,18 +384,24 @@ public bool CheckPickupItem() { if (dungeonCfg != null) if (dungeonConfig != null) { if (dungeonCfg.GuardPick == 0) if (dungeonConfig.GuardPick == 0) { return false; } } if (Root == null) { return false; } if (DropItemManager.CheckCanGuardPickUp(this)) if (DropItemManager.CheckCanGuardPickUp(Root.position)) { if (guardState != GuardState.PickUp) { isBreakGuardDance = true; stopDanceState = true; guardState = GuardState.PickUp; if (NextAction != GuardAction_Run) { Fight/GameActor/GActorPlayerBase.cs
@@ -1054,33 +1054,16 @@ public void SwitchGuard(uint guardID) { // 获得配置 FuncConfigConfig _item = null; int shActorId = -1; GameObject _prefab = null; uint _guardSID = ServerInstID * 100 + 1; if (guardID > 0) { if (null != m_Guard) { _item = Config.Instance.Get<FuncConfigConfig>(StringUtility.Contact("SH", GuardID)); if (int.TryParse(_item.Numerical2, out shActorId)) { if (m_Guard.guardPrefabModel) { _prefab = InstanceResourcesLoader.LoadNpc(shActorId); GameObjectPoolManager.Instance.ReleaseGameObject(_prefab, m_Guard.guardPrefabModel); } } m_Guard.UnInit(); m_Guard = null; } _item = Config.Instance.Get<FuncConfigConfig>(StringUtility.Contact("SH", guardID)); if (_item == null) { return; } if (!int.TryParse(_item.Numerical2, out shActorId)) var config = Config.Instance.Get<GuardConfig>((int)guardID); if (config == null) { return; } @@ -1093,13 +1076,10 @@ if (ShowOrHide) { m_Guard = GAMgr.Instance.RequestNpcNoFight<GA_Guard>(ServerInstID * 100 + 1, (uint)shActorId, Group, null); m_Guard = GAMgr.Instance.RequestNpcNoFight<GA_Guard>(ServerInstID * 100 + 1, (uint)config.npcId, Group, null); m_Guard.itemID = (int)guardID; m_Guard.InitBase(); m_Guard.IsStateActive = true; var bornpos = m_Root.position + m_Root.right * 0.6f - Forward * 0.3f; bornpos.y = m_Root.position.y + m_Guard.GuardianHeight; m_Guard.Pos = bornpos; } } else Fight/Stage/Dungeon/DropItemManager.cs
@@ -34,6 +34,8 @@ get { return _playerPack ?? (_playerPack = ModelCenter.Instance.GetModel<PlayerPackModel>()); } } static GuardModel guardModel { get { return ModelCenter.Instance.GetModel<GuardModel>(); } } public static void Request(H0701_tagItemDrop h0701) { #if UNITY_EDITOR @@ -479,11 +481,11 @@ } #region 守护拾取 public static bool TryGetGuardPickUpItem(GA_Guard guard, ref List<int> dropRefItemList) public static bool TryGetGuardPickUpItem(Vector3 position, ref List<int> dropRefItemList) { for (int i = 0; i < m_MapItemIdList.Count; i++) { if (CheckCanGuardPickUp(guard, guard.GuardianCanPickupRange, i)) if (CheckCanGuardPickUp(position, guardModel.pickUpViewRange, i)) { dropRefItemList.Add(m_MapItemIdList[i]); } @@ -491,11 +493,11 @@ return dropRefItemList.Count > 0; } public static bool CheckCanGuardPickUp(GA_Guard guard) public static bool CheckCanGuardPickUp(Vector3 position) { for (int i = 0; i < m_MapItemIdList.Count; i++) { if (CheckCanGuardPickUp(guard, guard.GuardianCanPickupRange, i)) if (CheckCanGuardPickUp(position, guardModel.pickUpViewRange, i)) { return true; } @@ -503,7 +505,7 @@ return false; } public static void CheckGuardPickUpItem(GA_Guard guard) public static void CheckGuardPickUpItem(Vector3 position) { guardSendPickList.Clear(); for (int i = 0; i < m_MapItemIdList.Count; i++) @@ -522,7 +524,7 @@ } } if (CheckCanGuardPickUp(guard, guard.GuardianPickupRange, i)) if (CheckCanGuardPickUp(position, guardModel.pickUpAreaRange, i)) { guardSendPickList.Add((ushort)m_MapItemIdList[i]); Vector3 _pos = Vector3.zero; @@ -571,7 +573,7 @@ } } private static bool CheckCanGuardPickUp(GA_Guard guard, float _pickRange, int _itemIndex) private static bool CheckCanGuardPickUp(Vector3 position, float _pickRange, int _itemIndex) { DropObject _item = null; if (m_MapItemDict.ContainsKey(m_MapItemIdList[_itemIndex]) == false) @@ -583,7 +585,7 @@ { return false; } Vector3 _disVec = _item.dropItem.transform.position - guard.Root.position; Vector3 _disVec = _item.dropItem.transform.position - position; _disVec.y = 0; float _chkDis = Vector3.SqrMagnitude(_disVec); if (_chkDis > _pickRange) System/Guard/GuardModel.cs
@@ -136,12 +136,49 @@ } } #region 配置 public float speed { get; private set; } public float pickUpViewRange { get; private set; } public float pickUpAreaRange { get; private set; } public float traceRange { get; private set; } public float impendRange { get; private set; } public float idleTimeMin { get; private set; } public float idleTimeMax { get; private set; } public float stopAnimationSpeed { get; private set; } public float height { get; private set; } public float pickUpSfxSpeed { get; private set; } public float resetDistance { get; private set; } void ParseConfig() { var config = Config.Instance.Get<FuncConfigConfig>("XjmjGuardian"); fairyLandGuardItems.AddRange(ConfigParse.GetMultipleStr<int>(config.Numerical1)); fairyLandGuardItems.Sort(Compare); config = Config.Instance.Get<FuncConfigConfig>("GuardianSpeed"); speed = float.Parse(config.Numerical1); stopAnimationSpeed = float.Parse(config.Numerical2); pickUpSfxSpeed = float.Parse(config.Numerical3); config = Config.Instance.Get<FuncConfigConfig>("GuardianPickupRange"); pickUpViewRange = float.Parse(config.Numerical1); pickUpAreaRange = float.Parse(config.Numerical2); config = Config.Instance.Get<FuncConfigConfig>("GuardianTraceRange"); traceRange = float.Parse(config.Numerical1); resetDistance = float.Parse(config.Numerical2); config = Config.Instance.Get<FuncConfigConfig>("GuardianImpendRange"); impendRange = float.Parse(config.Numerical1); config = Config.Instance.Get<FuncConfigConfig>("GuardianRandomIdle"); idleTimeMin = float.Parse(config.Numerical1); idleTimeMax = float.Parse(config.Numerical2); config = Config.Instance.Get<FuncConfigConfig>("GuardianHigh"); height = float.Parse(config.Numerical1); } #endregion int Compare(int x, int y) {