Unity3D研究院之IOS&Android收集Log文件(六十二)

来源:互联网 发布:畅销小说排行榜前网络 编辑:程序博客网 时间:2024/06/03 08:37

开发项目的时候尤其在处理与服务器交互这块,如果服务端程序看不到客户端请求的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,不然就直接闪退了。


0 0
原创粉丝点击