/// <summary>
    /// 同步客户端位置给服务器
    /// </summary>
    public override void SyncPos()
    {
        Log.Net("SyncPos");
        var me     = gameObject;
        var pos    = me.transform.position;
        var dir    = (int)me.transform.localRotation.eulerAngles.y;
        var intPos = NetworkUtil.ConvertPos(pos);

        var ainfo = AvatarInfo.CreateBuilder();

        ainfo.Id = GetComponent <NpcAttribute>().GetNetView().GetServerID();
        var change = false;
        //第一个报文用于建立UDP连接 在UDP连接没有建立起来一直走TCP

        /*
         * if (frameId == 1)
         * {
         *  change = true;
         * }
         */

        var diffTime = Time.time - lastSyncTime;

        //防止UDP连接断开

        /*
         * if (dir != lastInfo.Dir)
         * {
         *   ainfo.Dir = dir;
         *   lastInfo.Dir = ainfo.Dir;
         *   change = true;
         * }
         */

        if (mv != null)
        {
            //摇杆的操控命令 如何处理命令是服务器的问题
            var vcontroller     = mv.vcontroller;
            var h               = vcontroller.inputVector.x; //CameraRight
            var v               = vcontroller.inputVector.y; //CameraForward
            var camRight        = CameraController.Instance.camRight;
            var camForward      = CameraController.Instance.camForward;
            var targetDirection = h * camRight + v * camForward;
            var mdir            = targetDirection.normalized;
            var speed           = attr.GetSpeed();
            var sp              = mdir * speed;
            var SpeedX          = Util.GameToNetNum(sp.x);
            var SpeedY          = Util.GameToNetNum(sp.z);
            Log.Sys("MoveSpeed:" + SpeedX + ":" + SpeedY + ":" + h + ":" + v + ":" + targetDirection + ":" + camRight + ":" + camForward);
            if (SpeedX != lastInfo.SpeedX || SpeedY != lastInfo.SpeedY)
            {
                ainfo.SpeedX    = SpeedX;
                ainfo.SpeedY    = SpeedY;
                lastInfo.SpeedX = ainfo.SpeedX;
                lastInfo.SpeedY = ainfo.SpeedY;
                change          = true;
            }

            if (diffTime > 1 ||
                (intPos[0] != lastInfo.X || intPos[1] != lastInfo.Y || intPos[2] != lastInfo.Z ||
                 dir != lastInfo.Dir ||
                 SpeedX != lastInfo.SpeedX ||
                 SpeedY != lastInfo.SpeedY)
                )
            {
                lastSyncTime = Time.time;

                ainfo.X      = intPos[0];
                ainfo.Y      = intPos[1];
                ainfo.Z      = intPos[2];
                ainfo.Dir    = dir;
                ainfo.SpeedX = SpeedX;
                ainfo.SpeedY = SpeedY;

                change = true;

                lastInfo.X   = ainfo.X;
                lastInfo.Y   = ainfo.Y;
                lastInfo.Z   = ainfo.Z;
                lastInfo.Dir = ainfo.Dir;

                lastInfo.SpeedX = ainfo.SpeedX;
                lastInfo.SpeedY = ainfo.SpeedY;
            }
        }

        if (change)
        {
            var cg = CGPlayerCmd.CreateBuilder();
            cg.Cmd = "UpdateData";

            /*
             * var nf = frameId++;
             * var find = false;
             * if (low && nf > 127)
             * {
             *  find = true;
             *  low = false;
             * }
             * else if (nf == 0)
             * {
             *  find = true;
             *  low = true;
             * }
             * //ainfo.FrameID = nf;
             */

            cg.AvatarInfo = ainfo.Build();
            //cg.FrameId = NetworkScene.Instance.GetPredictServerTimeForNet();
            NetworkUtil.Broadcast(cg);

            /*
             * //报文区间变化 TCP稳定通知
             * if (find)
             * {
             * }
             * else
             * {
             *  NetworkUtil.BroadcastUDP(cg);
             * }
             */
        }
    }
    public override void SyncAttribute()
    {
        Log.Net("SyncAttribute");
        var me     = gameObject;
        var pos    = me.transform.position;
        var dir    = (int)me.transform.localRotation.eulerAngles.y;
        var meAttr = me.GetComponent <NpcAttribute>();
        var intPos = NetworkUtil.ConvertPos(pos);

        var ainfo  = AvatarInfo.CreateBuilder();
        var change = false;

        var intNetSpeed = (int)(meAttr.NetSpeed * 100);

        if (intNetSpeed != lastInfo.NetSpeed)
        {
            ainfo.NetSpeed = intNetSpeed;
            change         = true;

            lastInfo.NetSpeed = ainfo.NetSpeed;
        }
        var intThrowSpeed = (int)(meAttr.ThrowSpeed * 100);

        if (intThrowSpeed != lastInfo.ThrowSpeed)
        {
            ainfo.ThrowSpeed = intThrowSpeed;
            change           = true;

            lastInfo.ThrowSpeed = ainfo.ThrowSpeed;
        }
        var intJumpSpeed = (int)(meAttr.JumpForwardSpeed * 100);

        if (intJumpSpeed != lastInfo.JumpForwardSpeed)
        {
            ainfo.JumpForwardSpeed = intJumpSpeed;
            change = true;

            lastInfo.JumpForwardSpeed = ainfo.JumpForwardSpeed;
        }

        if (!string.Equals(meAttr.userName, lastInfo.Name))
        {
            ainfo.Name    = meAttr.userName;
            change        = true;
            lastInfo.Name = ainfo.Name;
        }

        if (lastInfo.Job != ServerData.Instance.playerInfo.Roles.Job)
        {
            ainfo.Job    = ServerData.Instance.playerInfo.Roles.Job;
            change       = true;
            lastInfo.Job = ainfo.Job;
        }

        if (change)
        {
            var cg = CGPlayerCmd.CreateBuilder();
            cg.Cmd        = "UpdateData";
            cg.AvatarInfo = ainfo.Build();
            NetworkUtil.Broadcast(cg);
        }
    }