Assets/Scripts/GameAnalytics_SDK/UI/LoginUI.cs
@@ -8,53 +8,148 @@
using UnityEngine.Networking;
using Protobuf;
using Google.Protobuf;
using DG.Tweening;
public class LoginUI : MonoBehaviour
{
    private AsyncOperation async = null;
    bool isLogining;
    private JsonData loginData;
    //private Button repairBtn;//修复
    //private Button noticeBtn;//公告
    private Button startBtn;//开始游戏
    private Slider progressSlider;//进度条
    private Text versionTxt;//版本号
    private Text resVersion;//资源版本号
    float waitTime;//切换场景等待时间
    [SerializeField]
    private Sprite nextSprite;
    [SerializeField]
    private Image bg;
    [SerializeField]
    private List<GameObject> other;
    // Start is called before the first frame update
    void Start()
    {
        GA_SDK_Manager.Ins.SDKInit(ChannelID.Gm.ToString());
        GA_SDK_Manager.Ins.Statistics(1);//成功加载登陆界面的人数
        AudioSourceManager.Ins.Play(AudioEnum.BGM1);
        EventCenter.Ins.RemoveAllListener();
        TDAA_SDKManager.Ins.AddListener();
        isLogining = false;
        transform.Find("Panel/Button").GetComponent<Button>().onClick.AddListener(OnClickLoginBtn);
        //repairBtn = transform.Find("Panel/RepairBtn").GetComponent<Button>();
        startBtn = transform.Find("Panel/StartBtn").GetComponent<Button>();
        if (Application.platform == RuntimePlatform.Android)
        versionTxt = transform.Find("Panel/Version").GetComponent<Text>();
        progressSlider = transform.Find("Panel/Progress").GetComponent<Slider>();
        progressSlider.value = 0;
        progressSlider.gameObject.SetActive(false);
        startBtn.onClick.AddListener(OnClickLoginBtn);
        startBtn.gameObject.SetActive(true);
        // repairBtn.onClick.AddListener(() =>
        // {
        //     OnClickResetBtn();
        // });
        //transform.Find("Panel/Button (1)").GetComponent<Button>().onClick.AddListener(OnClickResetBtn);
        if (!GameConfig.useSDK)
        {
            //GetetDeviceIMEI();//获取安卓手机IMEI
            imei0 = GA_SDK_Manager.Ins.GetDeviceId();//使用设备ID
        }
        else if (Application.platform == RuntimePlatform.WindowsEditor)
        {
            imei0 = "MyTestGemBattle123";
            if (Application.platform == RuntimePlatform.Android)
            {
                //GetetDeviceIMEI();//获取安卓手机IMEI
                imei0 = TDAA_SDKManager.Ins.GetDeviceId();//使用设备ID
            }
            else if (Application.platform == RuntimePlatform.WindowsEditor)
            {
                imei0 = "MyTestGemBattle123";
            }
            GameConfig.Imei = imei0;
        }
        versionTxt.text = "版本号:" + Application.version;
        //resVersion.text 暂时没有使用
        transform.Find("Panel/PlayerID").GetComponent<Text>().text = "玩家ID:" + imei0;
        if (GameConfig.isFirstStart)
        {
            waitTime = 0f;
            Debug.Log("初始化TDAA_SDKManager");
            TDAA_SDKManager.Ins.SDKInit(ChannelID.Gm.ToString());
            TDAA_SDKManager.Ins.Statistics(1);//成功加载登陆界面的人数
        }
        //SetStart();
    }
    private void OnEnable()
    /// <summary>
    /// 设置开始状态
    /// </summary>
    private void SetStart()
    {
        SocketEvent.Ins.Add<IMessage>((int)Opcode.LoginS2C, LoginS2C);
        startBtn.gameObject.SetActive(true);
        int resId = Mathf.FloorToInt(Mathf.Clamp01(GameConfig.GameCompletedCount));
        Image img = startBtn.transform.GetChild(0).GetComponent<Image>();
        img.sprite = Resources.Load<Sprite>($"UI/Loading/{resId}");
        img.SetNativeSize();
        if (GameConfig.GameCompletedCount > 0)
        {
            for (int i = 0; i < other.Count; ++i)
            {
                other[i].SetActive(false);
            }
            bg.sprite = nextSprite;
            bg.SetNativeSize();
        }
    }
    private void OnDestroy()
    /// <summary>
    /// 开始游戏
    /// </summary>
    void loginNext()
    {
        SocketEvent.Ins.Remove<IMessage>((int)Opcode.LoginS2C, LoginS2C);
        progressSlider.gameObject.SetActive(true);
        startBtn.gameObject.SetActive(false);
        AudioSourceManager.Ins.Play(AudioEnum.UI);
        TDAA_SDKManager.Ins.Statistics(2);//埋点
        //GameConfig.isFirstStart = false;
        StartCoroutine(loginMy());
    }
    /// <summary>
    /// 使用SDK登录
    /// </summary>
    void SDKloginNext()
    {
        GameConfig.Imei = SDKManager.ins.sdk.uid;
        Debug.Log("SDK登录,修改Imei:" + GameConfig.Imei);
        transform.Find("Panel/PlayerID").GetComponent<Text>().text = "玩家ID:" + GameConfig.Imei;
        loginNext();
    }
    #region 获得安卓手机上的IMEI号
    public string imei0 = "";
    public string imei1 = "";
    public string meid = "";
    /// <summary>
    /// 已弃用
    /// </summary>
    void GetetDeviceIMEI()
    {
        var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
@@ -69,178 +164,74 @@
    #endregion
    private void OnClickLoginBtn()
    private void OnClickResetBtn()
    {
        LoginRequest();
        GA_SDK_Manager.Ins.Statistics(2);//埋点
        if (!GameConfig.useSDK)
        {
            Debug.LogError("清空了所有数据");
            PlayerPrefs.DeleteAll();
            TDAA_SDKManager.Ins.Reset();
        }
    }
    /// <summary>
    /// 登录请求处理
    /// </summary>
    /// <param name="req"></param>
    private void LoginRequest()
    private void OnClickLoginBtn()
    {
        if (!isLogining)
        {
            Debug.Log("登录");
            if (Application.platform == RuntimePlatform.WindowsEditor)
            {
                Debug.Log("编辑器直接登录");
                GA_SDK_Manager.Ins.Login(imei0);
                GA_SDK_Manager.Ins.Statistics(3);//埋点
                //StartCoroutine(loginMy());
                StartCoroutine(LoadScene());
                return;
            }
            isLogining = true;
            string url = GameConfig.IsDebug ? GameConfig.TestLoginUrl : GameConfig.LoginUrl;
            JsonData data = new JsonData();
            data["account"] = imei0;
            data["password"] = "123456";
            data["channelid"] = (int)ChannelID.Gm;
            byte[] postBytes = System.Text.Encoding.Default.GetBytes(data.ToJson());
            StartCoroutine(Post(url, postBytes));
        }
    }
    IEnumerator Post(string url, byte[] postBytes)
    {
        UnityWebRequest request = UnityWebRequest.Post(url, "POST");
        request.uploadHandler = new UploadHandlerRaw(postBytes);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json");
        yield return request.SendWebRequest();
        if (request.isDone)
        {
            string text = request.downloadHandler.text;
            loginData = JsonMapper.ToObject(text);
            if (loginData.Keys.Contains("errorcode"))
            if (GameConfig.isFirstStart)
            {
                JsonData errorData = loginData["errorcode"];
                isLogining = false;
                CommonDebugHelper.DebugSocket(int.Parse(errorData.ToString()));
                yield break;
            }
            if (!string.IsNullOrEmpty(text))
            {
                EventCenter.Ins.Add<bool>((int)KTGMGemClient.EventType.MasterSocketConnectResult, MasterSocketConnectSuccess);
                MasterSocket.Ins.MasterIp = loginData["masterip"].ToString();
                MasterSocket.Ins.MasterPort = int.Parse(loginData["masterport"].ToString());
                MasterSocket.Ins.StartConnect();
                // System.DateTime dt = GameUtils.GetTime(loginData["timestamp"].ToString());
                // GameConfig.dateTime = dt;
                // GameConfig.timeSpan = dt - System.DateTime.Now;
            }
            else
            {
                isLogining = false;
                //UIManager.Instance.ShowWarningWind("没有登录数据返回,text:" + text);
                //CommonDebugHelper.DebugError("--------------------- 没有登录数据返回 ---------------------text:" + text);
            }
        }
        else
        {
            isLogining = false;
            //UIManager.Instance.ShowWarningWind(request.error);
            //CommonDebugHelper.DebugError("登录失败 request.error" + request.error);
        }
    }
    private void MasterSocketConnectSuccess(bool res)
    {
        if (res)
        {
            Login_C2S login = new Login_C2S();
            login.Username = loginData["username"].ToString();
            login.Channel = (int)ChannelID.Gm;
            login.SessionKey = loginData["sessionKey"].ToString();
            MasterSocket.Ins.SendMsg(Opcode.LoginC2S, login);
        }
        else
        {
            CommonDebugHelper.DebugError("Socket 链接失败了");
        }
    }
    private void LoginS2C(IMessage msg)
    {
        Login_S2C login = (Login_S2C)msg;
        if (login.Errorcode == 0)
        {
            Debug.Log("--------------------- 登录成功 ---------------------");
            //UserDataMsg userData = login.Userdata;
            GA_SDK_Manager.Ins.Login(imei0);
            GA_SDK_Manager.Ins.Statistics(3);//埋点
            //StartCoroutine(loginMy());
            StartCoroutine(LoadScene());
        }
        else
        {
            CommonDebugHelper.DebugSocket(login.Errorcode);
            isLogining = false;
        }
    }
    IEnumerator LoadScene()
    {
        async = SceneManager.LoadSceneAsync(GameConfig.NextSceneName);
        async.allowSceneActivation = true;
        /*while (!async.isDone)
        {
            if (async.progress < 0.9f)
                progressValue = async.progress;
            else
                progressValue = 1.0f;
            slider.value = progressValue;
            progress.text = (int)(slider.value * 100) + " %";
            if (async.progress >= 0.89)
            {
                Debug.Log("进展时间分别是:" + async.progress + "," + totalTime);
                if( totalTime >= 3.0f )
                    async.allowSceneActivation = true;
                progress.text = "按任意键继续";
                if (Input.anyKeyDown)
                // CoderM: 在这里要使用SDK来进行登录了
                if (GameConfig.useSDK)
                {
                    async.allowSceneActivation = true;
                    Debug.Log("使用SDK来进行登录了");
                    //设置login的回调
                    SDKCallBack.ins.setNextAction("login", SDKloginNext);
                    SDKManager.ins.sdk.login();
                }
                else
                {
                    Debug.Log("没有使用SDK");
                    //没有使用SDK
                    loginNext();
                }
            }
            else
            {
                Debug.Log("重玩");
                progressSlider.gameObject.SetActive(true);
                startBtn.gameObject.SetActive(false);
                AudioSourceManager.Ins.Play(AudioEnum.UI);
                TDAA_SDKManager.Ins.OnClickRestartBtn();//重玩
                StartCoroutine(loginMy());
            }
            //yield return null;
        }*/
        yield return null;
    }
        }
    }
    IEnumerator loginMy()
    {
        progressSlider.value = 0.0f;
        System.GC.Collect();
        DOTween.Clear();
        Debug.Log("开始清理GC,清理DOTween");
        yield return new WaitForSeconds(waitTime);
        int displayProgress = 0;
        int toProgress = 0;
        AsyncOperation op = SceneManager.LoadSceneAsync(GameConfig.NextSceneName);
        AsyncOperation op = SceneManager.LoadSceneAsync("LoadingScene");
        // AsyncOperation op = SceneManager.LoadSceneAsync(GameConfig.NextSceneName);
        op.allowSceneActivation = false;
        while (op.progress < 0.9f) //此处如果是 <= 0.9f 则会出现死循环所以必须小0.9
        {
            toProgress = (int)op.progress * 100;
            toProgress = (int)(op.progress * 100);
            while (displayProgress < toProgress)
            {
                ++displayProgress;
                progressSlider.value = displayProgress * 0.01f;
                SetLoadingPercentage(displayProgress);
                yield return new WaitForEndOfFrame();//ui渲染完成之后
            }
@@ -249,6 +240,8 @@
        while (displayProgress < toProgress)
        {
            ++displayProgress;
            progressSlider.value = displayProgress * 0.01f;
            SetLoadingPercentage(displayProgress);
            yield return new WaitForEndOfFrame();
        }
@@ -259,8 +252,7 @@
    private void SetLoadingPercentage(int displayProgress)
    {
        CommonDebugHelper.Debug($"当前进度{displayProgress}%");
        //CommonDebugHelper.Debug($"当前进度{displayProgress}%");
    }
}