NoesisGUI 邂逅 AI:基于 TypeScript 的 MVVM 架构与自动化代码生成

4 天前
 iceAD

NoesisDemo - TypeScript + AI 赋能的 MVVM 开发方案

🔗 项目仓库: https://github.com/No-needto-recall/NoesisDemo


🎯 这个项目是做什么的?

这是一个 Unreal Engine 5.4 的示例项目,旨在演示:

核心理念:XAML 和 ViewModel 都是代码 → AI 完全理解 → 自动生成和修改 → 开发效率 dramatically improved


📑 目录


✨ 核心特性

完美复刻官方示例:成功使用 TypeScript 复刻了 NoesisGUI 官方的 Buttons 和 QuestLog 示例。

🚀 TypeScript 代码化 ViewModel:使用 PuerTS 的 uclass_extends 直接继承 UE 类并自动生成蓝图。

🔧 动态 DataContext 设置:自定义 UNoesisViewModeInstance,调整 DataContext 的赋值时机。

🤖 AI 友好:XAML 和 ViewModel 均为代码,易于 AI 理解和生成。

📦 版本控制友好:完全基于代码,告别蓝图合并的噩梦。

属性自动通知NoesisProxy 自动处理 PropertyChanged,并原生支持 TArrayTMap


🤖 AI 辅助开发 - 近乎自动化的 UI 代码生成

为什么这套方案对 AI 友好?

本方案采用完全代码化的工作流:

XAML 文件是纯文本格式 - AI 可以轻松理解和生成。

ViewModel 使用 TypeScript 编写 - 这是 AI 的强项。

数据绑定逻辑清晰可读 - AI 能够进行推理。

这使得本项目与 AI 辅助开发工具(如 Claude Code, GitHub Copilot, Cursor 等)完全兼容。

AI 能做什么?

自动生成 ViewModel 代码

只需描述你的需求,AI 就能生成完整的 ViewModel:

// 输入:"创建一个设置界面,包含音量和画质选项"
// AI 自动生成:
class TS_SettingsViewMode extends UE.Object {
    @uproperty(uproperty.EditAnywhere, uproperty.BlueprintReadWrite)
    Volume: number = 80;

    @uproperty(uproperty.EditAnywhere, uproperty.BlueprintReadWrite)
    Quality: string = "High";

    @ufunction(ufunction.BlueprintCallable)
    ApplySettings(): void {
        console.log(`Applying: Volume=${this.Volume}, Quality=${this.Quality}`);
    }
}

自动修改和重构代码

告诉 AI “增加一个音效开关” → 自动修改 TypeScript 和 XAML 。 AI 能理解数据绑定逻辑,自动添加相应的属性和命令。 AI 还能自动处理复杂的集合绑定 (TArray, TMap)。

快速生成完整界面

“创建一个包含用户列表的界面” → AI 自动生成 XAML + ViewModel 。 “增加搜索和筛选功能” → AI 自动补全相关代码。 “实现拖拽排序” → AI 生成完整的事件处理逻辑。

使用 Claude Code 等 AI 工具,只需描述 UI 需求和交互逻辑,AI 就能自动生成 XAML 和 ViewModel 代码。 开发者只需审查和微调,极大地提升了开发效率,实现了近乎自动化的 UI 代码开发体验。

"再也不用手动拉蓝图连线了——AI 直接生成代码!" - 某开发者


🏗️ 技术架构亮点

PuerTS uclass_extends - 自动生成蓝图类

通过 TypeScript 装饰器定义属性和方法,PuerTS 会自动生成对应的蓝图类:

class TS_ButtonsViewMode extends UE.Object {
    static Path(): string {
        return "/Game/BluePrints/TypeScript/ViewMode/Buttons/TS_ButtonsViewMode_C";
    }

    @uproperty(uproperty.EditAnywhere, uproperty.BlueprintReadWrite)
    TestValue: string = "Hello NoesisGUI";

    @ufunction(ufunction.BlueprintCallable)
    StartCommand(): void {
        console.log("Button clicked!");
    }
}

UNoesisViewModeInstance - 解决 DataContext 限制

自定义的 UNoesisInstance 子类,在 XamlLoaded 回调中自动设置 DataContext,解决了官方类不支持动态设置的问题。

NoesisProxy - 属性自动通知

利用 JavaScript Proxy API 自动拦截属性修改,并触发 NoesisGUI 的更新:

const proxy = createNoesisProxy<TS_ButtonsViewMode>(viewMode);

// 任何属性修改都会自动通知 NoesisGUI
proxy.TestValue = "New Value"; 

// 支持 TArray 自动通知
proxy.items.Add(newItem);       // 自动调用 NotifyArrayPostAdd
proxy.items.RemoveAt(0);        // 自动调用 NotifyArrayPreRemove + PostRemove

// 支持 TMap 自动通知
proxy.map.Add("key", value);    // 自动调用 NotifyMapPostAdd

数据绑定流程:

TypeScript 类定义 (@uproperty, @ufunction)
↓
PuerTS 生成蓝图类
↓
TypeScript 创建实例 (UE.NewObject)
↓
绑定到 UNoesisViewModeInstance (PendingDataContext)
↓
XAML 加载完成 (XamlLoaded 回调)
↓
自动设置 DataContext
↓
数据绑定生效 (XAML Binding → ViewModel 属性)
↓
属性更新 (NoesisProxy → NotifyPropertyChanged → UI 刷新)

🎨 完美复刻官方示例

Buttons 示例

演示了基础的 MVVM 数据绑定:

QuestLog 示例

演示了复杂的数据绑定:

// QuestLog ViewModel 示例
class TS_QuestLogViewMode extends UE.Object {
    @uproperty(uproperty.EditAnywhere, uproperty.BlueprintReadWrite)
    Quests: UE.TArray<TS_Quest>;

    @ufunction(ufunction.BlueprintCallable)
    AddQuest(Title: string, Image: UE.Texture2D, ...): TS_Quest {
        const Quest = UE.NewObject(TS_Quest);
        Quest.Initialize(Title, Image, ...);
        
        // 使用 Proxy 自动触发 TArray 更新通知
        let Proxy = createNoesisProxy<TS_QuestLogViewMode>(this);
        Proxy.Quests.Add(Quest);
        
        return Quest;
    }
}

🚀 快速开始

环境要求:

获取项目:

git clone https://github.com/No-needto-recall/NoesisDemo.git

⚠️ 重要提示:

详细的安装步骤、配置说明和使用教程,请访问项目的 GitHub 仓库查看完整文档。


📚 相关链接


💡 总结

这个项目为 Unreal Engine 中的 NoesisGUI 开发提供了一种全新的思路:

使用 TypeScript 替代蓝图编写 ViewModel

完全代码化,版本控制友好,无蓝图合并冲突

全面兼容 AI 辅助开发工具,实现近乎自动化的 UI 代码生成

复刻官方示例,证明了方案的完整性和可行性

自动属性通知,支持复杂的 TArrayTMap 绑定

非常适合:

如果这个项目对你有帮助,请给它一个 Star ⭐! 欢迎提交 PR 来复刻更多官方 UI 示例,一起完善这个方案! 🎉

Made with ❤️ for the NoesisGUI Community

219 次点击
所在节点    Unreal Development Kit
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1164390

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX