Procházet zdrojové kódy

【优化】player实体及组件创建流程

johnclot69 před 2 roky
rodič
revize
ffd0b8786a
26 změnil soubory, kde provedl 747 přidání a 80 odebrání
  1. 35 0
      DotNet/Hotfix/Helper/PlayerFactory.cs
  2. 2 4
      DotNet/Hotfix/Helper/PlayerHelper.cs
  3. 32 0
      DotNet/Hotfix/Helper/SkillHelper.cs
  4. 2 6
      DotNet/Hotfix/Scenes/Game/Handler/C2G_BindPlayerHandler.cs
  5. 3 4
      DotNet/Hotfix/Scenes/Game/Handler/C2G_CreatePlayerHandler.cs
  6. 1 1
      DotNet/Hotfix/Scenes/Game/Handler/C2G_EnterMapHandler.cs
  7. 1 1
      DotNet/Hotfix/Scenes/Game/Map/MapSystem.cs
  8. 2 1
      DotNet/Hotfix/Scenes/Game/Player/PlayerDataComponentSystem.cs
  9. 20 0
      DotNet/Hotfix/Scenes/Game/Player/PlayerMoneyComponentSystem.cs
  10. 143 0
      DotNet/Hotfix/Scenes/Game/Player/PlayerSkillComponentSystem.cs
  11. 7 22
      DotNet/Hotfix/Scenes/Game/Player/PlayerSystem.cs
  12. 22 10
      DotNet/Hotfix/Scenes/Game/Player/PlayerTempDataComponentSystem.cs
  13. 9 4
      DotNet/Hotfix/Scenes/Game/Player/SessionPlayerComponentSystem.cs
  14. 44 0
      DotNet/Model/ConfigPartial/Character.cs
  15. 0 11
      DotNet/Model/ConfigPartial/StartProcessConfig.cs.meta
  16. 0 11
      DotNet/Model/ConfigPartial/StartSceneConfig.cs.meta
  17. 154 0
      DotNet/Model/Generate/Config/SkillConfig.cs
  18. 0 2
      DotNet/Model/Scenes/Game/DBEntity/PlayerInfo.cs
  19. 0 1
      DotNet/Model/Scenes/Game/DBEntity/PlayerMapInfo.cs
  20. 13 0
      DotNet/Model/Scenes/Game/DBEntity/PlayerSkillInfo.cs
  21. 11 0
      DotNet/Model/Scenes/Game/Player/PlayerSkillComponent.cs
  22. 5 0
      DotNet/Model/Scenes/Game/Player/WNPlayer.cs
  23. 160 0
      Unity/Assets/Scripts/Codes/Model/Client/Generate/Config/SkillConfig.cs
  24. 19 2
      Unity/Assets/Scripts/Codes/Model/Share/Const/ConstGame.cs
  25. 61 0
      Unity/Assets/Scripts/Codes/Model/Share/Const/Struct.cs
  26. 1 0
      Unity/Assets/Scripts/Core/Module/CoroutineLock/CoroutineLockType.cs

+ 35 - 0
DotNet/Hotfix/Helper/PlayerFactory.cs

@@ -0,0 +1,35 @@
+namespace ET.Server
+{
+    public static class PlayerFactory
+    {
+        /// <summary>
+        /// 创建玩家实体
+        /// </summary>
+        /// <param name="session"></param>
+        /// <param name="playerInfo"></param>
+        /// <returns></returns>
+        public static async ETTask<WNPlayer> CreatPlayer(Session session, PlayerInfo playerInfo)
+        {
+            WNPlayer player = session.DomainScene().GetComponent<GamePlayerComponent>()
+                    .AddChild<WNPlayer, Session, PlayerInfo>(session, playerInfo);
+
+            // 绑定sessionId
+            player.GameSessionActorId = session.InstanceId;
+            player.Session = session;
+            player.BasicProp = CharacterCategory.Instance.Get(playerInfo.Pro);
+            player.BornType = (int)BORN_TYPE.NORMAL;
+            player.EnterState = (int)ENTER_STATE.online;
+
+            // 玩家基础数据组件
+            player.AddComponent<PlayerDataComponent, PlayerInfo, WNPlayer>(playerInfo, player);
+            // 玩家临时数据组件
+            await player.AddComponent<PlayerTempDataComponent, WNPlayer>(player).Init();
+            // 玩家技能组件
+            await player.AddComponent<PlayerSkillComponent, WNPlayer>(player).Init();
+            // 玩家货币组件
+            await player.AddComponent<PlayerMoneyComponent, WNPlayer>(player).Init();
+
+            return player;
+        }
+    }
+}

+ 2 - 4
DotNet/Hotfix/Helper/PlayerHelper.cs

@@ -1,6 +1,4 @@
-using System.Text.Json;
-
-namespace ET.Server
+namespace ET.Server
 {
     /// <summary>
     /// 玩家工具类
@@ -16,7 +14,7 @@ namespace ET.Server
         {
             return new PlayerBasic()
             {
-                id = playerInfo.PlayerId.ToString(),
+                id = playerInfo.Id.ToString(),
                 uid = playerInfo.UserId.ToString(),
                 name = playerInfo.Name,
                 level = playerInfo.Level,

+ 32 - 0
DotNet/Hotfix/Helper/SkillHelper.cs

@@ -0,0 +1,32 @@
+namespace ET.Server
+{
+    /// <summary>
+    /// 技能工具类
+    /// </summary>
+    public static class SkillHelper
+    {
+        /** 是否是人物被动技能*/
+        public static bool IsPassive(SkillConfig prop) {
+            return prop.SkillType == (int)SkillType.PLAYER_PASSIVE;
+        }
+
+        /// <summary>
+        /// 创建技能信息
+        /// </summary>
+        /// <param name="baseSkill"></param>
+        /// <returns></returns>
+        public static Struct.SkillInfo NewSkillInfo(Struct.PlayerSkillBaseData baseSkill)
+        {
+            Struct.SkillInfo data = new ();
+
+            SkillConfig prop = SkillConfigCategory.Instance.Get(baseSkill.id);
+            data.type = prop.SkillType;
+            data.id = baseSkill.id;
+            data.level = baseSkill.level;
+            data.skillTime = baseSkill.skillTime;
+            data.cdTime = 0;
+
+            return data;
+        }
+    }
+}

+ 2 - 6
DotNet/Hotfix/Scenes/Game/Handler/C2G_BindPlayerHandler.cs

@@ -1,6 +1,5 @@
 using System;
 using System.Collections.Generic;
-using System.Linq;
 
 namespace ET.Server
 {
@@ -24,7 +23,7 @@ namespace ET.Server
             // 预先创建数据
             long _id = IdGenerater.Instance.GenerateUnitId(scene.DomainZone());
             PlayerInfo playerInfo = new PlayerInfo();
-            playerInfo.PlayerId = _id;
+            playerInfo.Id = _id;
             playerInfo.UserId = session.GetComponent<SessionPlayerComponent>().UserId;
             playerInfo.Name = "玩家-" + _id;
             playerInfo.Sex = 0;
@@ -101,10 +100,7 @@ namespace ET.Server
                 scene.GetComponent<GamePlayerComponent>().Remove(request.PlayerId);
             }
 
-            player ??= scene.GetComponent<GamePlayerComponent>()
-                    .AddChild<WNPlayer, Session, PlayerInfo>(session, playerInfo);
-
-            await player.GetComponent<PlayerTempDataComponent>().InitFromDB();
+            player = await PlayerFactory.CreatPlayer(session, playerInfo);
 
             // 绑定选择的玩家
             session.GetComponent<SessionPlayerComponent>().PlayerId = request.PlayerId > 0 ? request.PlayerId : player.GetId();

+ 3 - 4
DotNet/Hotfix/Scenes/Game/Handler/C2G_CreatePlayerHandler.cs

@@ -77,7 +77,7 @@ namespace ET.Server
             using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.CreatePlayer, _id.ToString().Trim().GetHashCode()))
             {
                 playerInfo = new PlayerInfo();
-                playerInfo.PlayerId = _id;
+                playerInfo.Id = _id;
                 playerInfo.UserId = session.GetComponent<SessionPlayerComponent>().UserId;
                 playerInfo.Name = request.Name;
                 playerInfo.Sex = request.Sex;
@@ -89,13 +89,12 @@ namespace ET.Server
             }
 
             // 创建玩家实体, 初始化各模块数据
-            WNPlayer player = scene.GetComponent<GamePlayerComponent>()
-                    .AddChildWithId<WNPlayer, Session, PlayerInfo>(playerInfo.PlayerId, session, playerInfo);
+            WNPlayer player = await PlayerFactory.CreatPlayer(session, playerInfo);
 
             // 添加绑定session角色
             session.GetComponent<SessionPlayerComponent>().Add(playerInfo);
 
-            Log.Info($"创建角色, playerId={playerInfo.PlayerId}, name={playerInfo.Name}, userId={playerInfo.UserId}");
+            Log.Info($"创建角色, playerId={playerInfo.Id}, name={playerInfo.Name}, userId={playerInfo.UserId}");
 
             response.Player = PlayerHelper.PlayerInfoToProto(player);
 

+ 1 - 1
DotNet/Hotfix/Scenes/Game/Handler/C2G_EnterMapHandler.cs

@@ -58,7 +58,7 @@ namespace ET.Server
             response.MapInstanceId = player.Map.Id;
             reply();
 
-            //等待client ready消息
+            // 等待client ready消息
             // await session.DomainScene().GetComponent<ObjectWait>().Wait<Wait_PlayerReady>();
 
             // player.OnEndEnterScene();

+ 1 - 1
DotNet/Hotfix/Scenes/Game/Map/MapSystem.cs

@@ -107,7 +107,7 @@ namespace ET.Server
 
             try
             {
-                self.GetZoneManager().playerEnterRequest(player.GetId().ToString().Trim(), self.Id.ToString().Trim(), player.toJSON4EnterScene(self));
+                self.GetZoneManager().playerEnterRequest(player.GetId().ToString().Trim(), self.Id.ToString().Trim(), player.ToJSON4EnterScene(self));
             }
             catch (Exception e)
             {

+ 2 - 1
DotNet/Hotfix/Scenes/Game/Player/PlayerDataComponentSystem.cs

@@ -13,6 +13,7 @@ namespace ET.Server
             /// <param name="player"></param>
             protected override void Awake(PlayerDataComponent self, PlayerInfo info, WNPlayer player)
             {
+                Log.Info($"创建玩家基础数据组件...");
                 self.Player = player;
                 self.Data = info;
             }
@@ -35,7 +36,7 @@ namespace ET.Server
         {
             if (self.Data != null)
             {
-                self.Data.PlayerId = self.Player.GetId();
+                self.Data.Id = self.Player.GetId();
                 await DBManagerComponent.Instance.GetZoneDB(self.DomainZone()).Save(self.Data);
             }
         }

+ 20 - 0
DotNet/Hotfix/Scenes/Game/Player/PlayerMoneyComponentSystem.cs

@@ -5,14 +5,24 @@
     {
         public class PlayerMoneyComponentAwakeSystem: AwakeSystem<PlayerMoneyComponent, WNPlayer>
         {
+            /// <summary>
+            /// 玩家货币组件创建
+            /// </summary>
+            /// <param name="self"></param>
+            /// <param name="player"></param>
             protected override void Awake(PlayerMoneyComponent self, WNPlayer player)
             {
+                Log.Info($"创建玩家货币组件...");
                 self.Player = player;
             }
         }
 
         public class PlayerMoneyComponentDestroySystem: DestroySystem<PlayerMoneyComponent>
         {
+            /// <summary>
+            /// 玩家货币组件销毁
+            /// </summary>
+            /// <param name="self"></param>
             protected override void Destroy(PlayerMoneyComponent self)
             {
                 Log.Debug($"玩家货币数据保存");
@@ -20,6 +30,16 @@
             }
         }
 
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <param name="self"></param>
+        public static async ETTask Init(this PlayerMoneyComponent self)
+        {
+
+            await ETTask.CompletedTask;
+        }
+
         public static async ETTask Save(this PlayerMoneyComponent self)
         {
             await ETTask.CompletedTask;

+ 143 - 0
DotNet/Hotfix/Scenes/Game/Player/PlayerSkillComponentSystem.cs

@@ -0,0 +1,143 @@
+using System.Collections.Generic;
+using System.Linq;
+
+namespace ET.Server
+{
+    [FriendOf(typeof (PlayerSkillComponent))]
+    public static class PlayerSkillComponentSystem
+    {
+        public class PlayerSkillComponentAwakeSystem: AwakeSystem<PlayerSkillComponent, WNPlayer>
+        {
+            /// <summary>
+            /// 玩家技能组件创建
+            /// </summary>
+            /// <param name="self"></param>
+            /// <param name="player"></param>
+            protected override void Awake(PlayerSkillComponent self, WNPlayer player)
+            {
+                Log.Info($"创建玩家技能组件...");
+                self.Player = player;
+            }
+        }
+
+        public class PlayerSkillComponentDestroySystem: DestroySystem<PlayerSkillComponent>
+        {
+            /// <summary>
+            /// 玩家技能组件销毁
+            /// </summary>
+            /// <param name="self"></param>
+            protected override void Destroy(PlayerSkillComponent self)
+            {
+                Log.Debug($"玩家技能数据保存");
+                self?.Save();
+            }
+        }
+
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <param name="self"></param>
+        public static async ETTask Init(this PlayerSkillComponent self)
+        {
+            List<PlayerSkillInfo> list = await DBManagerComponent.Instance.GetZoneDB(self.DomainZone())
+                    .Query<PlayerSkillInfo>(p => p.Id == self.Player.GetId());
+            if (list is { Count: > 0 })
+            {
+                self.Data = list[0];
+            }
+
+            if (self.Data is { Skills.Count: > 0 })
+            {
+                return;
+            }
+
+            self.Data = new PlayerSkillInfo();
+            self.Data.Skills = new List<Struct.PlayerSkillBaseData>();
+
+            Character config = CharacterCategory.Instance.Get(self.Player.GetPro());
+            if (config != null && config.InitSkillList.Count > 0)
+            {
+                foreach (Struct.IntIntData intIntData in config.InitSkillList.Where(intIntData => intIntData != null))
+                {
+                    self.Data.Skills.Add(new Struct.PlayerSkillBaseData(intIntData.value1, intIntData.value2, false, 0L));
+                }
+            }
+
+            self?.Save();
+
+            self.Player.ToJson4BattleServerSkillInfos = self.ToJson4BattleServer();
+        }
+
+        /// <summary>
+        /// 保存数据
+        /// </summary>
+        /// <param name="self"></param>
+        private static async ETTask Save(this PlayerSkillComponent self)
+        {
+            if (self.Data == null)
+            {
+                Log.Debug($"保存玩家技能组件数据, Data is null");
+                return;
+            }
+
+            self.Data.Id = self.Player.GetId();
+            await DBManagerComponent.Instance.GetZoneDB(self.DomainZone()).Save(self.Data);
+        }
+
+
+        /// <summary>
+        /// 被动技能, 发给bs
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        private static IEnumerable<Struct.SkillInfo> GetPassiveSkillInfoBS(this PlayerSkillComponent self)
+        {
+            List<Struct.SkillInfo> list = new List<Struct.SkillInfo>();
+
+            foreach (SkillConfig prop in SkillConfigCategory.Instance.GetAll().Values.Where(prop => prop != null))
+            {
+                if (prop.ProId != self.Player.GetPro() || prop.SkillType != (int)SkillType.PLAYER_PASSIVE)
+                {
+                    continue;
+                }
+
+                Struct.SkillInfo info = new ();
+                info.type = prop.SkillType;
+                info.id = prop.Id;
+                info.level = 1;
+                info.skillTime = 0L;
+                info.cdTime = 0;
+
+                list.Add(info);
+            }
+
+            return list;
+        }
+
+        /// <summary>
+        /// 战斗服数据
+        /// </summary>
+        /// <param name="self"></param>
+        /// <returns></returns>
+        public static List<Struct.SkillInfo> ToJson4BattleServer(this PlayerSkillComponent self)
+        {
+            List<Struct.SkillInfo> skills = new List<Struct.SkillInfo>();
+            foreach (Struct.PlayerSkillBaseData skill in self.Data.Skills.Where(skill => skill != null))
+            {
+                if (skill.isUnlock())
+                {
+                    SkillConfig prop = SkillConfigCategory.Instance.Get(skill.id);
+                    if (prop != null && !SkillHelper.IsPassive(prop))
+                    {
+                        skills.Add(SkillHelper.NewSkillInfo(skill));
+                    }
+                }
+            }
+
+            // 被动技能战斗服信息
+            skills.AddRange(self.GetPassiveSkillInfoBS());
+
+            return skills;
+        }
+    }
+}

+ 7 - 22
DotNet/Hotfix/Scenes/Game/Player/PlayerSystem.cs

@@ -18,20 +18,7 @@ namespace ET.Server
             /// <param name="playerInfo"></param>
             protected override void Awake(WNPlayer self, Session session, PlayerInfo playerInfo)
             {
-                // 绑定sessionId
-                self.GameSessionActorId = session.InstanceId;
-                self.Session = session;
-                self.BasicProp = CharacterCategory.Instance.Get(playerInfo.Pro);
-                self.BornType = (int)BORN_TYPE.NORMAL;
-                self.EnterState = (int)ENTER_STATE.online;
-                // 玩家基础数据组件
-                self.AddComponent<PlayerDataComponent, PlayerInfo, WNPlayer>(playerInfo, self);
-                // 玩家临时数据组件
-                self.AddComponent<PlayerTempDataComponent, WNPlayer>(self);
-                // 玩家技能组件
-                // self.AddComponent<PlayerSkillComponent, WNPlayer>(self);
-                // 玩家货币组件
-                self.AddComponent<PlayerMoneyComponent, WNPlayer>(self);
+                Log.Info($"创建玩家实体...");
             }
         }
 
@@ -43,7 +30,7 @@ namespace ET.Server
             /// <param name="self"></param>
             protected override void Destroy(WNPlayer self)
             {
-                Log.Info($"玩家实体销毁...");
+                Log.Info($"销毁玩家实体...");
             }
         }
 
@@ -54,7 +41,7 @@ namespace ET.Server
         /// <returns></returns>
         public static long GetId(this WNPlayer self)
         {
-            return self.GetComponent<PlayerDataComponent>().Data.PlayerId;
+            return self.GetComponent<PlayerDataComponent>().Data.Id;
         }
 
         /// <summary>
@@ -214,7 +201,7 @@ namespace ET.Server
         }
 
         /** 场景中角色需求数据 **/
-        public static string toJSON4EnterScene(this WNPlayer self, Map map)
+        public static string ToJSON4EnterScene(this WNPlayer self, Map map)
         {
             var json = new
             {
@@ -227,6 +214,7 @@ namespace ET.Server
                     AttackPer = 100,
                 },
                 effectsExt = new { },
+                // skills = self.ToJson4BattleServerSkillInfos,
                 skills = new List<SkillInfo>()
                 {
                     new SkillInfo
@@ -258,7 +246,7 @@ namespace ET.Server
                     alliesForce = 0,
                     force = 1,
                     pro = self.GetPro(),
-                    serverId = 101,
+                    serverId = ConstGame.GameServerId,
                     titleId = 0,
                     level = self.GetLevel(),
                     vip = 0,
@@ -289,10 +277,7 @@ namespace ET.Server
                 sceneData = new { allowAutoGuard = 3, },
             };
             string retjson = JsonSerializer.Serialize(json, new JsonSerializerOptions { IncludeFields = true });
-            Log.Debug("===================================");
-            Log.Debug(retjson.ToString());
-            Log.Debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
-
+            Log.Debug($"{self.GetName()}, enterSceneData:{retjson.ToString()}");
             return retjson;
         }
     }

+ 22 - 10
DotNet/Hotfix/Scenes/Game/Player/PlayerTempDataComponentSystem.cs

@@ -15,6 +15,7 @@ namespace ET.Server
             /// <param name="player"></param>
             protected override void Awake(PlayerTempDataComponent self, WNPlayer player)
             {
+                Log.Info($"创建玩家临时数据组件...");
                 self.Player = player;
             }
         }
@@ -32,29 +33,40 @@ namespace ET.Server
             }
         }
 
-        public static async ETTask InitFromDB(this PlayerTempDataComponent self)
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <param name="self"></param>
+        public static async ETTask Init(this PlayerTempDataComponent self)
         {
             List<PlayerMapInfo> list = await DBManagerComponent.Instance.GetZoneDB(self.DomainZone())
-                    .Query<PlayerMapInfo>(p => p.PlayerId == self.Player.GetId());
+                    .Query<PlayerMapInfo>(p => p.Id == self.Player.GetId());
             if (list is { Count: > 0 })
             {
                 self.MapData = list[0];
             }
-            else
+
+            if (self.MapData != null)
             {
-                self.MapData = new PlayerMapInfo();
-                self.MapData.mapId = 10098;
-                await self.Save();
+                return;
             }
+
+            self.MapData = new PlayerMapInfo();
+            self.MapData.mapId = 10098;
+
+            self?.Save();
         }
 
-        public static async ETTask Save(this PlayerTempDataComponent self)
+        private static async ETTask Save(this PlayerTempDataComponent self)
         {
-            if (self.MapData != null)
+            if (self.MapData == null)
             {
-                self.MapData.PlayerId = self.Player.GetId();
-                await DBManagerComponent.Instance.GetZoneDB(self.DomainZone()).Save(self.MapData);
+                Log.Debug($"保存玩家临时数据组件数据, Data is null");
+                return;
             }
+
+            self.MapData.Id = self.Player.GetId();
+            await DBManagerComponent.Instance.GetZoneDB(self.DomainZone()).Save(self.Player.GetId(), self.MapData);
         }
 
         /** 同步场景出生数据 **/

+ 9 - 4
DotNet/Hotfix/Scenes/Game/Player/SessionPlayerComponentSystem.cs

@@ -8,10 +8,15 @@ namespace ET.Server
 	{
         public class SessionPlayerComponentAwakeSystem: AwakeSystem<SessionPlayerComponent>
         {
+            /// <summary>
+            /// session玩家组件创建
+            /// </summary>
+            /// <param name="self"></param>
             protected override void Awake(SessionPlayerComponent self)
             {
-                self.PlayerList = new List<PlayerInfo>();
+                Log.Info($"创建session玩家绑定组件...");
                 self.PlayerId = 0;
+                self.PlayerList = new List<PlayerInfo>();
             }
         }
 
@@ -55,7 +60,7 @@ namespace ET.Server
         /// <returns></returns>
         public static bool IsExist(this SessionPlayerComponent self, long playerId)
         {
-            return self.PlayerList.Any(info => info != null && info.PlayerId == playerId);
+            return self.PlayerList.Any(info => info != null && info.Id == playerId);
         }
 
         /// <summary>
@@ -66,7 +71,7 @@ namespace ET.Server
         /// <returns></returns>
         public static PlayerInfo Get(this SessionPlayerComponent self, long playerId)
         {
-            return self.PlayerList.FirstOrDefault(info => info != null && info.PlayerId == playerId);
+            return self.PlayerList.FirstOrDefault(info => info != null && info.Id == playerId);
         }
 
         /// <summary>
@@ -83,7 +88,7 @@ namespace ET.Server
         }
 
         /// <summary>
-        /// 获取玩家实体
+        /// 获取当前玩家实体
         /// </summary>
         /// <param name="self"></param>
         /// <returns></returns>

+ 44 - 0
DotNet/Model/ConfigPartial/Character.cs

@@ -0,0 +1,44 @@
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Net;
+using ET.Server;
+
+namespace ET
+{
+    public partial class Character
+    {
+        /** 初始化技能列表 **/
+        public List<Struct.IntIntData> InitSkillList = new List<Struct.IntIntData>();
+
+        public override void AfterEndInit()
+        {
+            if (string.IsNullOrEmpty(this.initSkill))
+            {
+                Log.Warning($"配置表 Character 字段 initSkill 为空...Id={this.Id}, initSkill={this.initSkill}");
+                return;
+            }
+
+            string[] strings = this.initSkill.Split("|");
+            if (strings.Length <= 0)
+            {
+                Log.Error($"配置表 Character 字段 initSkill 格式错误...Id={this.Id}, initSkill={this.initSkill}");
+                return;
+            }
+
+            foreach (string sss in strings)
+            {
+                if (string.IsNullOrEmpty(sss))
+                {
+                    Log.Error($"配置表 Character 字段 initSkill 格式错误...Id={this.Id}, initSkill={this.initSkill}");
+                    continue;
+                }
+
+                string[] strs = sss.Split(":");
+                if (strs.Length == 2)
+                {
+                    this.InitSkillList.Add(new Struct.IntIntData(int.Parse(strs[0]), int.Parse(strs[1])));
+                }
+            }
+        }
+    }
+}

+ 0 - 11
DotNet/Model/ConfigPartial/StartProcessConfig.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: d21748fcd16e9ba4490731de6fb475b7
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 11
DotNet/Model/ConfigPartial/StartSceneConfig.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 2328265af4362554bb7e63612eafcc2e
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 154 - 0
DotNet/Model/Generate/Config/SkillConfig.cs

@@ -0,0 +1,154 @@
+using System;
+using System.Collections.Generic;
+using MongoDB.Bson.Serialization.Attributes;
+using ProtoBuf;
+
+namespace ET
+{
+    [ProtoContract]
+    [Config]
+    public partial class SkillConfigCategory : ConfigSingleton<SkillConfigCategory>, IMerge
+    {
+        [ProtoIgnore]
+        [BsonIgnore]
+        private Dictionary<int, SkillConfig> dict = new Dictionary<int, SkillConfig>();
+		
+        [BsonElement]
+        [ProtoMember(1)]
+        private List<SkillConfig> list = new List<SkillConfig>();
+		
+        public void Merge(object o)
+        {
+            SkillConfigCategory s = o as SkillConfigCategory;
+            this.list.AddRange(s.list);
+        }
+		
+		[ProtoAfterDeserialization]        
+        public void ProtoEndInit()
+        {
+            foreach (SkillConfig config in list)
+            {
+                config.AfterEndInit();
+                this.dict.Add(config.Id, config);
+            }
+            this.list.Clear();
+            
+            this.AfterEndInit();
+        }
+		
+        public SkillConfig Get(int id)
+        {
+            this.dict.TryGetValue(id, out SkillConfig item);
+
+            if (item == null)
+            {
+                throw new Exception($"配置找不到,配置表名: {nameof (SkillConfig)},配置id: {id}");
+            }
+
+            return item;
+        }
+		
+        public bool Contain(int id)
+        {
+            return this.dict.ContainsKey(id);
+        }
+
+        public Dictionary<int, SkillConfig> GetAll()
+        {
+            return this.dict;
+        }
+
+        public SkillConfig GetOne()
+        {
+            if (this.dict == null || this.dict.Count <= 0)
+            {
+                return null;
+            }
+            return this.dict.Values.GetEnumerator().Current;
+        }
+    }
+
+    [ProtoContract]
+	public partial class SkillConfig: ProtoObject, IConfig
+	{
+		/// <summary>Id</summary>
+		[ProtoMember(1)]
+		public int Id { get; set; }
+		/// <summary>显示序列</summary>
+		[ProtoMember(2)]
+		public int SkillIndex { get; set; }
+		/// <summary>技能名称</summary>
+		[ProtoMember(3)]
+		public string SkillName { get; set; }
+		/// <summary>系别</summary>
+		[ProtoMember(4)]
+		public int ProId { get; set; }
+		/// <summary>系别</summary>
+		[ProtoMember(5)]
+		public int Tab { get; set; }
+		/// <summary>技能类型</summary>
+		[ProtoMember(6)]
+		public int SkillType { get; set; }
+		/// <summary>技能描述</summary>
+		[ProtoMember(7)]
+		public string SkillDesc { get; set; }
+		/// <summary>基础技能升级描述</summary>
+		[ProtoMember(8)]
+		public string UpDesc { get; set; }
+		/// <summary>基础技能学习物品code</summary>
+		[ProtoMember(9)]
+		public string SkillItemCode { get; set; }
+		/// <summary>最高等级</summary>
+		[ProtoMember(10)]
+		public int MaxLevel { get; set; }
+		/// <summary>是否绑定解锁</summary>
+		[ProtoMember(11)]
+		public int LearnSkill { get; set; }
+		/// <summary>技能图标</summary>
+		[ProtoMember(12)]
+		public string SkillIcon { get; set; }
+		/// <summary>解锁升级需要人物等级序列</summary>
+		[ProtoMember(13)]
+		public string UpReqLevel { get; set; }
+		/// <summary>重置人物等级序列需要金币</summary>
+		[ProtoMember(14)]
+		public string ResetReqLevel { get; set; }
+		/// <summary>升级需要人物仙阶等级</summary>
+		[ProtoMember(15)]
+		public int UpReqLevel2 { get; set; }
+		/// <summary>升级花费金币序列</summary>
+		[ProtoMember(16)]
+		public string UpCostGold { get; set; }
+		/// <summary>升至本级花费技能点序列</summary>
+		[ProtoMember(17)]
+		public string UpCostSP { get; set; }
+		/// <summary>升级消耗道具序列</summary>
+		[ProtoMember(18)]
+		public string UpCostItem { get; set; }
+		/// <summary>每等级提供战斗力</summary>
+		[ProtoMember(19)]
+		public string Power { get; set; }
+		/// <summary>对应基础技能</summary>
+		[ProtoMember(20)]
+		public int BaseId { get; set; }
+		/// <summary>强化技能孔位</summary>
+		[ProtoMember(21)]
+		public int Pos { get; set; }
+		/// <summary>强化技能分支类型</summary>
+		[ProtoMember(22)]
+		public int BranchType { get; set; }
+		/// <summary>强化技能分支Icon</summary>
+		[ProtoMember(23)]
+		public string StrongIcon { get; set; }
+		/// <summary>强化技能阶段前置</summary>
+		[ProtoMember(24)]
+		public int StrongUnLockPre { get; set; }
+		/// <summary>强化技能描述</summary>
+		[ProtoMember(25)]
+		public string StrongBranchDesc { get; set; }
+		/// <summary>对应强化名称</summary>
+		[ProtoMember(27)]
+		public string StrongName { get; set; }
+
+	}
+}

+ 0 - 2
DotNet/Model/Scenes/Game/DBEntity/PlayerInfo.cs

@@ -5,8 +5,6 @@ namespace ET.Server
     /// </summary>
     public class PlayerInfo: Entity, IAwake
     {
-        /** 玩家id **/
-        public long PlayerId { get; set; }
         /** 账号id **/
         public long UserId { get; set; }
         /** 服务器id **/

+ 0 - 1
DotNet/Model/Scenes/Game/DBEntity/PlayerMapInfo.cs

@@ -5,7 +5,6 @@ namespace ET.Server
     /// </summary>
     public class PlayerMapInfo: Entity, IAwake
     {
-        public long PlayerId { get; set; }
         public bool ready { get; set; }
         public bool leave { get; set; }
         public bool alive { get; set; }

+ 13 - 0
DotNet/Model/Scenes/Game/DBEntity/PlayerSkillInfo.cs

@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+
+namespace ET.Server
+{
+    /// <summary>
+    /// 玩家技能信息
+    /// </summary>
+    public class PlayerSkillInfo: Entity, IAwake
+    {
+        /** 技能数据 key:skillId, value:数据结构 **/
+        public List<Struct.PlayerSkillBaseData> Skills { get; set; }
+    }
+}

+ 11 - 0
DotNet/Model/Scenes/Game/Player/PlayerSkillComponent.cs

@@ -0,0 +1,11 @@
+namespace ET.Server
+{
+    [ComponentOf(typeof (WNPlayer))]
+    public class PlayerSkillComponent: Entity, IAwake<WNPlayer>, IDestroy
+    {
+        /** 技能数据 **/
+        public PlayerSkillInfo Data { get; set; }
+        /** 玩家实体 **/
+        public WNPlayer Player { get; set; }
+    }
+}

+ 5 - 0
DotNet/Model/Scenes/Game/Player/WNPlayer.cs

@@ -1,3 +1,5 @@
+using System.Collections.Generic;
+
 namespace ET.Server
 {
     /// <summary>
@@ -27,5 +29,8 @@ namespace ET.Server
 
         /** 登录首次进入场景,用于onready,进行一次消息推送(只在登陆时候首次进场景推送)*/
         public bool readyFirst { get; set; }
+
+        /** 战斗服技能数据 **/
+        public List<Struct.SkillInfo> ToJson4BattleServerSkillInfos { get; set; }
     }
 }

+ 160 - 0
Unity/Assets/Scripts/Codes/Model/Client/Generate/Config/SkillConfig.cs

@@ -0,0 +1,160 @@
+using System;
+using System.Collections.Generic;
+using MongoDB.Bson.Serialization.Attributes;
+using ProtoBuf;
+
+namespace ET
+{
+    [ProtoContract]
+    [Config]
+    public partial class SkillConfigCategory : ConfigSingleton<SkillConfigCategory>, IMerge
+    {
+        [ProtoIgnore]
+        [BsonIgnore]
+        private Dictionary<int, SkillConfig> dict = new Dictionary<int, SkillConfig>();
+		
+        [BsonElement]
+        [ProtoMember(1)]
+        private List<SkillConfig> list = new List<SkillConfig>();
+		
+        public void Merge(object o)
+        {
+            SkillConfigCategory s = o as SkillConfigCategory;
+            this.list.AddRange(s.list);
+        }
+		
+		[ProtoAfterDeserialization]        
+        public void ProtoEndInit()
+        {
+            foreach (SkillConfig config in list)
+            {
+                config.AfterEndInit();
+                this.dict.Add(config.Id, config);
+            }
+            this.list.Clear();
+            
+            this.AfterEndInit();
+        }
+		
+        public SkillConfig Get(int id)
+        {
+            this.dict.TryGetValue(id, out SkillConfig item);
+
+            if (item == null)
+            {
+                throw new Exception($"配置找不到,配置表名: {nameof (SkillConfig)},配置id: {id}");
+            }
+
+            return item;
+        }
+		
+        public bool Contain(int id)
+        {
+            return this.dict.ContainsKey(id);
+        }
+
+        public Dictionary<int, SkillConfig> GetAll()
+        {
+            return this.dict;
+        }
+
+        public SkillConfig GetOne()
+        {
+            if (this.dict == null || this.dict.Count <= 0)
+            {
+                return null;
+            }
+            return this.dict.Values.GetEnumerator().Current;
+        }
+    }
+
+    [ProtoContract]
+	public partial class SkillConfig: ProtoObject, IConfig
+	{
+		/// <summary>Id</summary>
+		[ProtoMember(1)]
+		public int Id { get; set; }
+		/// <summary>显示序列</summary>
+		[ProtoMember(2)]
+		public int SkillIndex { get; set; }
+		/// <summary>技能名称</summary>
+		[ProtoMember(3)]
+		public string SkillName { get; set; }
+		/// <summary>系别</summary>
+		[ProtoMember(4)]
+		public int ProId { get; set; }
+		/// <summary>系别</summary>
+		[ProtoMember(5)]
+		public int Tab { get; set; }
+		/// <summary>技能类型</summary>
+		[ProtoMember(6)]
+		public int SkillType { get; set; }
+		/// <summary>技能描述</summary>
+		[ProtoMember(7)]
+		public string SkillDesc { get; set; }
+		/// <summary>基础技能升级描述</summary>
+		[ProtoMember(8)]
+		public string UpDesc { get; set; }
+		/// <summary>基础技能学习物品code</summary>
+		[ProtoMember(9)]
+		public string SkillItemCode { get; set; }
+		/// <summary>最高等级</summary>
+		[ProtoMember(10)]
+		public int MaxLevel { get; set; }
+		/// <summary>是否绑定解锁</summary>
+		[ProtoMember(11)]
+		public int LearnSkill { get; set; }
+		/// <summary>技能图标</summary>
+		[ProtoMember(12)]
+		public string SkillIcon { get; set; }
+		/// <summary>解锁升级需要人物等级序列</summary>
+		[ProtoMember(13)]
+		public string UpReqLevel { get; set; }
+		/// <summary>重置人物等级序列需要金币</summary>
+		[ProtoMember(14)]
+		public string ResetReqLevel { get; set; }
+		/// <summary>升级需要人物仙阶等级</summary>
+		[ProtoMember(15)]
+		public int UpReqLevel2 { get; set; }
+		/// <summary>升级花费金币序列</summary>
+		[ProtoMember(16)]
+		public string UpCostGold { get; set; }
+		/// <summary>升至本级花费技能点序列</summary>
+		[ProtoMember(17)]
+		public string UpCostSP { get; set; }
+		/// <summary>升级消耗道具序列</summary>
+		[ProtoMember(18)]
+		public string UpCostItem { get; set; }
+		/// <summary>每等级提供战斗力</summary>
+		[ProtoMember(19)]
+		public string Power { get; set; }
+		/// <summary>对应基础技能</summary>
+		[ProtoMember(20)]
+		public int BaseId { get; set; }
+		/// <summary>强化技能孔位</summary>
+		[ProtoMember(21)]
+		public int Pos { get; set; }
+		/// <summary>强化技能分支类型</summary>
+		[ProtoMember(22)]
+		public int BranchType { get; set; }
+		/// <summary>强化技能分支Icon</summary>
+		[ProtoMember(23)]
+		public string StrongIcon { get; set; }
+		/// <summary>强化技能阶段前置</summary>
+		[ProtoMember(24)]
+		public int StrongUnLockPre { get; set; }
+		/// <summary>强化技能描述</summary>
+		[ProtoMember(25)]
+		public string StrongBranchDesc { get; set; }
+		/// <summary>天赋分支名称</summary>
+		[ProtoMember(26)]
+		public string GeniusName { get; set; }
+		/// <summary>对应强化名称</summary>
+		[ProtoMember(27)]
+		public string StrongName { get; set; }
+		/// <summary>强化图标图集</summary>
+		[ProtoMember(28)]
+		public string Atlas { get; set; }
+
+	}
+}

+ 19 - 2
Unity/Assets/Scripts/Codes/Model/Share/Const/ConstGame.cs

@@ -23,8 +23,6 @@
     /// </summary>
     public enum PlayerProType: byte
     {
-        /** ALL **/
-        ALL = 0,
         /** 通用 **/
         COMMON = 0,
         /** 苍刃 **/
@@ -115,4 +113,23 @@
         All = 6,
     }
 
+    /**
+	 * 技能类型
+	 */
+    public enum SkillType
+    {
+        /** 主动技能 **/
+        ACTIVE = 1,
+        /** 宠物给主人增加的 **/
+        PET_GIVE_ACTIVE = 2,
+        /** 普攻 **/
+        NORMAL = 3,
+        /** 玩家被动 **/
+        PLAYER_PASSIVE = 4,
+        /** 宠物 给人的被动 **/
+        PET_GIVE_PASSIVE = 5,
+
+        CARD_SKILL = 6,
+    }
+
 }

+ 61 - 0
Unity/Assets/Scripts/Codes/Model/Share/Const/Struct.cs

@@ -5,6 +5,67 @@
     /// </summary>
     public class Struct
     {
+        public class IntIntData
+        {
+            public int value1 { get; set; }
+            public int value2 { get; set; }
+
+            public IntIntData(int value1, int value2)
+            {
+                this.value1 = value1;
+                this.value2 = value2;
+            }
+        }
+
+        /// <summary>
+        /// 玩家技能数据
+        /// </summary>
+        public class SkillInfo
+        {
+            /** 技能id **/
+            public int id { get; set; }
+            /** 技能等级 **/
+            public int level { get; set; }
+            /** 斩妖特殊含义: 冷却时间减少,触发几率增加,持续时间增加 **/
+            public int[] talentLevel = new int[3];
+            /** 技能类型 **/
+            public int type { get; set; }
+            /** 技能到期时间戳 **/
+            public long skillTime { get; set; }
+            /** 技能cd变更,万分比 **/
+            public int cdTime { get; set; }
+
+            public int flag { get; set; }
+        }
+
+        /// <summary>
+        /// 玩家技能存储数据
+        /// </summary>
+        public class PlayerSkillBaseData
+        {
+            /** 技能id **/
+            public int id { get; set; }
+            /** 技能等级 **/
+            public int level { get; set; }
+            /** 是否已解锁 */
+            public bool unlock { get; set; }
+            /** 技能到期时间戳 **/
+            public long skillTime { get; set; }
+
+            public PlayerSkillBaseData(int skillId, int level, bool unlock, long skillTime)
+            {
+                this.id = skillId;
+                this.level = level;
+                this.unlock = unlock;
+                this.skillTime = skillTime;
+            }
+
+            /** 是否已解锁 */
+            public bool isUnlock() {
+                return this.unlock;
+            }
+        }
+
         /// <summary>
         /// 场景数据
         /// </summary>

+ 1 - 0
Unity/Assets/Scripts/Core/Module/CoroutineLock/CoroutineLockType.cs

@@ -12,6 +12,7 @@ namespace ET
         public const int ResourcesLoader = 7;
         public const int Login = 8;
         public const int CreatePlayer = 9;
+        public const int InitWNPlayer = 10;
 
         public const int Max = 100; // 这个必须最大
     }