栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++与UMG的交互

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++与UMG的交互

小常识

...C++获取UMG的属性

在C++父类中,获取蓝图子类中创建的控件引用de两种方法

第一种方法:通过名称获取控件。
void UMyUserWidget::NativeConstruct()
{
	Super::NativeConstruct();

	//通过名字,获取蓝图控件中的按钮引用。
	CtnClic = Cast(GetWidgetFromName(TEXT("Button_44")));
	if (CtnClic)
	{

		//绑定到自定义函数
		CtnClic->OnClicked.AddDynamic(this, &UMyUserWidget::TestButtonClick);
	}
}

void UMyUserWidget::TestButtonClick()
{
    //测试代码
	UE_LOG(LogTemp, Log, TEXT("dddddd"));

    //获取预定义属性后,还要转化为标准属性才能进行操作
	UCanvasPanelSlot* Slot = Cast(CtnClic->Slot);
	if (Slot)
	{
		
	}
}

优点:可以拿到对象引用,调用系统预定义好的事件(函数)。

缺点:无法拿到在蓝图中创建的属性,可以C++创建控件父类,属性也在C++中定义,这样的话可以拿到。

第二种方法:通过宏绑定控件(控件类型和名称必须和蓝图添加的一致,并且在蓝图中添加同名同类型的控件)

步骤1:在C++中创建指针

	//第二种方法		这两个标记必须要添加!!!
	UPROPERTY(BlueprintReadWrite, meta=(BindWidget))
		class UButton* TestButton2;

步骤2:在蓝图中创建对象,名字为C++中的变量名。(相当于在C++中声明,在蓝图中进行定义)

疑问:这两种方法好像都是拿到了对象的引用,如果控件是用户自定义控件,是不是就可以使用里面的变量了?

答:暂未解答。。。

 ...C++中获取控件动画

步骤1:在C++中创建动画的指针的声明

	//加个标记宏,以在蓝图中进行定义
	UPROPERTY(BlueprintReadWrite)
	class UWidgetAnimation* StatrAmin;

步骤2:在蓝图中进行定义。将蓝图中创建的动画资源,设置给C++变量(加标记宏的作用)。

 ...通用方法。获取UMG蓝图中创建的变量,对象,动画资源(本身也是一种对象引用)

先拿到所有的引用,再转为具体的引用。

获取对象引用,

获取类引用要加StaticClass()

Static:静态的

Property:所有资产

Container:容器

	//GetClass()	返回的是一个UObjectBase的对象指针
	//获取这个类的链表
	UProperty* Property = GetClass()->PropertyLink;
	while (Property)
	{
		//有没有这个类
		if (Property->GetClass() == UObjectProperty::StaticClass())
		{
			//有的话就进行类型转换
			UObjectProperty* ObjectProperty = Cast(Property->GetClass())
				//有没有这个类
				if (ObjectProperty->PropertyClass == UWidgetAnimation::Static::Class())
				{
					//有没有这个类
					//有的话,将类转化为对象
					UObject* OBject = ObjectProperty->GetObjectPropertyValue_InContainer(this);
					//将对象复制给对象指针
					UWidgetAnimation* Anim = Cast(OBject);
					//打印一下名字,看看有多少个对象。。。(如果有多个动画资源,这里会有多个名字)
					if (Anim)
					{
						UE_LOG(LogTemp, Log, TEXT("==%s"), *Anim->GetDisplayName().ToString());
					}
					//通过名字来获取对象。(!!!!以前都是通过类来获取的)	Animation01:这是在蓝图中自定义的动画资源的名字。
					if (Anim->GetDisplayName().ToString() == TEXT("Animation01"))
					{
						//测试代码		这里可以通过这个指针,执行对应的逻辑
						//其实逻辑不应该在这里。。。构造函数一般只是用来初始化变量值的地方
						UE_LOG(LogTemp, Log, TEXT("ccccccccc"));
						
					}
				}
		}

		//操作完一个链表数据后,对下一个链表数据进行操作
		Property = Property->PropertyLinkNext;
	}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938024.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号