UE4中自己遇到的坑/问题/疑惑

使用浏览器的查找命令 (Crtl + f) 能够更方便查询,我尽量将每个问题的标签写全

在C++中能访问没有定义访问修饰符的成员(C++中没定义的类默认是Private结构体是Public)

问题原描述

  • 给角色添加摄像机摇臂(SpringArm)时发现能够直接访问未声明访问修饰符的成员,如TargetArmLength。

遇到疑问的代码:

AMyCharacter::AMyCharacter()
{
    Arm->TargetArmLength = 170.f;
}

部分源码:

class ENGINE_API USpringArmComponent : public USceneComponent
{   
    GENERATED_UCLASS_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Camera)
    float TargetArmLength;

    ···
}
  • 原因就是GENERATED_UCLASS_BODY()宏。这个宏下面的成员默认为Public,这是一个不推荐使用的宏,应该使用GENERATED_BODY()替换,但是引擎源码大部分都使用的这个宏,属于遗留问题。

在函数中不带Const的引用在蓝图中默认是输出引脚

可以在参数前面添加UPARAM(ref)宏


UE4中自己遇到的坑/问题/疑惑_第1张图片
UE4中自己遇到的坑/问题/疑惑_第2张图片

参考链接:UE4-answers

枚举 Enum

UENUM()
enum ETest1
{
    T1_A            =0,
    T1_B            =1,
};
UENUM()
enum class ETest2 : uint8
{
    T2_A,
    T2_B,
};
UENUM()
namespace ETest3
{
    enum Type
    {
      T3_A,
      T3_B,
    };
}

行为树中的中断(Abort)

  1. 装饰器Blackboard可以通过检查值来中断其子分支的任务,观察者终止条件设为Self。
    但是我在使用自定义的Task时,并没有成功终止任务,其原因是需要覆写ReceiveAbort并调用FinishAbort。


    UE4中自己遇到的坑/问题/疑惑_第3张图片
  2. 在行为树的中断中执行StopMovement函数会导致在停止播放后引发崩溃。(4.21)


    UE4中自己遇到的坑/问题/疑惑_第4张图片
    崩溃栈

UE4 蓝图中函数(Function),纯虚函数(PureFunction),自定义事件(CustomEvent),蓝图宏(BlueprintMacro)以及事件调度器的区别

点这里

对UserWidget(UMG)添加BPInterface蓝图接口时崩溃问题(4.17)

原因是Interface中的函数命名与Widget中的某个变量相同,修改函数名字就可以解决了。

场景中远处的Shadow(阴影)消失问题

当Mesh的移动性为可移动时(非静态烘焙),Mesh的阴影可见性取决于Mesh的大小及其与相机的距离

修改平行光中有关CascadedShadowMaps(联级阴影)
  • NumDynamicShadowCasades
  • CascadeDistributionExponent
  • CascadeTranstitionFraction
  • ShadowDistanceFadeoutFraction
其他可调整的参数:
r.Shadow.FadeResolution
  • 控制在开始淡出之前光线在屏幕上的大小。
  • 默认值:64
  • 可以降低此值以防止阴影在更远的距离逐渐消失
r.Shadow.MinResolution
  • 控制光线在完全淡出之前必须在屏幕上显示的大小,此时它不再显示有成本。
  • 默认值:32
  • 较低的值似乎会增加阴影可见度。
r.Shadow.MaxResolution
  • 默认值:1024
r.Shadow.TexelsPerPixel
  • 分配更高的分辨率,然后它应该不那么积极地淡出
  • 默认值:1.27324
  • 可以增加此值以改善阴影渲染可见性和质量
r.Shadow.RadiusThreshold
  • 默认值:0.03
  • 较低的值0.02或0.01会大大增加远距离摄像机距离的阴影可见度(显著提升)。

除了在命令行中修改值之外,你也可以将其保存在 [DefaultEngine.ini] 文件内 [/Script/Engine.RendererSettings] 目录中

参考链接:
  • UE4-Forums-Shadows disappear with increased camera distance
  • 光线追踪距离场柔和阴影

对ProjectileMovement的Actor使用IgnoreActorWhenMoving时依旧被阻挡的问题。

如果弹丸启用了模拟物理 会失效
如果被碰撞到的物体启用了模拟物理 会失效

在场景中(非运行状态)蓝图Actor中的构造函数中只会读取Component属性的默认值

在使用ProjectileMovement的子弹时,射击迎面快速移动的物体时,bInitialOverlap始终为true。

Pawn的AtuoPossessAI不能正确在ChildActorComponent中生成

注意,在SpawnActor(放置在关卡中是没问题的,动态生成才会出现此问题)中

在输出日志中可以找出如下警告

Warning: SpawnActor failed because we are running a ConstructionScript (class name)

解决办法:将原本在PostInitialComponents()中调用的SpawnDefaultController()函数在BeginPlay()中再调用一次,你得自己处理是否需要Controller的逻辑。


UE4中自己遇到的坑/问题/疑惑_第5张图片

Tick in Editor 在编辑器中Tick

对于Actor:

virtual bool AActor::ShouldTickIfViewportsOnly() const override { return true; }

覆写此函数。
启用Realtime 或打开定序器


对于ActorComponent只需要启用TickInEditor并且不需用启用RealTime
*需要注意,对于MovementComponent而言,你还需要关闭bAutoUpdateTickRegistration,不然你会在在某些情况下失去Tick

UActorComponent::bTickInEditor = true;
//UMovementComponent::bAutoUpdateTickRegistration = false;
UE4中自己遇到的坑/问题/疑惑_第6张图片
MovementCompnent.cpp 失去Tick的原因

你可能感兴趣的:(UE4中自己遇到的坑/问题/疑惑)