你的浏览器不支持canvas

让我们携手共创奇迹!

杂识

Date: Author: LBD

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自WindCrazy

这是一篇关于使用UE时发现的一些小知识

一、Sequence复制

在Create Level Sequence Player后可以对其Replicate Playback属性设置为true,这样在服务器上播放这个Seq就可以同步给所有客户端,但是目前来看,好像只能同步Actor中的一些属性,比如Transform,Visibility等,但是假如蓝图Actor中有粒子在Seq中更改这个粒子组件的参数,这个是无法同步的

二、清除DebugDraw

创建了一个DrawDebugLine或者DrawDebugSphere等,如果设置了永久显示,那么如何创建一次显示,然后创建第二个让第一个DrawDebugLine或其他DebugDraw消失,可以如下调用FlushPersistentDebugLines,此函数不止可以消除DrawDebugLine

FlushPersistentDebugLines(GetWorld());
DrawDebugSphere(GetWorld(), GetComponentLocation(), CollisionRadius, 12, FColor::Red, true);

三、PURE_VIRTUAL

参考:PURE_VIRTUAL method

有时候写接口时可能会用到这个,写法:

UINTERFACE()
class UInteractorState : public UInterface
{
	GENERATED_BODY()
};
class PICOXRINPUT_API IInteractorState
{
	GENERATED_BODY()
public:
	virtual bool HasSelectedInteractable() const
		PURE_VIRTUAL(IInteractorState::HasSelectedInteractable, return false;);
};

你可以用PURE_VIRTUAL配合非UObjects,但没必要。我认为它背后的理念是,虚拟方法需要存根函数,这样“纯虚拟”才能适用于 BlueprintNativeEvent 和其他与蓝图相关的虚拟。PURE_VIRTUAL宏只是插入一个运行时断言,告诉你永远不应该执行那段代码,这也是为什么子类不需要覆盖它来编译它,因为C++不把它当作纯虚拟方法。看起来传统C++语法在非UObject中更受青睐,而宏实际上在UObject中被强制执行,那么为什么会有这个宏,因为每个UOBJECT都必须是可实例化的,UE才能创建CDO(类默认对象),这也是UOBJECT不能抽象的原因。

还有一点用处就是

参考:PURE_VIRTUAL()

PURE_VIRTUAL() 有两个参数,第一个参数是函数名称,第二个参数是当前函数的返回值,他们会在崩溃画面日志显示“Pure virtual not implemented (IInteractorState::HasSelectedInteractable)”的消息

四、动态绑定委托不能在构造函数绑定

我有这样的代码:

InteractableCollider->OnComponentBeginOverlap.AddDynamic(this, &UInteractableComponent::ColliderBeginOverlap);
InteractableCollider->OnComponentEndOverlap.AddDynamic(this, &UInteractableComponent::ColliderEndOverlap);

放在构造函数时,没有触发,放在BeginPlay就触发了。我觉得原因应该是动态绑定是针对实例的,而构造函数中的实例是CDO


对于本文内容有问题或建议的小伙伴,欢迎提出问题。