編輯:關於Android編程
我們在開發中,往往會覺得unity自帶的日志系統不是那麼好用,比如,不能篩選日志,不能打印在屏幕上,想生成自己的日志文件,等等等等的需求,這時候就需要自己來擴展編輯器的相關功能了。我這裡實現的需求比較簡單,就是給日志加了個key,可以根據這個key來對暫時不需要顯示的日志進行過濾,還有就是將我們的日志打印到屏幕上去。
打印屏幕的類參考了由 Jeremy Hollingsworth 和 Simon Waite 這2人寫的一個 DebugConsole.cs 類,不過他們2個的版本實在是太早了,而且還有錯誤和啰嗦的地方,有興趣的話你可以去搜來看看。外加老外真的很喜歡用while循環呀,好多能用for的地方也是while,是因為這樣寫字比較少嗎?看來大家都是懶癌晚期患者,(:зゝ∠)
一直犯懶,終於把它給寫了。。。有時間我也給它扔到 github 上去。。。
外加如果想要輸出日志文件,或者其它什麼功能的,你就自己加就好了,我當前的需求還是挺簡單的~
效果如圖:
這樣用
或者這樣用
一共由2個類組成,一個負責控制台打印,一個負責屏幕打印<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace GameFramework
{
///
using UnityEngine; using System.Collections; using System.Collections.Generic; namespace GameFramework { public class DebugConsole : MonoBehaviour { ////// 日志顏色枚舉 /// public enum LogColor { NORMAL, WARNING, ERROR } ////// 普通顏色 /// public Color normalColor = Color.green; ////// 警告顏色 /// public Color warningColor = Color.yellow; ////// 錯誤顏色 /// public Color errorColor = Color.red; ////// 第一個gui組件 /// public GameObject debugGui = null; ////// 默認gui位置 /// public Vector3 defaultGuiPosition = new Vector3(0.01f, 0.98f, 0f); ////// 顯示最大日志數 /// public int maxLogs = 30; ////// 行間距 /// public float lineSpacing = 0.03f; ////// 能拖動 /// public bool draggable = true; ////// 是否顯示 /// public bool visible = true; // 集合 private Listm_guiList = new List (); private List m_logList = new List (); private List m_colorList = new List (); // 單例 private static DebugConsole s_instance = null; /// /// 獲取單例 /// ///單例 public static DebugConsole GetInstance() { if (s_instance == null) { s_instance = (DebugConsole)FindObjectOfType(typeof(DebugConsole)); if (s_instance == null) { GameObject console = new GameObject(); console.name = "DebugConsole"; console.AddComponent(); s_instance = (DebugConsole)FindObjectOfType(typeof(DebugConsole)); } } return s_instance; } void Awake() { DontDestroyOnLoad(this); s_instance = this; this.InitGuis(); } private void InitGuis() { // 初始化第一個gui if (debugGui == null) { debugGui = new GameObject(); debugGui.name = "DebugGUI(0)"; debugGui.transform.SetParent(this.transform, false); debugGui.transform.position = defaultGuiPosition; GUIText gt = debugGui.AddComponent (); m_guiList.Add(gt); } // 創建其它的gui Vector3 position = debugGui.transform.position; int guiCount = 1; while (guiCount < maxLogs) { position.y -= lineSpacing; GameObject clone = (GameObject)Instantiate(debugGui, position, transform.rotation); clone.name = string.Format("DebugGUI({0})", guiCount); GUIText gt = clone.GetComponent (); m_guiList.Add(gt); position = clone.transform.position; ++guiCount; } // 設置父節點 guiCount = 0; while (guiCount < m_guiList.Count) { GUIText temp = (GUIText)m_guiList[guiCount]; temp.transform.parent = debugGui.transform; ++guiCount; } } // 連接到手指 private bool connectedToMouse = false; void Update() { // 拖拽移動 if (draggable) { if (Input.GetMouseButtonDown(0)) { if (connectedToMouse) { connectedToMouse = false; } else if (connectedToMouse == false && debugGui.GetComponent ().HitTest((Vector3)Input.mousePosition)) { connectedToMouse = true; } } if (connectedToMouse) { float posX = Input.mousePosition.x / Screen.width; float posY = Input.mousePosition.y / Screen.height; debugGui.transform.position = new Vector3(posX, posY, 0F); } } } /// /// 清屏 /// private void ClearScreen() { // 對象還沒創建全的情況下不清 if (m_guiList.Count < maxLogs) return; int count = 0; while (count < m_guiList.Count) { GUIText gt = m_guiList[count]; gt.text = ""; ++count; } } ////// 精簡多出來的消息 /// private void Prune() { if (m_logList.Count <= maxLogs) return; int diff = m_logList.Count - maxLogs; m_logList.RemoveRange(0, diff); m_colorList.RemoveRange(0, diff); } ////// 顯示 /// private void Display() { if (visible) { // 先嘗試是否能精簡 this.Prune(); // gui不夠 if (m_guiList.Count < maxLogs) return; // 顯示 int guiCount = 0; while (guiCount < m_guiList.Count && guiCount < m_logList.Count) { GUIText gt = m_guiList[guiCount]; // 文本 gt.text = m_logList[guiCount]; // 顏色 LogColor lc = m_colorList[guiCount]; switch (lc) { case LogColor.NORMAL: { gt.material.color = this.normalColor; } break; case LogColor.WARNING: { gt.material.color = this.warningColor; } break; case LogColor.ERROR: { gt.material.color = this.errorColor; } break; } // 循環 ++guiCount; } } else { // 清屏 this.ClearScreen(); } } // 加日志 private void AddLog(string log, LogColor color = LogColor.NORMAL) { m_logList.Add(log); m_colorList.Add(color); this.Display(); } // 清日志 private void ClearLog() { m_logList.Clear(); m_colorList.Clear(); this.ClearScreen(); } ////// 日志 /// ///日志 public static void Log(string log) { DebugConsole.GetInstance().AddLog(log, LogColor.NORMAL); } ////// 警告 /// ///日志 public static void LogWarning(string log) { DebugConsole.GetInstance().AddLog(log, LogColor.WARNING); } ////// 錯誤 /// ///日志 public static void LogError(string log) { DebugConsole.GetInstance().AddLog(log, LogColor.ERROR); } ////// 清除 /// public static void Clear() { DebugConsole.GetInstance().ClearLog(); } } }
測試類:
using UnityEngine; using System.Collections; using GameFramework; public class Test : MonoBehaviour { public bool screenDisplay = false; // Use this for initialization void Start() { DebugMgr.Log("開始了"); } private int m_count = 0; void OnGUI() { if (GUI.Button(new Rect(500, 0, 100, 100), "加log")) { DebugMgr.screenDisplay = screenDisplay; string log = "count = " + m_count; DebugMgr.Log(log); DebugMgr.LogWarning(log); DebugMgr.LogError(log); ++m_count; } } }
友情提示一下,你可能發現了,現在你左鍵點一下 Console 窗口下的日志,系統會給你跳轉到 DebugMgr 類裡,而不是真正打日志的地方,想要解決這個問題也很簡單。你就把這2個類編譯封裝成一個單獨的c#類庫項目,生成dll後,再導入項目中就可以了,這樣 unity 在追蹤程序的堆棧調用時,跳轉的位置就會指向你真正打日志的地方了,輕松又愉快~
android開發,除了使用原生態的開發方式之外,還可以使用java+html+javascript混合開發的方式來開發,這樣可以節省大量的開發時間,同時還可以使不同設備
Android應用開發的一項重要內容就是界面開發。對於用戶來說,不管APP包含的邏輯多麼復雜,功能多麼強大,如果沒有提供友好的圖形交互界面,將很難吸引最終用戶。作為一個程
1. Media Framework 層次(1) 應用層Music, VideoPlayer(2) JAVA層MediaPlayer : frameworks/base/
使用自定義Animation,實現View的左右搖擺效果,如圖所示:代碼很簡單,直接上源碼activity_maini.xml布局文件:<?xml vers