写Unity的C++插件时非常不方便的一点就是,在Unity调试的时候无法显示log。

以下代码是我在编写HoloLens插件时用到的代码。时间过去好久了,今天翻到了做个记录。(万能的指针)

UnityDebug.h

#include"string.h" #include "stdio.h" #include <stdarg.h> #define UnityLog(acStr, ...)  Debug::L(acStr, ##__VA_ARGS__); //create by keefor on 20190717 //C++ Call C# class Debug { public:     static void(*Log)(char* message, int iSize);     static void L(char* msg, ...); };// C# call C++ extern "C" _declspec(dllexport) void InitCSharpDelegate(void(*Log)(char* message, int iSize));

UnityDebug.cpp

#include "UnityDebug.h"
//create by keefor on 20190717
void(*Debug::Log)(char* message, int iSize);
void Debug::L(char* fmt, ...) {
    if(Debug::Log==NULL)return;
    char acLogStr[512];// = { 0 };
    va_list ap;
    va_start(ap, fmt);
    vsprintf(acLogStr, fmt, ap);
    va_end(ap);
    Debug::Log(acLogStr, strlen(acLogStr));
extern "C"     void InitCSharpDelegate(void(*Log)(char* message, int iSize)) {
    Debug::Log = Log;
    //UnityLog("Cpp Message:Log has initialized");

C++中打印日志

UnityLog("ok");

Unity中代码

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void LogDelegate(IntPtr message, int iSize);
    [DllImport("live_streaming", CallingConvention = CallingConvention.Cdecl)]
    public static extern void InitCSharpDelegate(LogDelegate log);
    //C# Function for C++‘s call
    [MonoPInvokeCallback(typeof(LogDelegate))]
    public static void LogMessageFromCpp(IntPtr message, int iSize)
        Debug.Log(Marshal.PtrToStringAnsi(message, iSize));
    public static void ShowLog()
        InitCSharpDelegate(LogMessageFromCpp);

要在Unity中显示Log的话执行

ShowLog();
Unity显示C++动态库中Log引子C++部分头文件UnityDebug.hpp源文件UnityDebug.cppC++中的使用Unity的C#代码Unity端的使用逻辑原理参考链接 需求是Unity的项目调用C++动态库的逻辑,并进行调试,这时就需要能够通过Log,观测C++动态库中的逻辑是否正常运行。 这个需求的底层逻辑其实就是,在C++中做一个“信息发送器”,C#中有一个“接收器”。在Log信息时,就是C++Log内容,发送给C#,从而在Unity显示出来。 该文章中的代码经过实际项目检 但是某些情况下,为了调试需要,希望能够输出C#库中Log信息,方便排查。 但是C# dll中输出日志时都是使用Console.WriteLine之类的方法,而这个方法在Unity控制台中是无法显示日志信息的。因此找了下相关的方法,现整理如下: 1.在查阅了一些资料后发现Console有一个很重要的方法“Console.SetOut”可以设置当前输出流 在VS Studio中新建一个C#控制台应用程序 前一段时间 为了方便查看unity的日志输出,自己写了一套粗略的unity日志查看器,直接unity出包,然后可以在应用里面查看Debug信息。 csdn下载地址 unity日志查看器github 链接地址 unity日志查看器 一开始我遇到的是这个DllNotFoundException: OuterApi.dll(TouchScript那个不用管,它就是什么报错它就跟着一起报的嘤嘤怪) 然后我对报错的那一行做了个Try Catch,然后… 就从一个报错变成了三个报错… 新的问题出现了,原来是因为Failed to load dll expected x64,就是64位U3D读取不了32位的DLL,然后网上找到的3个... 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如指掌。另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道。 二、反射的使用 平时我们的写法是先引用命名空间(dll),然后new一个对象,通过这个对象调用其中的字段或方法,通过反射,我们可以不用添加dll来实现效果。 1.首先我们在C#中创建一个Testdll类 打包dll,内容如下 using Sy. 一、日志的分类日志分为运行日志和调试日志,运行日志记录运行情况帮助使用过程中出现故障的分析,需要简单明了,为使得实施人员甚至客户能看懂,难免啰嗦。调试日志是系统测试上线过程中程序员方便进一步了解情况而写的日志,有部分比较生涩难懂,但是精简高效。二、日志的作用说到底,日志是为人服务的,而且使用范围广,具有通用性。对于DLL的日志1、可以用于区分责任,特别是不同厂家之间经常会因为某些东西而相互推脱、争... 写UnityC++插件时非常不方便的一点就是,在Unity调试的时候无法显示log。 以下代码是我在编写HoloLens插件时用到的代码。外汇出入金流程http://www.fx61.com/support,时间过去好久了,今天翻到了做个记录。(万能的指针) UnityDebug.h #include"string.h" #include "stdio.h" #include #define UnityLog(acStr, .... Unity 开发模式中常常需要log一些信息,但是在正式发布时又想将其全部关闭,如果有很多log,那一个一个的去关闭就未免显得有点繁琐。通过一个开关,来控制log 是否输入更简便一些。如果在看log信息时想更精准定位到是哪一行代码则需要把log输出的订成dll。 可把此脚本制成dll: using UnityEngine; using System.Collections; namespac