UE4_C++ WorldContextObject

据别人说:
Actor具备挂载组件的能力,因此可以通过Scene组件,拥有Transform,因而具有坐标的概念。
Object不具备挂载组件的能力,因此不具备坐标概念。

因此UObject要想获得WorldContext只能通过中介,让能够直接获取世界实例的实例把世界信息间接告诉UObject

meta=(WorldContext="WorldContextObject") 

通过meta,自动获取调用它的对象,将其赋值给它指定的参数(meta=(WorldContext="WorldContextObject")),这样我们就能通过WorldContextObject来间接获取当前的世界

UE4中使用meta=(WorldContext="WorldContextObject")的地方

全局的一些功能库中,例如

1.GetAllActorsWithTag

// .h
UFUNCTION(BlueprintCallable, Category="Utilities",  meta=(WorldContext="WorldContextObject"))
	static void GetAllActorsWithTag(const UObject* WorldContextObject, 
	FName Tag, TArray<AActor*>& OutActors);


// .cpp

void UGameplayStatics::GetAllActorsWithTag(const UObject* WorldContextObject, FName Tag, TArray<AActor*>& OutActors)
{
	QUICK_SCOPE_CYCLE_COUNTER(UGameplayStatics_GetAllActorsWithTag);
	OutActors.Reset();

	// We do nothing if no tag is provided, rather than giving ALL actors!
	if (!Tag.IsNone())
	{
		if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, 
			EGetWorldErrorMode::LogAndReturnNull))
		{
			for (FActorIterator It(World); It; ++It)
			{
				AActor* Actor = *It;
				if (Actor->ActorHasTag(Tag))
				{
					OutActors.Add(Actor);
				}
			}
		}
	}
}

	

以上遍历Actor的方法使用迭代器FActorIterator

该方法的使用是在When Playing in Editor

/**
 * Actor iterator
 * Note that when Playing In Editor, this will find actors only in CurrentWorld
 */
class FActorIterator : public TActorIteratorBase<FActorIterator>
{
	friend class TActorIteratorBase<FActorIterator>;
	typedef TActorIteratorBase<FActorIterator> Super;
}

2.蓝图异步节点

一般要继承自UBlueprintAsyncActionBase

UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject"))
	static UBPAsyncNode_Custom* CustomAsyncBPNode(UObject* WorldContextObject);

参考资料

[UE4图文系列] 6.WorldContextObject(世界上下文对象)

UE4笔记-异步蓝图节点 (UBlueprintAsyncActionBase)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值