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)

在 Unreal Engine 中,`NS_PlayWwiseEvent` 是与 Wwise 集成相关的一个功能模块。它通常用于触发音频事件,这些事件由 Audiokinetic 的 Wwise 工具定义并管理。以下是关于 `NS_PlayWwiseEvent` 实现和用法的一些详细说明: ### 1. 基本概念 `NS_PlayWwiseEvent` 可能是一个命名空间或者函数前缀,具体取决于项目的实现方式。它的主要作用是在游戏中通过调用特定的 Wwise 事件来播放声音[^2]。 ```cpp AkGameplayStatics::PostEvent(EventName, TargetActor); ``` 上述代码片段展示了如何在游戏中使用 Wwise API 来发布一个事件。这里的 `EventName` 对应于你在 Wwise 软件中创建的声音事件名称,而 `TargetActor` 则是你希望该事件影响的游戏对象。 ### 2. 使用场景 当开发者想要动态控制游戏中的音效时,可以利用 `NS_PlayWwiseEvent` 或类似的接口。例如,在玩家射击武器时触发枪声效果,或者在玩家进入某个区域时播放背景音乐变化。 - **参数传递**: 如果需要向 Wwise 发送额外的数据(比如音量调整、位置信息等),可以通过设置 RTPC (Real-Time Parameter Controls) 或者切换状态组来完成。 ```cpp FAkAudioDevice::SetRTPCValue(RTPC_Name, Value, ShortID); // 设置实时参数控制值 ``` 此部分操作允许更精细地调节音频表现形式[^3]。 ### 3. 技术细节 为了确保性能优化以及资源的有效加载,建议遵循以下原则: - 尽可能重用已存在的 Audio Events 和 Banks; - 在适当时候卸载不再使用的 SoundBanks 以释放内存; - 测试不同平台下的延迟情况以便做出相应补偿措施。 ### 4. 示例代码 下面给出一段简单的蓝图节点转换为 C++ 的例子,展示如何执行 Wwise Event: ```cpp void PlayWwiseEvent(UObject* WorldContextObject, FWwiseEvent const& EventRef, AActor* Actor) { UAkComponent* AkComp = UAkGameplayStatics::GetAkComponent(Actor); if(AkComp && EventRef.IsValid()) { UAkGameplayStatics::PostAKEventByName(WorldContextObject, *EventRef.EventName.ToString(), AkComp); } } ``` 以上函数接受世界上下文对象、具体的 Wwise Event 引用以及目标演员作为输入,并尝试在其上播放指定的声音事件[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值