这是一篇关于使用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
有时候写接口时可能会用到这个,写法:
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 not implemented (IInteractorState::HasSelectedInteractable)”的消息
四、动态绑定委托不能在构造函数绑定
我有这样的代码:
InteractableCollider->OnComponentBeginOverlap.AddDynamic(this, &UInteractableComponent::ColliderBeginOverlap);
InteractableCollider->OnComponentEndOverlap.AddDynamic(this, &UInteractableComponent::ColliderEndOverlap);
放在构造函数时,没有触发,放在BeginPlay就触发了。我觉得原因应该是动态绑定是针对实例的,而构造函数中的实例是CDO