Unity 6.3
0 онлайн 95 гостей 3 в системе
Вход
Программирование в Unity Шаг 120 из 210

Нативный плагин 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 и эквиваленты.

Дополнительные ресурсы