Unity3d的Log系统重构

编者注

由于要重写Unity3d的Log系统,变更为自定义方式,按照Log4j的显示的内容方法

Unity3d的Log

一般在Unity3d中编写日志入下代码

Debug.Log("hello message");

在UnityEditor和UnityEngine当中除了打印message以外,还会打印堆栈信息。性能低下,根据有经验的人讲解,在客户端打印大量日志,会严重降低渲染性能。

Unity3d的Debug原理

原理分析

在Rider中查看Debug.Log的实现,我们可以看到如下内容

public static void Log(object message)
{
    Debug.unityLogger.Log(LogType.Log, message);
}

我们能够了解到,实质是调用了Debug.unityLogger

public static ILogger unityLogger
{
    get
    {
        return Debug.s_Logger;
    }
}

unityLogger实质是调用了Debug.s_Logger,而在下面就定义了s_Logger的实现

internal static ILogger s_Logger = (ILogger) new Logger((ILogHandler) new DebugLogHandler());

DebugLogHandler实质是调用的静态方法,根据UnityEngine各个平台的实现进行调用

using System;
using System.Runtime.CompilerServices;
using UnityEngine.Scripting;

namespace UnityEngine
{
  internal sealed class DebugLogHandler : ILogHandler
  {
    [ThreadAndSerializationSafe]
    [GeneratedByOldBindingsGenerator]
    [MethodImpl(MethodImplOptions.InternalCall)]
    internal static extern void Internal_Log(LogType level, string msg, [Writable] Object obj);

    [ThreadAndSerializationSafe]
    [GeneratedByOldBindingsGenerator]
    [MethodImpl(MethodImplOptions.InternalCall)]
    internal static extern void Internal_LogException(Exception exception, [Writable] Object obj);

    public void LogFormat(LogType logType, Object context, string format, params object[] args)
    {
      DebugLogHandler.Internal_Log(logType, string.Format(format, args), context);
    }

    public void LogException(Exception exception, Object context)
    {
      DebugLogHandler.Internal_LogException(exception, context);
    }
  }
}

最终实现仅仅只有两个方法

internal static extern void Internal_Log(LogType level, string msg, [Writable] Object obj);
internal static extern void Internal_LogException(Exception exception, [Writable] Object obj);

代码测试

Debug.unityLogger.Log(LogType.Log,"hello message");

UnityEditor打印

hello me
<think>我们正在讨论Unity的零基础入门学习。根据用户需求,我们需要提供清晰的学习路径和资源推荐。根据引用[1][2][3]:提供了Unity官网和下载教程,建议使用LTS版本,并推荐了siki学院的课程资料。引用[4]:提供了一套系统Unity学习路线。引用[5]:提到了一些UnityAPI的使用(如音频播放),但用户目前处于零基础阶段,暂时不需要深入API。因此,我们规划一个循序渐进的学习路径:1.环境搭建:下载安装UnityHub和Unity编辑器(推荐LTS版本),安装VS2019作为代码编辑器。2.基础知识:了解Unity界面、基本概念(游戏对象、组件、场景等)。3.脚本编程:学习C#基础,编写简单脚本控制游戏对象。4.项目实践:通过小项目(如RollABall)巩固知识。5.系统学习:按照学习路线逐步深入。具体步骤:第一步:环境搭建-访问Unity官网(中国用户建议使用unity.cn)下载UnityHub。-在UnityHub中安装一个UnityLTS版本(如2021LTS)。-安装VS2019(可在siki学院的课程资料中获取下载链接,避免版本兼容问题)。第二步:学习资源-官方教程:UnityLearn平台(https://learn.unity.com/)有免费入门课程。-推荐课程:siki学院的《Unity2021零基础入门学习教程-RollABall》(引用[1][2][3]均提到)。-中文教程:知乎专栏(https://zhuanlan.zhihu.com/p/433418045)提供Unity下载和安装指南。第三步:基础知识学习-界面:Scene视图、Game视图、Hierarchy、Project、Inspector等窗口。-概念:GameObject(游戏对象)、Component(组件)、Prefab(预制体)、Scene(场景)等。-操作:创建物体、添加组件(如Transform、Rigidbody、Collider等)、保存场景。第四步:C#编程基础-变量、条件语句、循环、函数、类。-Unity脚本生命周期(Awake,Start,Update等)。-常用API:Transform、GameObject、Input等类的使用。第五步:第一个项目-跟随RollABall教程创建一个小球控制游戏,学习:*创建基本3D物体*编写移动脚本(使用Input和Transform)*物理系统(Rigidbody、碰撞检测)*收集物品(触发检测)*创建UI显示分数第六步:扩展学习-2D游戏开发:精灵、瓦片地图、2D物理。-动画系统:Animator组件、状态机。-粒子系统:制作简单特效。-音频系统:AudioSource组件(引用[5]提到PlayOneShot方法,可在此阶段学习)。注意事项:-学习过程中多动手实践,尝试修改代码和参数观察效果。-遇到问题查阅Unity官方文档(https://docs.unity.cn/)或社区(如Unity中文论坛)。最后,学习是一个循序渐进的过程,不要急于求成,打好基础是关键。根据要求,生成相关问题:</think>### Unity零基础入门学习方法与教程推荐 #### 一、学习路径规划(循序渐进) 1. **环境搭建**(1-2天): - 安装Unity Hub:通过[Unity中国官网](https://unity.cn)下载安装器 - 选择**LTS长期支持版**(如2021.3 LTS)[^3] - 安装VS2019:推荐使用[siki学院《RollABall》课程资料包](https://zhuanlan.zhihu.com/p/433418045)中的版本[^1][^2] 2. **核心基础**(1-2周): ```mermaid graph LR A[界面认知] --> B[场景/游戏对象] B --> C[组件系统] C --> D[C#脚本编程] D --> E[物理系统] ``` - 必学概念:GameObject、Transform、Collider、Rigidbody、Prefab - 脚本基础:`Start()`/`Update()`生命周期、变量声明、Input控制 3. **实战项目**(推荐顺序): | 项目类型 | 推荐教程 | 技能目标 | |---|---|----| | 3D控制 | RollABall[^1] | 移动控制/碰撞检测 | | 2D平台 | Unity官方2D教程 | 精灵动画/瓦片地图 | | UI系统 | UGUI官方课程 | 界面交互/事件响应 | #### 二、高质量学习资源 1. **系统化教程**: - [Unity Learn平台](https://learn.unity.com):官方免费课程(需注册) - [siki学院《Unity2021零基础入门》](https://zhuanlan.zhihu.com/p/433418045):含完整项目实战[^1][^3] - [Unity从0到1系统学习路线](https://example.com/unity-roadmap):全面知识图谱(参考引用[^4]) 2. **文档与社区**: - 官方手册:[Unity User Manual](https://docs.unity3d.com/Manual) - 问题求解:[Unity中文论坛](https://forum.unity.cn) - 代码参考:[Unity API文档](https://docs.unity3d.com/ScriptReference) 3. **关键技巧**: - 调试技巧:`Debug.Log()`输出 + 控制台错误分析 - 版本管理:使用Git + .gitignore(避免库文件冲突) - 性能意识:早期关注`Stats`面板帧率指标 #### 三、高效学习建议 1. **开发习惯**: - 每天1小时编码(优于周末突击) - 每完成小功能即时测试 - 使用注释规范:`// 移动控制 v1.0 - 2023/08` 2. **避坑指南**: - 避免使用Beta版Unity(稳定性差)[^3] - 勿直接复制复杂项目(从核心功能拆解) - 数学基础弱时先补向量运算:$\vec{v} = (x,y,z)$ 3. **进阶衔接**: ```csharp // 音频播放示例(引用[^5]) void PlaySound(){ audioSource.PlayOneShot(audioClip); // 不打断当前音频的播放方式 } ``` 掌握此类API后,可深入[Unity Asset Store]研究插件机制 > **重要提示**:完成首个项目后,务必重构代码,尝试优化方案(如将魔法数字替换为常量)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值