虚幻引擎生成式AI支持插件

该插件为虚幻引擎提供多种生成式AI模型的集成支持,专注于游戏开发中的LLM/GenAI应用场景。

  • by PazerOP
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 PazerOP/UnrealGenAISupport

使用说明

使用示例:

MCP示例:

Claude生成场景对象并控制其变换和材质,生成蓝图、函数、变量,添加组件,运行python脚本等。

API示例:

一个名为“成为人类”的项目,其中NPC是OpenAI代理实例。使用此插件构建。

虚幻引擎生成AI支持插件:

每个月,各种组织都会发布数百种新的人工智能模型,这使得很难跟上最新的进展。

“虚幻引擎生成AI支持插件”允许您专注于游戏开发,而无需担心LLM/GenAI集成层。

目前正在为中国大陆和国际市场提供阿里巴巴Qwen等中国LLMs支持。

该项目旨在为各种尖端的LLM/GenAI模型构建一个长期支持(LTS)插件,并培养 它目前包括OpenAI的GPT-4o、Deepseek R1、Claude Sonnet 4、Claude Opus 4和用于虚幻引擎5.1或更高版本的GPT-40-mini,并计划添加 实时API、Gemini、MCP和Grok 3 API即将推出。该插件将专门关注对以下方面有用的API 游戏开发、评估和互动体验。欢迎提出建议和意见。该插件还可以用于设置新的评估和比较游戏战场中模型的方法。

当前进展:

此插件将继续获得最新功能和型号的更新。欢迎捐款。 如果您想要一个更适合生产的替代品,具有更多功能和有保证的稳定性,请查看 Gen AI Pro 和 Gen AI Pro中国 插件,因为它花费了大量的API信用,让我测试不同的模型,每个功能和每个引擎版本,以确保一切工作良好和兼容。这两个插件共同支持来自全球的150多个AI模型!否则,我觉得这个免费插件对于许多用例(包括开头显示的示例)来说已经足够好了,你可以永远免费使用它。

LLM/GenAI API支持:

虚幻MCP(模型控制协议):

  • 客户支持✅
    • Claude桌面应用程序支持✅
    • 游标IDE支持✅
    • OpenAI运营商API支持🚧
  • 蓝图汽车生成🛠️
    • 创建新的类型蓝图✅
    • 添加新函数、函数/蓝图变量✅
    • 添加节点和连接🛠️ (有问题,问题未解决)
    • 高级蓝图生成🛠️
  • LLM的级别/场景控制🛠️
    • 生成物体和形状✅
    • 移动、旋转和缩放对象✅
    • 更改材质和颜色✅
    • 高级场景功能🛠️
  • 生成型人工智能:
    • 提示获取和生成3D模型🛠️
  • 控制:
    • 能够运行Python脚本✅
    • 能够运行控制台命令✅
  • UI:
    • 小部件生成🛠️
    • UI蓝图生成🛠️
  • 项目文件:
    • 创建/编辑项目文件/文件夹️✅
    • 删除现有项目文件❌
  • 其他:
    • 项目清理🛠️

哪里,

目录

设置API密钥:

[!注意]
不需要设置API密钥来测试Claude应用程序中的MCP功能。只有Claude API需要使用无烟煤钥匙。

对于编辑:

设置环境变量 PS_<ORGNAME> 到您的API密钥。

对于Windows:

setx PS_<ORGNAME> "your api key"

对于Linux/MacOS:

  1. 在终端中运行以下命令,将您的密钥替换为API密钥。

    echo "export PS_<ORGNAME>='yourkey'" >> ~/.zshrc
    
  2. 使用新变量更新shell:

    source ~/.zshrc
    

PS:设置环境变量后,不要忘记重新启动编辑器和连接的IDE。

哪里 <ORGNAME> 可以是: PS_OPENAIAPIKEY, PS_DEEPSEEKAPIKEY, PS_ANTHROPICAPIKEY, PS_METAAPIKEY, PS_GOOGLEAPIKEY 等等

对于打包构建:

将API密钥存储在打包的构建中是一个安全风险。以下是OpenAI API文档对它的描述:

“在浏览器或移动应用程序等客户端环境中暴露您的OpenAI API密钥会让恶意用户获取该密钥并代表您提出请求,这可能会导致意外收费或某些帐户数据泄露。请求应始终通过您自己的后端服务器进行路由,在那里您可以确保API密钥的安全。”

阅读更多 这里.

对于测试构建,您可以调用 GenSecureKey::SetGenAIApiKeyRuntime 使用打包构建中的API键,使用c++或blueprint函数。

设置MCP:

[!注意]
如果您的项目只使用LLM API而不使用MCP,则可以跳过本节。

[!小心]
Discalimer:如果你使用的是插件的MCP功能,它将直接让Claude Desktop App控制你的虚幻引擎项目。 确保您了解安全风险,并且只在受控环境中使用它。

请在使用MCP功能之前备份您的项目,并使用版本控制来跟踪更改。

1.安装以下任一客户端:
  • Claude桌面应用程序来自 这里.
  • 光标IDE来自 这里.
2.设置mcp配置json:
对于Claude桌面应用程序:

claude_desktop_config.json Claude Desktop App安装目录中的文件。(可能会问克劳德,你的平台在哪里!) 文件看起来像这样:

{
    "mcpServers": {
      "unreal-handshake": {
        "command": "python",
        "args": ["<your_project_directoy_path>/Plugins/GenerativeAISupport/Content/Python/mcp_server.py"],
        "env": {
          "UNREAL_HOST": "localhost",
          "UNREAL_PORT": "9877" 
        }
      }
    }
}
对于游标IDE:

.cursor/mcp.json 项目目录中的文件。文件看起来像这样:

{
    "mcpServers": {
      "unreal-handshake": {
        "command": "python",
        "args": ["<your_project_directoy_path>/Plugins/GenerativeAISupport/Content/Python/mcp_server.py"],
        "env": {
          "UNREAL_HOST": "localhost",
          "UNREAL_PORT": "9877" 
        }
      }
    }
}
3.使用pip或cv从安装MCP[CLI]。
pip install mcp[cli]
4.在虚幻引擎中启用python插件。(编辑->插件->Python编辑器脚本插件)
5.[可选]在编辑器打开时启用AutoStart MCP服务器

将插件添加到您的项目中:

使用Git:

  1. 将插件库作为子模块添加到项目的存储库中。

    git submodule add https://github.com/prajwalshettydev/UnrealGenAISupport Plugins/GenerativeAISupport
    
  2. 重新生成项目文件: 右键单击.uproject文件,然后选择“生成Visual Studio项目文件”。

  3. 在虚幻编辑器中启用插件: 在虚幻编辑器中打开您的项目。转到编辑>插件。在列表中搜索插件并启用它。

  4. 对于虚幻C++项目,将插件的模块包含在项目的Build.cs文件中:

    PrivateDependencyModuleNames.AddRange(new string[] { "GenerativeAISupport" });
    

使用Perforce:

仍在开发中。.

使用虚幻市场:

即将在虚幻引擎市场免费推出。

获取最新插件更改:

使用Git:

您可以通过以下方式获取最新更改:

cd Plugins/GenerativeAISupport
git pull origin main

或者更新项目中的所有子模块:

git submodule update --recursive --remote

使用Perforce:

仍在开发中。.

用途:

有一个示例虚幻项目已经实现了该插件。你可以找到它 这里.

OpenAI:

目前该插件支持OpenAI API的聊天和结构化输出。既适用于C++,也适用于蓝图。 测试模型为 gpt-4o, gpt-4o-mini, gpt-4.5, o1-mini, o1, o3-mini-high.

1.聊天:

C++示例:
    void SomeDebugSubsystem::CallGPT(const FString& Prompt, 
        const TFunction<void(const FString&, const FString&, bool)>& Callback)
    {
        FGenChatSettings ChatSettings;
        ChatSettings.Model = TEXT("gpt-4o-mini");
        ChatSettings.MaxTokens = 500;
        ChatSettings.Messages.Add(FGenChatMessage{ TEXT("system"), Prompt });
    
        FOnChatCompletionResponse OnComplete = FOnChatCompletionResponse::CreateLambda(
            [Callback](const FString& Response, const FString& ErrorMessage, bool bSuccess)
        {
            Callback(Response, ErrorMessage, bSuccess);
        });
    
        UGenOAIChat::SendChatRequest(ChatSettings, OnComplete);
    }
蓝图示例:

2.结构化输出:

C++示例1:

将自定义模式json直接发送到函数调用

FString MySchemaJson = R"({
"type": "object",
"properties": {
    "count": {
        "type": "integer",
        "description": "The total number of users."
    },
    "users": {
        "type": "array",
        "items": {
            "type": "object",
            "properties": {
                "name": { "type": "string", "description": "The user's name." },
                "heading_to": { "type": "string", "description": "The user's destination." }
            },
            "required": ["name", "role", "age", "heading_to"]
        }
    }
},
"required": ["count", "users"]
})";

UGenAISchemaService::RequestStructuredOutput(
    TEXT("Generate a list of users and their details"),
    MySchemaJson,
    [](const FString& Response, const FString& Error, bool Success) {
       if (Success)
       {
           UE_LOG(LogTemp, Log, TEXT("Structured Output: %s"), *Response);
       }
       else
       {
           UE_LOG(LogTemp, Error, TEXT("Error: %s"), *Error);
       }
    }
);
C++示例2:

从文件发送自定义模式json

#include "Misc/FileHelper.h"
#include "Misc/Paths.h"
FString SchemaFilePath = FPaths::Combine(
    FPaths::ProjectDir(),
    TEXT("Source/:ProjectName/Public/AIPrompts/SomeSchema.json")
);

FString MySchemaJson;
if (FFileHelper::LoadFileToString(MySchemaJson, *SchemaFilePath))
{
    UGenAISchemaService::RequestStructuredOutput(
        TEXT("Generate a list of users and their details"),
        MySchemaJson,
        [](const FString& Response, const FString& Error, bool Success) {
           if (Success)
           {
               UE_LOG(LogTemp, Log, TEXT("Structured Output: %s"), *Response);
           }
           else
           {
               UE_LOG(LogTemp, Error, TEXT("Error: %s"), *Error);
           }
        }
    );
}
蓝图示例:

DeepSeek API:

目前该插件支持DeepSeek API的聊天和推理。既适用于C++,也适用于蓝图。 注意事项:

  • 系统消息目前对推理模型是强制性的。API似乎返回null
  • 此外,在文档中:“请注意,如果输入消息序列中包含reasoning_content字段,API将返回400错误。 阅读更多 这里"

[!警告]
在使用R1推理模型时,确保虚幻引擎的HTTP超时不是30秒的默认值。 因为这些API调用可能需要30秒以上的时间才能响应。只需设置 HttpRequest->SetTimeout(<N Seconds>); 还不够 因此,需要将以下行添加到您的项目中 DefaultEngine.ini 文件:

[HTTP]
HttpConnectionTimeout=180
HttpReceiveTimeout=180

1.聊天和推理:

C++示例:
 FGenDSeekChatSettings ReasoningSettings;
 ReasoningSettings.Model = EDeepSeekModels::Reasoner; // or EDeepSeekModels::Chat for Chat API
 ReasoningSettings.MaxTokens = 100;
 ReasoningSettings.Messages.Add(FGenChatMessage{TEXT("system"), TEXT("You are a helpful assistant.")});
 ReasoningSettings.Messages.Add(FGenChatMessage{TEXT("user"), TEXT("9.11 and 9.8, which is greater?")});
 ReasoningSettings.bStreamResponse = false;
 UGenDSeekChat::SendChatRequest(
     ReasoningSettings,
     FOnDSeekChatCompletionResponse::CreateLambda(
         [this](const FString& Response, const FString& ErrorMessage, bool bSuccess)
         {
             if (!UTHelper::IsContextStillValid(this))
             {
                 return;
             }

             // Log response details regardless of success
             UE_LOG(LogTemp, Warning, TEXT("DeepSeek Reasoning Response Received - Success: %d"), bSuccess);
             UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *Response);
             if (!ErrorMessage.IsEmpty())
             {
                 UE_LOG(LogTemp, Error, TEXT("Error Message: %s"), *ErrorMessage);
             }
         })
 );
蓝图示例:

无烟煤API:

目前该插件支持来自Anthropic API的聊天。既适用于C++,也适用于蓝图。 测试模型为 claude-sonnet-4-20250514, claude-opus-4-20250514, claude-3-7-sonnet-latest, claude-3-5-sonnet, claude-3-5-haiku-latest, claude-3-opus-latest.

1.聊天:

C++示例:
    // ---- Claude Chat Test ----
    FGenClaudeChatSettings ChatSettings;
    ChatSettings.Model = EClaudeModels::Claude_3_7_Sonnet; // Use Claude 3.7 Sonnet model
    ChatSettings.MaxTokens = 4096;
    ChatSettings.Temperature = 0.7f;
    ChatSettings.Messages.Add(FGenChatMessage{TEXT("system"), TEXT("You are a helpful assistant.")});
    ChatSettings.Messages.Add(FGenChatMessage{TEXT("user"), TEXT("What is the capital of France?")});
    
    UGenClaudeChat::SendChatRequest(
        ChatSettings,
        FOnClaudeChatCompletionResponse::CreateLambda(
            [this](const FString& Response, const FString& ErrorMessage, bool bSuccess)
            {
                if (!UTHelper::IsContextStillValid(this))
                {
                    return;
                }
    
                if (bSuccess)
                {
                    UE_LOG(LogTemp, Warning, TEXT("Claude Chat Response: %s"), *Response);
                }
                else
                {
                    UE_LOG(LogTemp, Error, TEXT("Claude Chat Error: %s"), *ErrorMessage);
                }
            })
    );
蓝图示例:

XAI的Grok 3 API:

目前该插件支持来自XAI的Grok 3 API的聊天。既适用于C++,也适用于蓝图。

1.聊天:

	FGenXAIChatSettings ChatSettings;
	ChatSettings.Model = TEXT("grok-3-latest");
		ChatSettings.Messages.Add(FGenXAIMessage{
		TEXT("system"),
		TEXT("You are a helpful AI assistant for a game. Please provide concise responses.")
	});
	ChatSettings.Messages.Add(FGenXAIMessage{TEXT("user"), TEXT("Create a brief description for a forest level in a fantasy game")});
	ChatSettings.MaxTokens = 1000;

	UGenXAIChat::SendChatRequest(
		ChatSettings,
		FOnXAIChatCompletionResponse::CreateLambda(
			[this](const FString& Response, const FString& ErrorMessage, bool bSuccess)
			{
				if (!UTHelper::IsContextStillValid(this))
				{
					return;
				}
				
				UE_LOG(LogTemp, Warning, TEXT("XAI Chat response: %s"), *Response);
				
				if (!bSuccess)
				{
					UE_LOG(LogTemp, Error, TEXT("XAI Chat error: %s"), *ErrorMessage);
				}
			})
	);

模型控制协议(MCP):

这项工作目前正在进行中。该插件支持各种客户端,如Claude Desktop App、Cursor等。

用途:

如果启用了自动启动MCP服务器:(在插件的设置中)

1.打开虚幻引擎编辑器。
2.打开克劳德桌面应用程序或Cursor IDE或Windsor。

就是这样!现在,您可以使用该插件的MCP功能。

如果禁用自动启动MCP服务器:

1.从插件的python目录运行MCP服务器。
python <your_project_directoy>/Plugins/GenerativeAISupport/Content/Python/mcp_server.py
2.通过打开或重新启动Claude桌面应用程序或Cursor IDE来运行MCP客户端。
3.打开一个新的虚幻引擎项目,并从插件的python目录运行以下python脚本。

工具->运行Python脚本->选择 Plugins/GenerativeAISupport/Content/Python/unreal_socket_server.py 文件。

4.现在,您应该能够提示Claude桌面应用程序使用虚幻引擎。

已知问题:

  • 节点无法与MCP正确连接
  • MCP不支持撤消重做
  • Deepseek推理模型不支持流媒体
  • 创建材质工具不支持复杂的材质生成
  • 运行一些llm生成的有效python脚本时出现问题
  • 当LLM编译蓝图时,其响应中没有适当的错误处理
  • 生成某些节点的问题,尤其是使用getter和setter时
  • 在编辑场景和项目文件时,不会打开正确的上下文窗口。
  • 无法在蓝图编辑器中正确停靠窗口。

配置窗口:

(仍然wip)

贡献指南:

为发展而设立:

  1. 安装 unreal python包,并设置IDE的python解释器以实现适当的智能感知。
pip install unreal

更多细节将很快添加。

项目结构:

更多细节将很快添加。

参考文献

快速链接:

支持这个项目

如果你觉得UnrealGenAISupport有帮助,可以考虑赞助我继续这个项目!点击上面的“赞助商”按钮进行贡献。