/// 追击目标
        public static void SeekTarget(this SeekComponent self)
        {
            ///如果卡住在地图到达不了目标点 此计时40秒后 重置巡逻目标点
            if (self.delTime == 0)
            {
                //如果追到目标后,离目标距离小于2米,不追击
                if (self.targetDistance < 4f)
                {
                    return;
                }

                // 每间隔 resTime(100) MS 发送一次目标点坐标 消息
                self.SendSeePosition();

                self.seeTimer = TimeHelper.ClientNow();
            }

            ///精确到毫秒
            self.delTime = TimeHelper.ClientNow() - self.seeTimer + 1;

            if (self.delTime > self.resTime)
            {
                self.delTime = 0;
            }
        }
Exemple #2
0
        public override int Check(AIComponent aiComponent, AIConfig aiConfig)
        {
            long sec = TimeHelper.ClientNow() / 1000 % 15;

            if (sec >= 10)
            {
                return(0);
            }
            return(1);
        }
Exemple #3
0
 // Start is called before the first frame update
 void Start()
 {
     TipsRandom.AddRange(StaticData.configExcel.GetVertical().ManorRoleBubbleRandom);
     maxRandom          = TipsRandom.Count;
     seedRandomTips     = (int)TimeHelper.ClientNow();
     randomTips         = new System.Random(seedRandomTips);
     currAnimTimeBegin  = 0f;
     currBubbleShowTime = 0f;
     isBubbleShow       = false;
     isBeginAnimByTime  = true;
 }
Exemple #4
0
        public static void OnRead(this NetInnerComponent self, long channelId, MemoryStream memoryStream)
        {
            Session session = self.GetChild <Session>(channelId);

            if (session == null)
            {
                return;
            }

            session.LastRecvTime = TimeHelper.ClientNow();
            Game.EventSystem.Callback(self.SessionStreamDispatcherType, session, memoryStream);
        }
Exemple #5
0
            protected override void Update(RouterComponent self)
            {
                long timeNow = TimeHelper.ClientNow();

                self.RecvOuter(timeNow);
                self.RecvInner(timeNow);

                // 每秒钟检查一次
                if (timeNow - self.LastCheckTime > 1000)
                {
                    self.CheckConnectTimeout(timeNow);
                }
            }
Exemple #6
0
        /*
         * public List<MatchingItem> Get_SameGameType(int gt)
         * {
         *  List<MatchingItem> tmp_ls = new List<MatchingItem>();
         *  m_Ls_MatchingItems.ForEach ((MatchingItem mib) =>
         *  {
         *  });
         *  return tmp_ls;
         * }*/

        public override void Update()
        {
            m_Ls_NeedDel.Clear();
            for (var i = 0; i < m_Ls_MatchingItems.Count;)
            {
                var mi = m_Ls_MatchingItems[i];
                var ms = m_Ls_MatchStrategy[(int)mi.MatchStrategyType];

                if (i + ms.MaxPlayer > m_Ls_MatchingItems.Count)
                {
                    break;
                }
                var tmp_ls = m_Ls_MatchingItems.GetRange(i, ms.MaxPlayer - 1);
                if (CanMath(tmp_ls))
                {
                    i += tmp_ls.Count;
                    Match(tmp_ls);
                }
                else
                {
                    i++;
                }
            }

            for (var i = 0; i < m_Ls_MatchingItems.Count;)
            {
                var mi = m_Ls_MatchingItems[i];
                var ms = m_Ls_MatchStrategy[(int)mi.MatchStrategyType];
                var ts = TimeHelper.ClientNow() - mi.St_Time;//TimeHelper.DateTimeToUnixTimestamp_Now()-mi.St_Time;

                if (ts >= TMatching_AI_Time)
                {
                    if (mi.MatchStrategyType == EMatchStrategyType.MatchStrategy_1V1)
                    {
                        MatchAI(m_Ls_MatchingItems.GetRange(i, 1));
                    }
                    else if (mi.MatchStrategyType == EMatchStrategyType.MatchStrategy_2V2)
                    {
                        var tmp_ls = m_Ls_MatchingItems.GetRange(i, m_Ls_MatchingItems.Count - 1);
                        MatchAI(tmp_ls);
                    }
                }
            }


            foreach (var itemdel in m_Ls_NeedDel)
            {
                this.m_Ls_MatchingItems.Remove(itemdel);
            }
        }
        protected override async ETTask Run(Player entity, Actor_PlayerNetSyncToCline message)
        {
            G2C_OtherPlayerPosition packge = new G2C_OtherPlayerPosition();

            packge.DirAccount.Add(message.DirAccount);
            packge.PositionX.Add(message.PositionX);
            packge.PositionY.Add(message.PositionY);
            packge.PositionZ.Add(message.PositionZ);

            packge.RotationX.Add(message.RotationX);
            packge.RotationY.Add(message.RotationY);
            packge.RotationZ.Add(message.RotationZ);
            packge.RotationW.Add(message.RotationW);

            packge.VelocityX.Add(message.VelocityX);
            packge.VelocityY.Add(message.VelocityY);
            packge.VelocityZ.Add(message.VelocityZ);

            //Log.Info("时间: " + TimeHelper.ClientNow());
            packge.ServerTime = TimeHelper.ClientNow();

            packge.Fire.Add(message.Fire);

            packge.Bullets.Add(message.Bullets);

            //Log.Error("场景子弹数量: " + message.Bullets.Count);

            try
            {
                entity.session.Send(packge);
            }
            catch (Exception e)
            {
                //说明有人掉线了

                if (playerComponent == null)
                {
                    playerComponent = Game.Scene.GetComponent <PlayerComponent>();
                }

                //给其它玩家广播这个玩家掉线的信息
                playerComponent.removeOnePlayerLink(entity.Account).Coroutine();

                Log.Error("一名玩家离线了: " + entity.Account);
            }


            await ETTask.CompletedTask;
        }
Exemple #8
0
        public static void Check(this SessionIdleCheckerComponent self)
        {
            Session session = self.GetParent <Session>();
            long    timeNow = TimeHelper.ClientNow();

            if (timeNow - session.LastRecvTime < 30 * 1000 && timeNow - session.LastSendTime < 30 * 1000)
            {
                return;
            }

            Log.Info($"session timeout: {session.Id} {timeNow} {session.LastRecvTime} {session.LastSendTime} {timeNow - session.LastRecvTime} {timeNow - session.LastSendTime}");
            session.Error = ErrorCode.ERR_SessionSendOrRecvTimeout;

            session.Dispose();
        }
        public static void Update(this MobaControllerComponent self)
        {
            if (self.isGameStarted)
            {
                return;
            }
            long timeNow = TimeHelper.ClientNow();

            self.lastFrameCostTime = timeNow - self.lastFrameStartTime;

            //复活野怪

            //复活英雄

            //
        }
Exemple #10
0
 public static void GetUserInfo(CSEmptyAccountInfo csEmptyAccountInfo, Action <SCUserInfo> ResponseSCUserInfoCallBack)
 {
     if (StaticData.IsUsedLocalDataNotServer)
     {
         SCUserInfo scUserInfo = new SCUserInfo()
         {
             Image       = 11111,
             Name        = "TestName",
             Experience  = 1000,
             PresentTime = TimeHelper.ClientNow()
         };
         ResponseSCUserInfoCallBack(scUserInfo);
     }
     else
     {
         ProtocalManager.Instance().SendCSEmptyAccountInfo(csEmptyAccountInfo, ResponseSCUserInfoCallBack, (errorInfo) => { });
     }
 }
Exemple #11
0
        private static async ETTask PingAsync(PingComponent self)
        {
            Session session    = self.GetParent <Session>();
            long    instanceId = self.InstanceId;

            while (true)
            {
                if (self.InstanceId != instanceId)
                {
                    return;
                }

                long time1 = TimeHelper.ClientNow();
                try
                {
                    G2C_Ping response = await session.Call(self.C2G_Ping) as G2C_Ping;

                    if (self.InstanceId != instanceId)
                    {
                        return;
                    }

                    long time2 = TimeHelper.ClientNow();
                    self.Ping = time2 - time1;

                    Game.TimeInfo.ServerMinusClientTime = response.Time + (time2 - time1) / 2 - time2;

                    await TimerComponent.Instance.WaitAsync(2000);
                }
                catch (RpcException e)
                {
                    // session断开导致ping rpc报错,记录一下即可,不需要打成error
                    Log.Info($"ping error: {self.Id} {e.Error}");
                    return;
                }
                catch (Exception e)
                {
                    Log.Error($"ping error: \n{e}");
                }
            }
        }
Exemple #12
0
        private static RouterNode New(this RouterComponent self, string innerAddress, uint connectId, uint outerConn, uint innerConn, IPEndPoint syncEndPoint)
        {
            RouterNode routerNode = self.AddChild <RouterNode>();

            routerNode.ConnectId = connectId;
            routerNode.OuterConn = outerConn;
            routerNode.InnerConn = innerConn;

            routerNode.InnerIpEndPoint   = NetworkHelper.ToIPEndPoint(innerAddress);
            routerNode.SyncIpEndPoint    = syncEndPoint;
            routerNode.InnerAddress      = innerAddress;
            routerNode.LastRecvInnerTime = TimeHelper.ClientNow();

            self.ConnectIdNodes.Add(connectId, routerNode);

            routerNode.Status = RouterStatus.Sync;

            Log.Info($"router new: outerConn: {outerConn} innerConn: {innerConn} {syncEndPoint}");

            return(routerNode);
        }
        /// <summary>
        /// 所有玩家已就绪游戏开始
        /// </summary>
        /// <param name="self"></param>
        public static void GameStart(this MobaControllerComponent self)
        {
            //正式开始游戏前的准备
            Moba5V5Room      room = self.GetParent <Moba5V5Room>();
            Moba5V5Component moba = Game.Scene.GetComponent <Moba5V5Component>();

            //更改房间状态为游戏中
            moba.FreeRooms.Remove(room.Id);
            moba.GamingRooms.Add(room.Id, room);

            //更改玩家状态为游戏中
            for (int i = 0; i < room.gamers.Length; i++)
            {
                if (room.gamers[i].UserID != 0)
                {
                    Gamer gamer = room.gamers[i];
                    moba.Waiting.Remove(gamer.UserID);
                    moba.Playing.Add(gamer.UserID, room);
                }
            }

            //服务端加载游戏逻辑
            for (int i = 0; i < room.gamers.Length; i++)
            {
                room.gamers[i].AddComponent <GamerMoveComponent>();
                room.gamers[i].AddComponent <GamerPathComponent>();
                room.gamers[i].Position = new Vector3(-10, 0, -10);
            }

            //开始服务端游戏计时
            self.isGameStarted     = true;
            self.gameStartTime     = TimeHelper.ClientNow();
            self.lastFrameCostTime = self.gameStartTime;

            self.SpawnArmy().NoAwait(); //周期刷新士兵
            self.SpawnWild().NoAwait(); //刷新野怪
            room.Broadcast(new A1008_GameStart_M2C());
        }
Exemple #14
0
        public static async ETTask Send(this BenchmarkComponent self, Session session, int j)
        {
            try
            {
                await session.Call(new C2R_Ping());

                ++self.k;

                if (self.k % 100000 != 0)
                {
                    return;
                }

                long time2 = TimeHelper.ClientNow();
                long time  = time2 - self.time1;
                self.time1 = time2;
                Log.Info($"Benchmark k: {self.k} 每10W次耗时: {time} ms {session.Network.Count}");
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
Exemple #15
0
    public void OnGUI()
    {
        GUILayout.BeginVertical();
        if (GUILayout.Button("Connect", GUILayout.Width(200)))
        {
            m_Session = ClientNetWork.Create("127.0.0.1:2000");
        }

        if (GUILayout.Button("Send", GUILayout.Width(200)))
        {
            for (int i = 0; i < 100; ++i)
            {
                Ping_Msg ping_Msg = new Ping_Msg();
                ping_Msg.Time = TimeHelper.ClientNow();
                m_Session.Send(ping_Msg);
            }
        }

        if (GUILayout.Button("DisConnect", GUILayout.Width(200)))
        {
            m_Session.ShutDown();
        }
        GUILayout.EndVertical();
    }
        public void Update()
        {
            //TODO 先硬编码一波,这一块要放到行为树去处理的
            fui5V5Map = Game.Scene.GetComponent <FUIComponent>().Get(FUI5V5Map.UIPackageName) as FUI5V5Map;
            if (fui5V5Map == null)
            {
                return;
            }

            if (this.userInputComponent.QDown)
            {
                SessionComponent.Instance.Session.Send(new UserInput_SkillCmd()
                {
                    Message = "Q"
                });
                if (fui5V5Map.SkillQ_CDInfo.visible)
                {
                    return;
                }
                fui5V5Map.SkillQ_CDInfo.text    = "5";
                fui5V5Map.SkillQ_CDInfo.visible = true;
                fui5V5Map.SkillQ_Bar.self.value = 100;
                fui5V5Map.SkillQ_Bar.Visible    = true;
                fui5V5Map.SkillQ_Bar.self.TweenValue(0, 5).OnComplete(() =>
                {
                    fui5V5Map.SkillQ_CDInfo.visible = false;
                    fui5V5Map.SkillQ_Bar.Visible    = false;
                });
                m_CDComponent.TriggerCD(this.Entity.Id, "QCD");
            }

            if (this.userInputComponent.WDown)
            {
                SessionComponent.Instance.Session.Send(new UserInput_SkillCmd()
                {
                    Message = "W"
                });
                if (fui5V5Map.SkillW_CDInfo.visible)
                {
                    return;
                }
                fui5V5Map.SkillW_CDInfo.text      = "7";
                fui5V5Map.SkillW_CDInfo.visible   = true;
                fui5V5Map.SkillW_Bar.self.value   = 100;
                fui5V5Map.SkillW_Bar.self.visible = true;
                fui5V5Map.SkillW_Bar.self.TweenValue(0, 7).OnComplete(() =>
                {
                    fui5V5Map.SkillW_CDInfo.visible   = false;
                    fui5V5Map.SkillW_Bar.self.visible = false;
                });
                m_CDComponent.TriggerCD(this.Entity.Id, "WCD");
            }

            if (this.userInputComponent.EDown)
            {
                SessionComponent.Instance.Session.Send(new UserInput_SkillCmd()
                {
                    Message = "E"
                });
                if (fui5V5Map.SkillE_CDInfo.visible)
                {
                    return;
                }
                fui5V5Map.SkillE_CDInfo.text      = "10";
                fui5V5Map.SkillE_CDInfo.visible   = true;
                fui5V5Map.SkillE_Bar.self.value   = 100;
                fui5V5Map.SkillE_Bar.self.visible = true;
                fui5V5Map.SkillE_Bar.self.TweenValue(0, 10).OnComplete(() =>
                {
                    fui5V5Map.SkillE_CDInfo.visible   = false;
                    fui5V5Map.SkillE_Bar.self.visible = false;
                });
                m_CDComponent.TriggerCD(this.Entity.Id, "ECD");
            }

            if (this.userInputComponent.RDown)
            {
                SessionComponent.Instance.Session.Send(new UserInput_SkillCmd()
                {
                    Message = "R"
                });
            }

            long currentTime = TimeHelper.ClientNow();

            if (fui5V5Map.SkillQ_CDInfo.visible)
            {
                fui5V5Map.SkillQ_CDInfo.text = ((int)Math.Ceiling((double)(this.m_QCDInfo.LastTriggerTimer + this.m_QCDInfo.Interval - currentTime) / 1000))
                                               .ToString();
            }

            if (fui5V5Map.SkillW_CDInfo.visible)
            {
                fui5V5Map.SkillW_CDInfo.text = ((int)Math.Ceiling((double)(this.m_WCDInfo.LastTriggerTimer + this.m_WCDInfo.Interval - currentTime) / 1000))
                                               .ToString();
            }

            if (fui5V5Map.SkillE_CDInfo.visible)
            {
                fui5V5Map.SkillE_CDInfo.text = ((int)Math.Ceiling((double)(this.m_ECDInfo.LastTriggerTimer + this.m_ECDInfo.Interval - currentTime) / 1000))
                                               .ToString();
            }
        }
Exemple #17
0
        private static void Main(string[] args)
        {
            // 异步方法全部会回掉到主线程
            SynchronizationContext.SetSynchronizationContext(OneThreadSynchronizationContext.Instance);

            try
            {
                Game.EventSystem.Add(DLLType.Core, typeof(Game).Assembly);
                Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly());

                Options     options     = Game.Scene.AddComponent <OptionComponent, string[]>(args).Options;
                StartConfig startConfig = Game.Scene.AddComponent <StartConfigComponent, string, int>(options.Config, options.AppId).StartConfig;

                if (!options.AppType.Is(startConfig.AppType))
                {
                    Log.Error("命令行参数apptype与配置不一致");
                    return;
                }

                IdGenerater.AppId = options.AppId;

                LogManager.Configuration.Variables["appType"]       = $"{startConfig.AppType}";
                LogManager.Configuration.Variables["appId"]         = $"{startConfig.AppId}";
                LogManager.Configuration.Variables["appTypeFormat"] = $"{startConfig.AppType, -8}";
                LogManager.Configuration.Variables["appIdFormat"]   = $"{startConfig.AppId:0000}";

                Log.Info($"server start........................ {startConfig.AppId} {startConfig.AppType}");

                Game.Scene.AddComponent <TimerComponent>();
                Game.Scene.AddComponent <OpcodeTypeComponent>();
                Game.Scene.AddComponent <MessageDispatcherComponent>();

                // 根据不同的AppType添加不同的组件
                OuterConfig  outerConfig  = startConfig.GetComponent <OuterConfig>();
                InnerConfig  innerConfig  = startConfig.GetComponent <InnerConfig>();
                ClientConfig clientConfig = startConfig.GetComponent <ClientConfig>();

                // 发送普通actor消息
                Game.Scene.AddComponent <ActorMessageSenderComponent>();
                // 发送location actor消息
                Game.Scene.AddComponent <ActorLocationSenderComponent>();

                // db组件
                Game.Scene.AddComponent <DBComponent>();
                Game.Scene.AddComponent <DBCacheComponent>();
                Game.Scene.AddComponent <DBProxyComponent>();

                // location server需要的组件
                Game.Scene.AddComponent <LocationComponent>();
                // 访问location server的组件
                Game.Scene.AddComponent <LocationProxyComponent>();

                // 这两个组件是处理actor消息使用的
                Game.Scene.AddComponent <MailboxDispatcherComponent>();
                Game.Scene.AddComponent <ActorMessageDispatcherComponent>();

                // 内网消息组件
                Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                // 外网消息组件
                Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address);

                // manager server组件,用来管理其它进程使用
                Game.Scene.AddComponent <AppManagerComponent>();
                Game.Scene.AddComponent <RealmGateAddressComponent>();

                Game.Scene.AddComponent <UserComponent>();
                Game.Scene.AddComponent <UnitComponent>();
                Game.Scene.AddComponent <RoomComponent>();
                Game.Scene.AddComponent <UnitStateMgrComponent>();

                // 配置管理
                Game.Scene.AddComponent <ConfigComponent>();
                Game.Scene.AddComponent <ConsoleComponent>();
                Game.Scene.AddComponent <SessionKeyComponent>();
                Game.Scene.AddComponent <OnlineComponent>();

                long fixedUpdateInterval = (long)(EventSystem.FixedUpdateTime * 1000);
                long timing = TimeHelper.ClientNow();
                while (true)
                {
                    try
                    {
                        Thread.Sleep(1);
                        OneThreadSynchronizationContext.Instance.Update();
                        Game.EventSystem.Update();
                        if (TimeHelper.ClientNow() - timing >= fixedUpdateInterval)
                        {
                            timing += fixedUpdateInterval;
                            Game.EventSystem.FixedUpdate();
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Error(e);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
        private static async ETTask CheckAsync(RouterCheckComponent self)
        {
            Session session    = self.GetParent <Session>();
            long    instanceId = self.InstanceId;

            while (true)
            {
                if (self.InstanceId != instanceId)
                {
                    return;
                }

                await TimerComponent.Instance.WaitAsync(1000);

                if (self.InstanceId != instanceId)
                {
                    return;
                }

                long time = TimeHelper.ClientFrameTime();

                if (time - session.LastRecvTime < 7 * 1000)
                {
                    continue;
                }

                try
                {
                    long     sessionId  = session.Id;
                    uint     localConn  = 0;
                    uint     remoteConn = 0;
                    KService service    = session.AService as KService;
                    KChannel kChannel   = service.Get(sessionId);
                    if (kChannel == null)
                    {
                        Log.Warning($"not found remoteConn: {sessionId}");
                        continue;
                    }

                    localConn  = kChannel.LocalConn;
                    remoteConn = kChannel.RemoteConn;

                    IPEndPoint realAddress = self.GetParent <Session>().RemoteAddress;
                    Log.Info($"get recvLocalConn start: {self.ClientScene().Id} {realAddress} {localConn} {remoteConn}");

                    (uint recvLocalConn, IPEndPoint routerAddress) = await RouterHelper.GetRouterAddress(self.ClientScene(), realAddress, localConn, remoteConn);

                    if (recvLocalConn == 0)
                    {
                        Log.Error($"get recvLocalConn fail: {self.ClientScene().Id} {routerAddress} {realAddress} {localConn} {remoteConn}");
                        continue;
                    }

                    Log.Info($"get recvLocalConn ok: {self.ClientScene().Id} {routerAddress} {realAddress} {recvLocalConn} {localConn} {remoteConn}");

                    session.LastRecvTime = TimeHelper.ClientNow();

                    ((KService)session.AService).ChangeAddress(sessionId, routerAddress);
                }
                catch (Exception e)
                {
                    Log.Error(e);
                }
            }
        }
Exemple #19
0
 public long Now()
 {
     return(TimeHelper.ClientNow() - this.syncClientTime + syncTime);
 }
Exemple #20
0
        //--appId=1 --appType=AllServer --config=../Config/StartConfig/LocalAllServer.txt

        /*{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"),
         * "C" : [{ "_t" : "OuterConfig", "Address" : "127.0.0.1:10002", "Address2" : "127.0.0.1:10002" },
         * { "_t" : "InnerConfig", "Address" : "127.0.0.1:20000" },
         * { "_t" : "HttpConfig", "Url" : "http://*:8080/", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" },
         * { "_t" : "DBConfig", "ConnectionString" : "mongodb://localhost:27017", "DBName" : "ET" }],
         * "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }
         */
        private static void Main(string[] args)
        {
            // 异步方法全部会回掉到主线程
            SynchronizationContext.SetSynchronizationContext(OneThreadSynchronizationContext.Instance);

            try
            {
                Game.EventSystem.Add(DLLType.Model, typeof(Game).Assembly);
                Game.EventSystem.Add(DLLType.Hotfix, DllHelper.GetHotfixAssembly());

                Options     options     = Game.Scene.AddComponent <OptionComponent, string[]>(args).Options;
                StartConfig startConfig = Game.Scene.AddComponent <StartConfigComponent, string, int>(options.Config, options.AppId).StartConfig;

                if (!options.AppType.Is(startConfig.AppType))
                {
                    Log.Error("命令行参数apptype与配置不一致");
                    return;
                }

                IdGenerater.AppId = options.AppId;

                LogManager.Configuration.Variables["appType"]       = startConfig.AppType.ToString();
                LogManager.Configuration.Variables["appId"]         = startConfig.AppId.ToString();
                LogManager.Configuration.Variables["appTypeFormat"] = $"{startConfig.AppType,-8}";
                LogManager.Configuration.Variables["appIdFormat"]   = $"{startConfig.AppId:D3}";

                Log.Info($"server start........................ {startConfig.AppId} {startConfig.AppType}");

                Game.Scene.AddComponent <OpcodeTypeComponent>();
                Game.Scene.AddComponent <MessageDispatcherComponent>();

                // 根据不同的AppType添加不同的组件
                OuterConfig  outerConfig  = startConfig.GetComponent <OuterConfig>();
                InnerConfig  innerConfig  = startConfig.GetComponent <InnerConfig>();
                ClientConfig clientConfig = startConfig.GetComponent <ClientConfig>();

                switch (startConfig.AppType)
                {
                case AppType.Manager:
                    Game.Scene.AddComponent <AppManagerComponent>();
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                    Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address);
                    break;

                case AppType.Realm:
                    Game.Scene.AddComponent <MailboxDispatcherComponent>();
                    Game.Scene.AddComponent <ActorMessageDispatcherComponent>();
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                    Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address);
                    Game.Scene.AddComponent <LocationProxyComponent>();
                    Game.Scene.AddComponent <RealmGateAddressComponent>();
                    break;

                case AppType.Gate:
                    Game.Scene.AddComponent <PlayerComponent>();
                    Game.Scene.AddComponent <MailboxDispatcherComponent>();
                    Game.Scene.AddComponent <ActorMessageDispatcherComponent>();
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                    Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address);
                    Game.Scene.AddComponent <LocationProxyComponent>();
                    Game.Scene.AddComponent <ActorMessageSenderComponent>();
                    Game.Scene.AddComponent <ActorLocationSenderComponent>();
                    Game.Scene.AddComponent <GateSessionKeyComponent>();
                    break;

                case AppType.Location:
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                    Game.Scene.AddComponent <LocationComponent>();
                    break;

                case AppType.Map:
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                    Game.Scene.AddComponent <UnitComponent>();
                    Game.Scene.AddComponent <LocationProxyComponent>();
                    Game.Scene.AddComponent <ActorMessageSenderComponent>();
                    Game.Scene.AddComponent <ActorLocationSenderComponent>();
                    Game.Scene.AddComponent <MailboxDispatcherComponent>();
                    Game.Scene.AddComponent <ActorMessageDispatcherComponent>();
                    Game.Scene.AddComponent <PathfindingComponent>();
                    break;

                case AppType.Battle:
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);
                    Game.Scene.AddComponent <LocationProxyComponent>();
                    Game.Scene.AddComponent <ActorMessageSenderComponent>();
                    Game.Scene.AddComponent <ActorLocationSenderComponent>();
                    Game.Scene.AddComponent <MailboxDispatcherComponent>();
                    Game.Scene.AddComponent <ActorMessageDispatcherComponent>();
                    break;

                case AppType.AllServer:
                    // 发送普通actor消息
                    Game.Scene.AddComponent <ActorMessageSenderComponent>();

                    // 发送location actor消息
                    Game.Scene.AddComponent <ActorLocationSenderComponent>();

                    // 数据库管理组件(管理数据库连接地址,数据库名称等)
                    Game.Scene.AddComponent <DBComponent>();
                    // 数据库调用组件(调用DB数据库的组件  添加、查询、修改、删除等操作)
                    Game.Scene.AddComponent <DBProxyComponent>();

                    // location server需要的组件
                    Game.Scene.AddComponent <LocationComponent>();

                    // 访问location server的组件
                    Game.Scene.AddComponent <LocationProxyComponent>();

                    // 这两个组件是处理actor消息使用的
                    Game.Scene.AddComponent <MailboxDispatcherComponent>();
                    Game.Scene.AddComponent <ActorMessageDispatcherComponent>();

                    // 内网消息组件
                    Game.Scene.AddComponent <NetInnerComponent, string>(innerConfig.Address);

                    // 外网消息组件
                    Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address);

                    // manager server组件,用来管理其它进程使用
                    Game.Scene.AddComponent <AppManagerComponent>();
                    Game.Scene.AddComponent <RealmGateAddressComponent>();
                    Game.Scene.AddComponent <GateSessionKeyComponent>();

                    // 配置管理
                    Game.Scene.AddComponent <ConfigComponent>();

                    // 数值变化检测组件
                    Game.Scene.AddComponent <NumericWatcherComponent>();

                    // recast寻路组件
                    Game.Scene.AddComponent <PathfindingComponent>();

                    // 登陆之后保护的玩家
                    Game.Scene.AddComponent <PlayerComponent>();
                    Game.Scene.AddComponent <UnitComponent>();

                    // 进入战场后的战场组件
                    //Game.Scene.AddComponent<TankComponent>();

                    Game.Scene.AddComponent <BattleComponent>();

                    // 房间系统组件
                    Game.Scene.AddComponent <RoomComponent>();

                    Game.Scene.AddComponent <ConsoleComponent>();
                    // Game.Scene.AddComponent<HttpComponent>();
                    break;

                case AppType.Benchmark:
                    Game.Scene.AddComponent <NetOuterComponent>();
                    Game.Scene.AddComponent <BenchmarkComponent, string>(clientConfig.Address);
                    break;

                case AppType.BenchmarkWebsocketServer:
                    Game.Scene.AddComponent <NetOuterComponent, string>(outerConfig.Address);
                    break;

                case AppType.BenchmarkWebsocketClient:
                    Game.Scene.AddComponent <NetOuterComponent>();
                    Game.Scene.AddComponent <WebSocketBenchmarkComponent, string>(clientConfig.Address);
                    break;

                default:
                    throw new Exception($"命令行参数没有设置正确的AppType: {startConfig.AppType}");
                }

                long fixedUpdateInterval = (long)(EventSystem.FixedUpdateTime * 1000);
                long timing = TimeHelper.ClientNow();
                while (true)
                {
                    try
                    {
                        Thread.Sleep(1);
                        OneThreadSynchronizationContext.Instance.Update();
                        Game.EventSystem.Update();
                        if (TimeHelper.ClientNow() - timing >= fixedUpdateInterval)
                        {
                            timing += fixedUpdateInterval;
                            Game.EventSystem.FixedUpdate();
                        }
                    }
                    catch (Exception e)
                    {
                        Log.Error(e);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }
        public void Update()
        {
            if (myGamer == null) //需要先绑定本地玩家才能控制角色
            {
                return;
            }

            long time = TimeHelper.ClientNow();

            lastFrameCostTime  = time - lastFrameStartTime; //计算本地一帧的时间
            lastFrameStartTime = time;
            if (isGameStarted && moba5V5UI != null)
            {
                gameCostTime           += lastFrameCostTime; //计算本地游戏时间
                moba5V5UI.gameTime.text = $"{(int)(gameCostTime / 60000)}:{(int)((gameCostTime / 1000) % 60)}";
            }

            CheckTarget(); //检查锁定目标是否超出距离

            #region 响应用户操作
            //PC上WASD按键移动 手机摇杆移动
#if UNITY_STANDALONE
            xoff = Input.GetAxis("Horizontal"); //取横轴输入值 按A键时为-1 按D键时为1
            zoff = Input.GetAxis("Vertical");   //取纵轴输入值 按S键时为-1 按W键时为1
#elif UNITY_ANDROID
            xoff = up.upPosition.x;
            zoff = up.upPosition.y;
#elif UNITY_IPHONE
            xoff = up.upPosition.x;
            zoff = up.upPosition.y;
#endif
            if (xoff != 0 || zoff != 0)
            {
                if (isMoving == false) //开始移动 只执行一次
                {
                    touchHandler.Touch(TOUCH_KEY.Run);
                }
                if (time - StartRunTime > 200 && isMoving == true) //持续移动 反复执行
                {
                    touchHandler.OnKeyChanged(TouchEvent.Press, TOUCH_KEY.Run);
                }

                if (canMove) //在可以移动的情况下才执行
                {
                    isMoving = true;
                    movement.Set(xoff, 0f, zoff);
                    movement = movement.normalized + myGamer.Position; //计算移动方向
                    myGamer.GetComponent <GamerTurnComponent>().Turn(movement);
                    myGamer.Position = Vector3.Lerp(myGamer.Position, movement, speed * lastFrameCostTime / 1000);
                }
            }
            else
            {
                if (isMoving == true) //停止移动
                {
                    isMoving = false;
                    touchHandler.Release(TOUCH_KEY.Run);
                }
            }

            //键盘技能按键消息 不处理也释放键位
            if (Input.GetKeyDown(KeyCode.Alpha1))
            {
                touchHandler.Touch(TOUCH_KEY.Skill1);
            }
            if (Input.GetKeyUp(KeyCode.Alpha1))
            {
                touchHandler.Release(TOUCH_KEY.Skill1);
            }
            if (Input.GetKeyDown(KeyCode.Alpha2))
            {
                touchHandler.Touch(TOUCH_KEY.Skill2);
            }
            if (Input.GetKeyUp(KeyCode.Alpha2))
            {
                touchHandler.Release(TOUCH_KEY.Skill2);
            }
            if (Input.GetKeyDown(KeyCode.Alpha3))
            {
                touchHandler.Touch(TOUCH_KEY.Skill3);
            }
            if (Input.GetKeyUp(KeyCode.Alpha3))
            {
                touchHandler.Release(TOUCH_KEY.Skill3);
            }
            if (Input.GetKeyDown(KeyCode.Alpha4))
            {
                touchHandler.Touch(TOUCH_KEY.Skill4);
            }
            if (Input.GetKeyUp(KeyCode.Alpha4))
            {
                touchHandler.Release(TOUCH_KEY.Skill4);
            }
            if (Input.GetKeyDown(KeyCode.Space))
            {
                touchHandler.Touch(TOUCH_KEY.Attack);                                  //攻击按钮
            }
            if (Input.GetKeyUp(KeyCode.Space))
            {
                touchHandler.Release(TOUCH_KEY.Attack);
            }
            if (Input.GetKeyDown(KeyCode.F))
            {
                touchHandler.Touch(TOUCH_KEY.Summon1);                              //召唤师技能1
            }
            if (Input.GetKeyDown(KeyCode.F))
            {
                touchHandler.Release(TOUCH_KEY.Summon1);
            }
            if (Input.GetKeyDown(KeyCode.G))
            {
                touchHandler.Touch(TOUCH_KEY.Summon2);                              //召唤师技能2
            }
            if (Input.GetKeyDown(KeyCode.G))
            {
                touchHandler.Release(TOUCH_KEY.Summon2);
            }
            if (Input.GetKeyDown(KeyCode.B))
            {
                touchHandler.Touch(TOUCH_KEY.Summon3);                              //回城
            }
            if (Input.GetKeyDown(KeyCode.G))
            {
                touchHandler.Release(TOUCH_KEY.Summon3);
            }
            if (canMove && !isMoving)
            {
                touchHandler.Touch(TOUCH_KEY.Idle);                       //休息
            }
            #endregion
        }