少年修仙传客户端代码仓库
client_Hale
2019-03-04 03a7dc0924450a37c9c1972edbdbd0154945836c
6317 【前端】【2.0】场景化单机战斗
11个文件已修改
8个文件已添加
518 ■■■■ 已修改文件
Core/MapEditor/Behavior/Bhv_Evt.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/MapEditor/Behavior/Bhv_Evt_RefreshMonster.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/MapEditor/Behavior/Bhv_MonsterData.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/MapEditor/Data/MapTrigger.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/MapEditor/Editor/MapEditor.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/H08_Event/DTC0820_tagMissionDict.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/SFX/SFXPlayUtility.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Actor/HeroBehaviour.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/GameActor/GA_NpcClientFightNorm.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/Dungeon/DungeonStage.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/ClientSceneManager.cs 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/ClientSceneManager.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/EventRefreshNPCHandler.cs 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/EventRefreshNPCHandler.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/IEventHandler.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/IEventHandler.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/TriggerHandler.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Fight/Stage/MapEditor/Game/TriggerHandler.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/RuntimeLogUtility.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/MapEditor/Behavior/Bhv_Evt.cs
@@ -43,9 +43,7 @@
        public virtual void Export(BinaryWriter bw)
        {
            bw.Write((byte)type);
            Debug.LogFormat("type: {0}", type);
            bw.Write(id);
            Debug.LogFormat("id: {0}", id);
        }
#endif
    }
Core/MapEditor/Behavior/Bhv_Evt_RefreshMonster.cs
@@ -71,7 +71,23 @@
            int _count = br.ReadInt32();
            for (int i = 0; i < _count; ++i)
            {
                var _go = new GameObject();
                var _resName = br.ReadString();
                GameObject _go = null;
                if (!string.IsNullOrEmpty(_resName.Trim()))
                {
                    string _path = "Assets/ResourcesOut/Mob/Prefab_Race_" + _resName + ".prefab";
                    _go = AssetDatabase.LoadAssetAtPath<GameObject>(_path);
                    if (_go)
                    {
                        _go = Instantiate(_go);
                    }
                }
                else
                {
                    _go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
                }
                _go.transform.SetParent(transform);
                _go.transform.localPosition = Vector3.zero;
                _go.transform.eulerAngles = Vector3.zero;
@@ -171,10 +187,10 @@
                    for (int i = monsterList.Count - 1; i >= 0; --i)
                    {
                        EditorGUILayout.BeginHorizontal(GUILayout.Height(22));
                        EditorGUILayout.LabelField("NPCID", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(50));
                        EditorGUILayout.LabelField(monsterList[i].npcID.ToString(), guiSkin.textField, GUILayout.Height(20));
                        EditorGUILayout.LabelField("模型名", guiSkin.customStyles[0], GUILayout.Height(22), GUILayout.Width(50));
                        EditorGUILayout.LabelField(monsterList[i].resName, guiSkin.textField, GUILayout.Height(22), GUILayout.Width(70));
                        EditorGUILayout.LabelField("NPCID", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(50));
                        EditorGUILayout.LabelField(monsterList[i].npcID.ToString(), guiSkin.textField, GUILayout.Height(20), GUILayout.Width(70));
                        EditorGUILayout.LabelField("模型名", guiSkin.customStyles[0], GUILayout.Height(20), GUILayout.Width(50));
                        EditorGUILayout.LabelField(monsterList[i].resName, guiSkin.textField, GUILayout.Height(20), GUILayout.Width(70));
                        if (GUILayout.Button("定高", guiSkin.button, GUILayout.Width(60), GUILayout.Height(20)))
                        {
                            Vector3 _pos = monsterList[i].transform.position;
Core/MapEditor/Behavior/Bhv_MonsterData.cs
@@ -16,8 +16,8 @@
        public void Save(BinaryWriter bw)
        {
            bw.Write(npcID);
            bw.Write(resName);
            bw.Write(npcID);
            bw.Write(ai);
            bw.Write((float)System.Math.Round(transform.position.x, 2));
            bw.Write((float)System.Math.Round(transform.position.y, 2));
@@ -27,7 +27,6 @@
        public void Load(BinaryReader br)
        {
            npcID = br.ReadInt32();
            resName = br.ReadString();
            ai = br.ReadByte();
            float _x = br.ReadSingle();
            float _y = br.ReadSingle();
Core/MapEditor/Data/MapTrigger.cs
@@ -16,6 +16,7 @@
        public Evt.E_EventType type;
        public E_TriggerType triggerType;
        public int prevID;
        public int nextID;
        public int id;
        public int[] evevntIDs;
        public Vector3 position;
@@ -28,6 +29,7 @@
            triggerType = (E_TriggerType)br.ReadByte();
            type = (Evt.E_EventType)br.ReadByte();
            prevID = br.ReadInt32();
            nextID = br.ReadInt32();
            float _pX = br.ReadSingle();
            float _pY = br.ReadSingle();
            float _pZ = br.ReadSingle();
Core/MapEditor/Editor/MapEditor.cs
@@ -82,6 +82,14 @@
        public override void OnInspectorGUI()
        {
            if (GUILayout.Button("测试"))
            {
                var m = MapData.LoadFormFile(10120);
                if (m == null)
                {
                    Debug.Log("加载失败");
                }
            }
            if (gUISkin == null)
            {
                gUISkin = AssetDatabase.LoadAssetAtPath<GUISkin>("Assets/Scripts/Core/MapEditor/Editor/EditorResources/EditorSkin.guiskin");
Core/NetworkPackage/DTCFile/ServerPack/H08_Event/DTC0820_tagMissionDict.cs
@@ -28,7 +28,8 @@
            taskmodel.TaskRefreshes((int)vNetData.MissionID, vNetData.DictKeyLen, vNetData.DictKey, (int)vNetData.DictValue);//任务字典
            taskmodel.Task0820(vNetData);
            taskmodel.GetTaskGetOnNow((int)vNetData.MissionID, vNetData.DictKey);
            PreFightMission.Instance.HandleNewPlayerMission(vNetData);
            // PreFightMission.Instance.HandleNewPlayerMission(vNetData);
            ClientSceneManager.Instance.Handle_0820(vNetData);
        }
    }
Core/SFX/SFXPlayUtility.cs
@@ -148,6 +148,7 @@
        }
        EffectConfig _effectModel = EffectConfig.Get(id);
        if (_effectModel.setParent > 0)
        {
            _controller.transform.SetParent(parent);
Fight/Actor/HeroBehaviour.cs
@@ -894,6 +894,15 @@
                        m_Hero.SelectTarget = null;
                    }
                    var _clientNpc = _target as GA_NpcClientFightNorm;
                    if (_clientNpc.belongEventID != -1)
                    {
                        var _eventHandler = ClientSceneManager.Instance.GetEventHandler(_clientNpc.belongEventID) as EventRefreshNPCHandler;
                        if (_eventHandler != null)
                        {
                            _eventHandler.NpcDead(_clientNpc.NpcConfig.NPCID);
                        }
                    }
                    // 前期战斗只发送石头人的
                    //if (1000 == _target.NpcConfig.NPCID)
                    //{
Fight/GameActor/GA_NpcClientFightNorm.cs
@@ -3,6 +3,7 @@
public class GA_NpcClientFightNorm : GActorNpcFight
{
    public int belongEventID;
    private HeadUpName m_HeadUpName;
    private LifeBar m_LifeBar;
@@ -135,6 +136,8 @@
            m_Obstacle = null;
        }
        belongEventID = -1;
        base.OnUnit();
    }
Fight/Stage/Dungeon/DungeonStage.cs
@@ -8,9 +8,7 @@
public class DungeonStage : Stage
{
    public static Dictionary<MapArea.E_Type, List<MapArea>> s_MapAreaDict;
    private static List<TransferGroup> m_TransferGroupList = new List<TransferGroup>();
    public static MapType CurrentMapType;
    private H2Engine.MapData mapData;
    public override void Initialize()
    {
@@ -31,11 +29,6 @@
        SoundPlayer.Instance.PlayBackGroundMusic(mapResConfig.Music);
        SceneResourcesReplace();
        foreach (var _t in m_TransferGroupList)
        {
            _t.UnInit();
        }
        m_TransferGroupList.Clear();
        // 做一些前期战斗的预加载
        // if (!PreFightMission.Instance.IsFinished())
        // {
@@ -114,7 +107,7 @@
            _hero.SkillMgr.ResetAllCD();
        }
        HandleMapData();
        ClientSceneManager.Instance.Init();
        GA_Hero.s_MapSwitching = false;
    }
@@ -124,7 +117,6 @@
        base.UnInitialize();
        StopAllCoroutines();
        mapData = null;
        if (s_MapAreaDict != null)
        {
@@ -150,7 +142,7 @@
            CameraController.Instance.StopZoom();
            CameraController.Instance.StopShake();
        }
        ClientSceneManager.Instance.UnInit();
        GAMgr.Instance.UnInit();
        DropItemManager.ReleaseAll();
        SFXPlayUtility.Instance.Unitialize();
@@ -168,10 +160,7 @@
        DropItemManager.Update();
        foreach (var _trasfer in m_TransferGroupList)
        {
            _trasfer.Update();
        }
        ClientSceneManager.Instance.Update();
        // if (PreFightMission.Instance.IsFinished() == false)
        // {
@@ -274,48 +263,7 @@
        }
    }
    private void HandleMapData()
    {
        mapData = H2Engine.MapData.LoadFormFile(PlayerDatas.Instance.baseData.MapID);
        if (mapData == null)
        {
            return;
        }
        // 目前版本只处理刷场景物件
        // foreach (var _trigger in mapData.triggers)
        // {
        //     if (_trigger.triggerType != H2Engine.MapTrigger.E_TriggerType.EnterStage)
        //     {
        //         continue;
        //     }
        //     foreach (var _id in _trigger.evevntIDs)
        //     {
        //         var _event = mapData.eventDict[_id];
        //         if (_event.type == H2Engine.Evt.E_EventType.SceneObject)
        //         {
        //             var _refreshSceneObject = _event as H2Engine.Evt_RefreshSceneObject;
        //             if (_refreshSceneObject != null)
        //             {
        //                 foreach (var _sceneObjData in _refreshSceneObject.sceneObjects)
        //                 {
        //                     var _prefab = InstanceResourcesLoader.LoadModelPrefab(InstanceResourcesLoader.raceSuffix, _sceneObjData.resName, false);
        //                     if (_prefab)
        //                     {
        //                         var _go = GameObject.Instantiate(_prefab);
        //                         _go.transform.position = _sceneObjData.position;
        //                         _go.transform.eulerAngles = _sceneObjData.eulerAngles;
        //                     }
        //                 }
        //             }
        //         }
        //     }
        // }
        foreach (var _trasfer in mapData.transfers)
        {
            m_TransferGroupList.Add(new TransferGroup(_trasfer));
        }
    }
    private void HandleAutoFight()
    {
@@ -475,23 +423,6 @@
            default:
                break;
        }
    }
    public Vector3 GetCloseTransPoint(Vector3 pos)
    {
        // 遍历找到离给定点最近并且可寻路至的传送点 P
        // 找到 P点的 另一端 P1
        // 判断当前传入的点是否可以寻路至 P1
        // 不行的话重新寻找 可以的话返回 P1 的坐标
        float _compareDis;
        float _dis;
        foreach (var _p in m_TransferGroupList)
        {
        }
        return Vector3.zero;
    }
    private void SceneResourceReplace10010()
Fight/Stage/MapEditor/Game/ClientSceneManager.cs
New file
@@ -0,0 +1,159 @@
using H2Engine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClientSceneManager : Singleton<ClientSceneManager>
{
    private H2Engine.MapData m_MapData;
    private List<TransferGroup> m_TransferGroupList = new List<TransferGroup>();
    private Dictionary<int, IEventHandler> m_EventHandlerDict = new Dictionary<int, IEventHandler>();
    private List<IEventHandler> m_ReadyRemoveEventHandlerList = new List<IEventHandler>();
    public void Handle_0820(H0820_tagMissionDict package)
    {
        if (package.DictKey.Equals("riggerID"))
        {
            SnxxzGame.Instance.StartCoroutine(DelayTrigger((int)package.DictValue));
        }
    }
    private bool m_Inited = false;
    public void Init()
    {
        if (m_Inited)
        {
            return;
        }
        m_Inited = true;
        int _mapID = PlayerDatas.Instance.baseData.MapID;
        m_MapData = MapData.LoadFormFile(_mapID);
        if (m_MapData == null)
        {
            return;
        }
        foreach (var _trasfer in m_MapData.transfers)
        {
            m_TransferGroupList.Add(new TransferGroup(_trasfer));
        }
    }
    public void UnInit()
    {
        foreach (var _t in m_TransferGroupList)
        {
            _t.UnInit();
        }
        m_TransferGroupList.Clear();
        m_Inited = false;
    }
    public void Update()
    {
        foreach (var _trasfer in m_TransferGroupList)
        {
            _trasfer.Update();
        }
        m_ReadyRemoveEventHandlerList.Clear();
        foreach (var _eventHandler in m_EventHandlerDict.Values)
        {
            _eventHandler.Update();
            if (_eventHandler.IsCompelete())
            {
                m_ReadyRemoveEventHandlerList.Add(_eventHandler);
            }
        }
        foreach (var _eventHandler in m_ReadyRemoveEventHandlerList)
        {
            _eventHandler.UnInit();
            m_EventHandlerDict.Remove(_eventHandler.GetEventID());
        }
        m_ReadyRemoveEventHandlerList.Clear();
    }
    public IEventHandler GetEventHandler(int id)
    {
        if (m_EventHandlerDict.ContainsKey(id))
        {
            return m_EventHandlerDict[id];
        }
        return null;
    }
    public Vector3 GetCloseTransPoint(Vector3 pos)
    {
        // 遍历找到离给定点最近并且可寻路至的传送点 P
        // 找到 P点的 另一端 P1
        // 判断当前传入的点是否可以寻路至 P1
        // 不行的话重新寻找 可以的话返回 P1 的坐标
        float _compareDis;
        float _dis;
        foreach (var _p in m_TransferGroupList)
        {
        }
        return Vector3.zero;
    }
    private IEnumerator DelayTrigger(int id)
    {
        while (StageLoad.Instance.isLoading)
        {
            yield return null;
        }
        if (m_MapData == null)
        {
            Init();
        }
        if (m_MapData.triggers == null
         || m_MapData.triggers.Length == 0)
        {
            yield break;
        }
        foreach (var _trigger in m_MapData.triggers)
        {
            if (_trigger.id != id)
            {
                continue;
            }
            if (_trigger.evevntIDs == null
             || _trigger.evevntIDs.Length == 0)
            {
                continue;
            }
            foreach (var _eventID in _trigger.evevntIDs)
            {
                if (!m_MapData.eventDict.ContainsKey(_eventID))
                {
                    continue;
                }
                var _event = m_MapData.eventDict[_eventID];
                if (_event.type == Evt.E_EventType.Enemy)
                {
                    var _refreshEvent = new EventRefreshNPCHandler();
                    _refreshEvent.Init(_event as Evt_RefreshMonster);
                    m_EventHandlerDict.Add(_refreshEvent.GetEventID(), _refreshEvent);
                }
            }
            break;
        }
    }
}
Fight/Stage/MapEditor/Game/ClientSceneManager.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: b5880d5e8e289c74cab760bb8367869c
timeCreated: 1551698978
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Fight/Stage/MapEditor/Game/EventRefreshNPCHandler.cs
New file
@@ -0,0 +1,137 @@
using UnityEngine;
using H2Engine;
public class EventRefreshNPCHandler : IEventHandler
{
    private Evt_RefreshMonster m_Evt = null;
    private int m_DeadCount = 0;
    private float m_Duration = 0;
    private int m_RefreshCount = -1;
    private float m_RefreshInterval = 0;
    public int GetEventID()
    {
        if (m_Evt != null)
        {
            return m_Evt.id;
        }
        return -1;
    }
    public Evt.E_EventType GetEventType()
    {
        return Evt.E_EventType.Enemy;
    }
    public void Init(Evt evt)
    {
        m_Evt = evt as Evt_RefreshMonster;
        m_DeadCount = 0;
        m_Duration = 0;
        m_RefreshCount = -1;
        m_RefreshInterval = 0;
    }
    public void Update()
    {
        if (IsCompelete() && m_Duration > 0)
        {
            return;
        }
        m_Duration += Time.deltaTime;
        // 此模式下刷出第一只怪
        if (m_Evt.refreshType == Evt_RefreshMonster.E_RefreshType.OneByOnePrevDie)
        {
            if (m_RefreshCount == -1)
            {
                RefreshNpc();
            }
        }
        else if (m_Evt.refreshType == Evt_RefreshMonster.E_RefreshType.All)
        {
            RefreshAll();
        }
        else if (m_Evt.refreshType == Evt_RefreshMonster.E_RefreshType.OneByOneTime)
        {
            m_RefreshInterval += Time.deltaTime;
            if (m_RefreshInterval > m_Evt.refreshParam)
            {
                m_RefreshInterval = 0;
                RefreshNpc();
            }
        }
    }
    public void NpcDead(int npcID)
    {
        m_DeadCount += 1;
        Debug.LogFormat("通知死亡: {0}, 当前计数: {1}", npcID, m_DeadCount);
        if (m_Evt.refreshType == Evt_RefreshMonster.E_RefreshType.OneByOnePrevDie)
        {
            RefreshNpc();
        }
        CA225_tagCMClientTaskCount _a225 = new CA225_tagCMClientTaskCount
        {
            CountID = (uint)npcID
        };
        GameNetSystem.Instance.SendInfo(_a225);
    }
    private void RefreshNpc()
    {
        m_RefreshCount += 1;
        if (m_RefreshCount >= 0 && m_RefreshCount < m_Evt.monsters.Length)
        {
            var _data = m_Evt.monsters[m_RefreshCount];
            var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightNorm>((uint)_data.npcID, E_ActorGroup.Enemy);
            _npc.Pos = _data.position;
            _npc.belongEventID = m_Evt.id;
        }
    }
    private void RefreshAll()
    {
        if (m_RefreshCount < m_Evt.monsters.Length)
        {
            foreach (var _data in m_Evt.monsters)
            {
                var _npc = GAMgr.Instance.ReqClntFightNpc<GA_NpcClientFightNorm>((uint)_data.npcID, E_ActorGroup.Enemy);
                _npc.Pos = _data.position;
                _npc.belongEventID = m_Evt.id;
            }
            m_RefreshCount = m_Evt.monsters.Length;
        }
    }
    public void UnInit()
    {
        Debug.LogFormat("事件: {0} => UnInit()", m_Evt.id);
    }
    public bool IsCompelete()
    {
        if (m_Evt == null)
        {
            return true;
        }
        if (m_Evt.overCondition == Evt_RefreshMonster.E_OverCondition.DeadCount)
        {
            if (m_Evt.conditionParam <= 0)
            {
                return m_DeadCount >= m_Evt.monsters.Length;
            }
            return m_DeadCount >= m_Evt.conditionParam;
        }
        else if (m_Evt.overCondition == Evt_RefreshMonster.E_OverCondition.Time)
        {
            return m_Duration >= m_Evt.conditionParam && m_DeadCount >= m_Evt.monsters.Length;
        }
        return false;
    }
}
Fight/Stage/MapEditor/Game/EventRefreshNPCHandler.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: c7f7e93eba93cd044bdd4b6ddc9aa334
timeCreated: 1551667471
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Fight/Stage/MapEditor/Game/IEventHandler.cs
New file
@@ -0,0 +1,11 @@
using H2Engine;
public interface IEventHandler
{
    int GetEventID();
    Evt.E_EventType GetEventType();
    void Init(Evt evt);
    bool IsCompelete();
    void Update();
    void UnInit();
}
Fight/Stage/MapEditor/Game/IEventHandler.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 8831940d4fa557e42825777dcd3ca1b7
timeCreated: 1551684662
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Fight/Stage/MapEditor/Game/TriggerHandler.cs
New file
@@ -0,0 +1,12 @@
using H2Engine;
using UnityEngine;
public class TriggerHandler
{
    private MapTrigger m_Trigger;
    public TriggerHandler(MapTrigger trigger)
    {
        m_Trigger = trigger;
    }
}
Fight/Stage/MapEditor/Game/TriggerHandler.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: d4b520a4d7e5d434a8cbbfa2f21eaadc
timeCreated: 1551678527
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Utility/RuntimeLogUtility.cs
@@ -188,9 +188,27 @@
    private Vector2 _start;
    private Vector2 _end;
    private int _triggerID;
    public override void OnInspectorGUI()
    {
        GUILayout.Space(5);
        EditorGUILayout.BeginHorizontal();
        _triggerID = EditorGUILayout.IntField("触发器ID", _triggerID);
        if (GUILayout.Button("触发客户端触发器"))
        {
        }
        EditorGUILayout.EndHorizontal();
        if (GUILayout.Button("清空任务"))
        {
            CA225_tagCMClientTaskCount _a225 = new CA225_tagCMClientTaskCount
            {
                CountID = 10000
            };
            GameNetSystem.Instance.SendInfo(_a225);
        }
        EditorGUILayout.LabelField("Log存储路径", RuntimeLogUtility.s_LogPath);
@@ -216,6 +234,7 @@
        RuntimeLogUtility.TEST_CLIENT_PVP = EditorGUILayout.Toggle("模拟客户端PVP状态", RuntimeLogUtility.TEST_CLIENT_PVP);
        RuntimeLogUtility.TEST_CLIENT_PVP_AI = EditorGUILayout.Toggle("模拟客户端PVP的AI状态", RuntimeLogUtility.TEST_CLIENT_PVP_AI);
        if (GUILayout.Button("创建PVP敌方"))
        {
            GActorPlayerBase.PlayerInfo _playerInfo = new GActorPlayerBase.PlayerInfo();