少年修仙传客户端代码仓库
4697 【前端】【代码、配置优化】【1.3】部分关于守护的配置从功能配置表转移,新增守护表
2个文件已添加
9个文件已修改
984 ■■■■ 已修改文件
Core/GameEngine/Model/Config/GuardConfig.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/GuardConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/ConfigManager.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/GuardPickupItem.cs 175 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/State/GuardState/GuardDance_2.cs 159 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/State/GuardState/GuardIdle.cs 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/State/GuardState/GuardRun.cs 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/GameActor/GA_Guard.cs 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/GameActor/GActorPlayerBase.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/Dungeon/DropItemManager.cs 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Guard/GuardModel.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | 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)
        {