跳至主要內容

Umg2.编辑器工具控件样式DetailsView

Mr.Si大约 5 分钟unreal

本章概要
本章概要
头像
上一篇我们介绍了两种编辑器工具蓝图:
1.编辑器工具蓝图:ActorActionUtility|AssetActionUtility
2.编辑器蓝图控件
头像
没错,这一篇咱们重点关注一下编辑器蓝图工具

编辑器工具控件

头像
可是对比官方demo做的咱这个界面也太丑了!
咱做的
咱做的
官方的
官方的
头像
安排

DetailsView

头像
先检查官方的MovieRender有没有派生C++类。
头像
好耶,目前来说没毛病!是纯蓝图。
头像
别高兴太早,组件确实是纯蓝图,里面的数据源是不是就不知道了!
头像
而且第一印象并不乐观!并没有我们想象超复杂样式UMG
头像
有没有可能是数据驱动呢?
头像
数据驱动是必然了!
头像
可是!这个蓝图怎么回事!一个预构造函数,也没看到他UI生成逻辑啊!
头像
不过一个细节咱应该注意到了,层级组件中多了一个叫DetailsView的组件
头像
问题又来了!这东西的属性里除了一个Still Settings也没别的东西啊!
头像
别急,既然他写了一定有他的来源!
头像
我全局搜了!没有!
头像
你注意到一个细节没有!这个是个标题我们试着从他的内容出发。
头像
我看到他了!而且这个Still Settings是类别名!
头像
ok,咱们可以在我们自己的蓝图中做个简单测试。
头像
这里显示未定义对象!
头像
别急,如果按照之前的表现,这里要显示的类型应该对应我们的类目标题
头像
还是显示未定义对象!
头像
还记之前的预构造蓝图吗?连上试试!
头像
还是没反应!

多语言注意事项

头像
试试看用英文名
头像

绝了!可是这个显示的类型显示的属性有什么区别吗?

头像
试试看不就知道了!
头像

属性控制

绝了!也就是说:
显示的类型控制整组显示。
显示的属性控制单个显示。

头像
可是这个不支持中文太遗憾了!
头像
不是绝对的,你可以新建一个中文变量名的变量试试看
头像
6!难不成是因为原始变量是英文,本地化成中文,这个组件只认原始数据,后面我们用中文变量命名就能正常显示。
头像
应该就是这样
头像
这么说来和之前的ActorActionUtility|AssetActionUtility弹出来的结果很相似啊!
头像
确实像,不过这个自由度更高!
头像
现在界面有了,可是咱们用呢?

委托触发修改

头像

要么用按钮主动触发呗,要么用它属性改变时的委托呗

GIF
头像
委托?咱们花了大篇幅将的那个委托?
头像
是的,说到委托,我开始对这个组件的代码感兴趣了!

代码分析

-UDetailsView : public UPropertyViewBase, public FNotifyHook
  -UPropertyViewBase : public UWidget	
    //①一个参数的动态多播委托
    /** Sets a delegate called when the property value changes */
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPropertyValueChanged, FName, PropertyName);

    //②这个就是蓝图事件函数节点
    /** Sets a delegate called when the property value changes */
    UPROPERTY(BlueprintAssignable, Category = "View|Event")
    FOnPropertyValueChanged OnPropertyChanged;

    //③ 代理函数声明
	void OnPropertyChangedBroadcast(FName PropertyName);
	
	//④代理函数定义
	void UPropertyViewBase::OnPropertyChangedBroadcast(FName PropertyName)
    { 
        OnPropertyChanged.Broadcast(PropertyName);
    }
	
	//⑤使用者调用
	void UDetailsView::NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FProperty* PropertyThatChanged)
    {
        FNotifyHook::NotifyPostChange(PropertyChangedEvent, PropertyThatChanged);
    
        // 获取发生变化的属性的名称
        FName PropertyName = PropertyThatChanged ? PropertyThatChanged->GetFName() : NAME_None;
    
        // 触发委托广播,通知已注册的监听者属性已经发生了变化
        OnPropertyChangedBroadcast(PropertyName);
    }

  1. DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam 宏:

    • 这是一个宏,用于声明带有一个参数的动态多播委托。FOnPropertyValueChanged 是委托的类型名称,表示当某个属性值发生变化时触发的事件。在这里,FName 是参数类型,表示属性的名称。
    DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPropertyValueChanged, FName, PropertyName);
    
  2. UPROPERTY(BlueprintAssignable) 宏:

    • 这是UE宏,用于声明一个在蓝图中可绑定的委托实例。OnPropertyChanged 是类的成员变量,它是 FOnPropertyValueChanged 委托的实例。
    UPROPERTY(BlueprintAssignable, Category = "View|Event")
    FOnPropertyValueChanged OnPropertyChanged;
    
  3. 委托函数 OnPropertyChangedBroadcast

    • 这是一个成员函数,用于在属性值发生变化时触发委托的广播。该函数接受一个类型为 FName 的参数 PropertyName,表示发生变化的属性的名称。
    void OnPropertyChangedBroadcast(FName PropertyName);
    
  4. 函数实现 UPropertyViewBase::OnPropertyChangedBroadcast

    • 这是 OnPropertyChangedBroadcast 函数的具体实现。在这里,通过 OnPropertyChanged.Broadcast(PropertyName); 触发委托的广播,通知已注册的监听者(可能是蓝图中的事件节点或其他代码)属性值已经发生了变化。
    void UPropertyViewBase::OnPropertyChangedBroadcast(FName PropertyName)
    {
        OnPropertyChanged.Broadcast(PropertyName);
    }
    
  5. UDetailsView::NotifyPostChange 的使用者:

    • NotifyPostChange 是一个虚函数,并在 UDetailsView 中被重写。以下是声明:
    virtual void NotifyPostChange(const FPropertyChangedEvent& PropertyChangedEvent, FProperty* PropertyThatChanged) override;