在Unity中制作C插件时,使用Debug.Log来快速查看变量值更容易,但该功能仅在C#端可用。这使得调试C插件非常困难,因为Unity的调试器不支持它。std::cout不是选项,因为它不会显示在编辑器中。 我查看了位于<UnityInstallationDirecory>\Editor\Data\PluginAPI的Unity C++ API,但没有找到任何关于在API中登录的内容。 关于如何在C++的编辑器日志中显示,有什么建议吗?
// The callback signature (shared by Unity C#)`enter code here`
using DebugLogCallback = void(const char*);
// Storage for the pointer to the Unity C# callback
static DebugLogCallback s_debugLogCallback = nullptr;
// Register the callback (called from Unity C#)
void RegisterDebugLog(DebugLogCallback callback)
{
s_debugLogCallback = callback;
}
// Use from C++ to log the message to Unity C#
void DebugLog(const char* message)
{
s_debugLogCallback(message);
}
// Usage example
DebugLog("Hello World");
C#(DebugLogBehaviour.cs)
// The callback signature (shared by C++). string is marshalled as const char* automatically
public delegate void DebugLogCallback(string message);
// Import our C++ register function
[DllImport("DebugLogPlugin")]
public static extern void RegisterDebugLog(DebugLogCallback callback);
// MonoBehaviour to load our plugin and register the callback
public class DebugLogBehaviour : MonoBehaviour
{
void OnEnable()
{
// Call our C++ function to register the callback.
RegisterDebugLog(DebugLog);
}
[MonoPInvokeCallback]
static void DebugLog(string message)
{
Debug.Log(message);
}
}
3条答案
按热度按时间bt1cpqcv1#
这可以通过回调函数来实现。发送一个指向函数的指针,从C#到C将其存储在临时变量中。将
Debug.Log
放入回调函数中,并允许它以指针(IntPtr
)的形式接收字符串。当从C调用此函数时,将
IntPtr
转换为字符串Marshal.PtrToStringAnsi
。要使其在iOS上工作,您必须在回调函数上使用
MonoPInvokeCallback
属性。C#(附加到一个空的游戏对象):
C++(
DebugCPP.h
):C++(
DebugCPP.cpp
):C++用法:
编辑器输出:
现在,您可以轻松实现
Debug.LogWarning
和Debug.LogError
。9jyewag02#
这里有一个简单的解决方案,使用自动编组(从
string
到char*
)。C++(DebugLogPlugin.cpp)
C#(DebugLogBehaviour.cs)
dxpyg8gm3#
我找到了 * 最简单的方法 * 通过Unity Native API来实现。
在本机项目中
在你的团结计划中
结果:result
在没有任何统一文档的情况下尝试花费了我很多时间。所以我写了一个enample:https://github.com/Darkgrouptw/UnityNativeLogger