Pro*_*mer 13 c# c++ unity-game-engine
在Unity中制作C++插件时,更容易使用它Debug.Log来快速查看变量值,但此功能仅可从C#端获得.这使得调试C++插件非常困难,因为Unity的调试器不支持它.std::cout不是一个选项,因为它没有在编辑器中显示.
我查看了位于的Unity C++ API,<UnityInstallationDirecory>\Editor\Data\PluginAPI但没有找到有关登录API的任何信息.
有关如何在C++编辑器日志中显示的任何建议?
Pro*_*mer 14
这可以通过回调函数完成.发送一个函数指针从C#到C++将它存储在一个临时变量中.放入Debug.Log该回调函数并允许它接收字符串作为指针(IntPtr).
从C++调用此函数时,将其转换IntPtr为字符串Marshal.PtrToStringAnsi.
要使其在iOS上运行,您必须MonoPInvokeCallback在回调函数上使用该属性.
C#(附加到空的GameObject):
using AOT;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
public class DebugCPP : MonoBehaviour
{
// Use this for initialization
void OnEnable()
{
RegisterDebugCallback(OnDebugCallback);
}
//------------------------------------------------------------------------------------------------
[DllImport("DebugLogPlugin", CallingConvention = CallingConvention.Cdecl)]
static extern void RegisterDebugCallback(debugCallback cb);
//Create string param callback delegate
delegate void debugCallback(IntPtr request, int color, int size);
enum Color { red, green, blue, black, white, yellow, orange };
[MonoPInvokeCallback(typeof(debugCallback))]
static void OnDebugCallback(IntPtr request, int color, int size)
{
//Ptr to string
string debug_string = Marshal.PtrToStringAnsi(request, size);
//Add Specified Color
debug_string =
String.Format("{0}{1}{2}{3}{4}",
"<color=",
((Color)color).ToString(),
">",
debug_string,
"</color>"
);
UnityEngine.Debug.Log(debug_string);
}
}
Run Code Online (Sandbox Code Playgroud)
C++(DebugCPP.h):
#pragma once
#include<stdio.h>
#include <string>
#include <stdio.h>
#include <sstream>
#define DLLExport __declspec(dllexport)
extern "C"
{
//Create a callback delegate
typedef void(*FuncCallBack)(const char* message, int color, int size);
static FuncCallBack callbackInstance = nullptr;
DLLExport void RegisterDebugCallback(FuncCallBack cb);
}
//Color Enum
enum class Color { Red, Green, Blue, Black, White, Yellow, Orange };
class Debug
{
public:
static void Log(const char* message, Color color = Color::Black);
static void Log(const std::string message, Color color = Color::Black);
static void Log(const int message, Color color = Color::Black);
static void Log(const char message, Color color = Color::Black);
static void Log(const float message, Color color = Color::Black);
static void Log(const double message, Color color = Color::Black);
static void Log(const bool message, Color color = Color::Black);
private:
static void send_log(const std::stringstream &ss, const Color &color);
};
Run Code Online (Sandbox Code Playgroud)
C++(DebugCPP.cpp):
#include "DebugCPP.h"
#include<stdio.h>
#include <string>
#include <stdio.h>
#include <sstream>
//-------------------------------------------------------------------
void Debug::Log(const char* message, Color color) {
if (callbackInstance != nullptr)
callbackInstance(message, (int)color, (int)strlen(message));
}
void Debug::Log(const std::string message, Color color) {
const char* tmsg = message.c_str();
if (callbackInstance != nullptr)
callbackInstance(tmsg, (int)color, (int)strlen(tmsg));
}
void Debug::Log(const int message, Color color) {
std::stringstream ss;
ss << message;
send_log(ss, color);
}
void Debug::Log(const char message, Color color) {
std::stringstream ss;
ss << message;
send_log(ss, color);
}
void Debug::Log(const float message, Color color) {
std::stringstream ss;
ss << message;
send_log(ss, color);
}
void Debug::Log(const double message, Color color) {
std::stringstream ss;
ss << message;
send_log(ss, color);
}
void Debug::Log(const bool message, Color color) {
std::stringstream ss;
if (message)
ss << "true";
else
ss << "false";
send_log(ss, color);
}
void Debug::send_log(const std::stringstream &ss, const Color &color) {
const std::string tmp = ss.str();
const char* tmsg = tmp.c_str();
if (callbackInstance != nullptr)
callbackInstance(tmsg, (int)color, (int)strlen(tmsg));
}
//-------------------------------------------------------------------
//Create a callback delegate
void RegisterDebugCallback(FuncCallBack cb) {
callbackInstance = cb;
}
Run Code Online (Sandbox Code Playgroud)
用于C++:
Debug::Log("Hellow Red", Color::Red);
Debug::Log("Hellow Green", Color::Green);
Debug::Log("Hellow Blue", Color::Blue);
Debug::Log("Hellow Black", Color::Black);
Debug::Log("Hellow White", Color::White);
Debug::Log("Hellow Yellow", Color::Yellow);
Debug::Log("Hellow Orange", Color::Orange);
Debug::Log(true, Color::Black);
Debug::Log(false, Color::Red);
Run Code Online (Sandbox Code Playgroud)
编辑输出:
现在,您可以轻松实现Debug.LogWarning和Debug.LogError.
| 归档时间: |
|
| 查看次数: |
3628 次 |
| 最近记录: |