Нативный плагин API для ведения журнала
Запись в журналы Unity из вашего собственного кода плагина с помощью IUnityLog интерфейс. Низкоуровневые нативные API журналирования доступны в IUnityLog.h файл заголовка, расположенный в папка PluginAPI.
Файл содержит одну функцию Log со следующим отставанием:
void(UNITY_INTERFACE_API * Log)(UnityLogType type, const char* message, const char *fileName, const int fileLine);
Вы можете вызвать эту функцию непосредственно следующим образом:
s_UnityLog->Log(kUnityLogTypeLog, "Here is a regular log", __FILE__, __LINE__);
Однако, для удобства, собственная система журналирования API определяет следующие макросы, которые обворачивают вызов функции Log на разных уровнях журнала:
| Макро | Описание |
|---|---|
UNITY_LOG(PTR_, MSG_) |
Использует интерфейс журналирования, переданный указателем (PTR_) для записи указанного символа* MSG_ как обычное сообщение журнала. Эквивалентно управляемому API Debug.Log. |
UNITY_LOG_WARNING(PTR_, MSG_) |
Использует интерфейс журналирования, переданный указателем (PTR_) для записи указанного символа* MSG_ как сообщение журнала уровня предупреждения. Эквивалент управляемому API Debug.LogWarning. |
UNITY_LOG_ERROR(PTR_, MSG_) |
Использует интерфейс журналирования, переданный указателем (PTR_) для записи указанного символа* MSG_ как сообщение журнала уровня ошибки. Эквивалент управляемому API Debug.LogError. |
Следующий пример кода реализует IUnityLog интерфейс на C++ и использует эти предопределённые макросы для вывода журнала разных уровней:
#include "IUnityLog.h"
static IUnityLog* s_UnityLog = NULL;
// Additional macros to include file and line number from the native code
#define UNITY_LOG_STRINGIZE_DETAIL(x) #x
#define UNITY_LOG_STRINGIZE(x) UNITY_LOG_STRINGIZE_DETAIL(x)
#define COMPOSE(MESSAGE) "[" __FILE__ ":" UNITY_LOG_STRINGIZE(__LINE__) "] " MESSAGE
#define NATIVE_LOG(PTR, MESSAGE) UNITY_LOG(PTR, COMPOSE(MESSAGE))
#define NATIVE_WARNING(PTR, MESSAGE) UNITY_LOG_WARNING(PTR, COMPOSE(MESSAGE))
#define NATIVE_ERROR(PTR, MESSAGE) UNITY_LOG_ERROR(PTR, COMPOSE(MESSAGE))
// Unity plugin load event
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces * unityInterfacesPtr)
{
s_UnityLog = unityInterfacesPtr->Get<IUnityLog>();
}
// Unity plugin unload event
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload()
{
s_UnityLog = nullptr;
}
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API GenerateLog()
{
// Output different log level messages to the Unity console
UNITY_LOG(s_UnityLog, "Regular log message");
UNITY_LOG_WARNING(s_UnityLog, "Warning log message");
UNITY_LOG_ERROR(s_UnityLog, "Error log message");
// Wrap log functions to provide native file and line number in output
NATIVE_LOG(s_UnityLog, "Regular log with native file name and line number");
NATIVE_WARNING(s_UnityLog, "Warning log with native file name and line number");
NATIVE_ERROR(s_UnityLog, "Error log with native file name and line number");
}
Примечание: Дополнительные макросы для вставки файла и номера строки в сообщение являются решением известной проблемы, при которой Unity не включает информацию, когда функция Log вызвана через UNITY_LOG и эквиваленты.