zoukankan      html  css  js  c++  java
  • Unity3D研究院之IOS&Android收集Log文件(六十二)

    开发项目的时候尤其在处理与服务器交互这块,如果服务端程序看不到客户端请求的Log信息,那么无法修改BUG。在Windows上Unity会自动讲Log文件写入本地,但是在IOS和Android上确没有这个功能,所以我想了个办法,把Log信息写在手机的客户端里。把如下脚本挂在任意游戏对象上即可。

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    
    public class OutLog : MonoBehaviour 
    {
      static List<string> mLines = new List<string>();
      static List<string> mWriteTxt = new List<string>();
      private string outpath;
      void Start () {
        //Application.persistentDataPath Unity中只有这个路径是既可以读也可以写的。
        outpath = Application.persistentDataPath + "/outLog.txt";
        //每次启动客户端删除之前保存的Log
        if (System.IO.File.Exists (outpath)) {
          File.Delete (outpath);
        }
        //在这里做一个Log的监听
        Application.RegisterLogCallback(HandleLog);
        //一个输出
        Debug.Log("xuanyusong");
      }
    
      void Update () 
      {
        //因为写入文件的操作必须在主线程中完成,所以在Update中哦给你写入文件。
        if(mWriteTxt.Count > 0)
        {
          string[] temp = mWriteTxt.ToArray();
          foreach(string t in temp)
          {
            using(StreamWriter writer = new StreamWriter(outpath, true, Encoding.UTF8))
            {
              writer.WriteLine(t);
            }
            mWriteTxt.Remove(t);
          }
        }
      }
    
      void HandleLog(string logString, string stackTrace, LogType type)
      {
        mWriteTxt.Add(logString);
        if (type == LogType.Error || type == LogType.Exception) 
        {
          Log(logString);
          Log(stackTrace);
        }
      }
    
      //这里我把错误的信息保存起来,用来输出在手机屏幕上
      static public void Log (params object[] objs)
      {
        string text = "";
        for (int i = 0; i < objs.Length; ++i)
        {
          if (i == 0)
          {
            text += objs[i].ToString();
          }
          else
          {
            text += ", " + objs[i].ToString();
          }
        }
        if (Application.isPlaying)
        {
          if (mLines.Count > 20) 
          {
            mLines.RemoveAt(0);
          }
          mLines.Add(text);
    
        }
      }
    
      void OnGUI()
      {
        GUI.color = Color.red;
        for (int i = 0, imax = mLines.Count; i < imax; ++i)
        {
          GUILayout.Label(mLines[i]);
        }
      }
    }

    如果在Mac上,可以借助同步推类似的工具来把你的Log文件取出来。


    Android上取法类似。

    此时如果客户端报错了怎么办?如果你是在IOS平台,强烈建议把PlayerSetting里面的Script Call Optimization设置成Slow and Safe,这样比如遇到空指针 或者 数组越界这样的错误,程序是不会直接闪退的。(Android上不用设置)这里我创造一个数组越界的错误。

    void Start () {
        int []test = new int[1];
        test[2] = 0;
      }

     那么在手机上报错以后,会自动将错误信息的堆栈打印在屏幕上。前提一定要设置Script Call Optimization设置成Slow and Safe,不然就直接闪退了。


  • 相关阅读:
    通过HttpListener实现简单的Http服务
    WCF心跳判断服务端及客户端是否掉线并实现重连接
    NHibernate初学六之关联多对多关系
    NHibernate初学五之关联一对多关系
    EXTJS 4.2 资料 跨域的问题
    EXTJS 4.2 资料 控件之Grid 那些事
    EXTJS 3.0 资料 控件之 GridPanel属性与方法大全
    EXTJS 3.0 资料 控件之 Toolbar 两行的用法
    EXTJS 3.0 资料 控件之 combo 用法
    EXTJS 4.2 资料 控件之 Store 用法
  • 原文地址:https://www.cnblogs.com/nafio/p/9137510.html
Copyright © 2011-2022 走看看