使用浏览器的查找命令 (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)宏
枚举 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)
-
装饰器Blackboard可以通过检查值来中断其子分支的任务,观察者终止条件设为Self。
但是我在使用自定义的Task时,并没有成功终止任务,其原因是需要覆写ReceiveAbort并调用FinishAbort。
-
在行为树的中断中执行StopMovement函数会导致在停止播放后引发崩溃。(4.21)
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] 目录中
参考链接:
对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的逻辑。
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;