的笔记

随时随地编辑

UE4扯淡大杂烩第一季

收集2018-2-10前的,新的在新帖里


周末,是扯淡的日子,正如诗里扯的淡:
你是一樹一樹的花開,
是燕在樑間呢喃,
你是愛、是暖、是希望,
你是人間的四月天!


最新剧情:UE4扯淡大杂烩第二季


First Egg

APawn.IsLocallyControlled 和APawn.IsPlayerControlled 完全就是扯淡。不能准确表示单机、客户端、独立服务器、监听服务器下的Pawn状态。

Game动态更新csv表格

官方版本UDataTable只能在Editor中实例化,Game中都被宏定义禁用了。如果要搞,将对应的逻辑相关的代码文件迁移到客户端就可以用了,只有三五个文件。记之。

属性与RPC的网络包处理过于复杂

实现部分不是一般的复杂,什么每个包里解析出object和guid,然后分发消息。每个UObject都可能是一个网络包里的object。Guid大概从自然数简单递增,每个对象在客户端和服务端都有个映射表。还有个channel,不是channel V,混在里面滥竽充数。那UDP还要处理重发来着。那Replicator不是SG中的小虫子,是用来处理object的消息分发的代理。那ip connection和net driver,在十几个对象里穿梭把别人都不放在眼里。

扯个SceneCapturer的淡

这个淡可以一扯是因为有2份重名的类和文件名字(4.11)
  • Engine\Plugins\Experimental\StereoPanorama\Source\StereoPanorama\Private\SceneCapturer.h
  • Engine\Source\Runtime\Engine\Classes\Engine\SceneCapture.h
  • 好了,扯完了淡,要记得实验库中的SceneCaputre的Acotr和Component与Engine库中有重名,不要混淆了

    扯个Gameplay Tags的蛋

    USING GAMEPLAY TAGS TO LABEL AND ORGANIZE YOUR CONTENT IN UE4
    使用游戏性标记在 UE4 中标记和整理内容
    Missing:扯‎蛋

    你们要的蛋蛋来了:

    首先在Gameplay Ablitities开启后,有个Cue编辑窗。在这里可以可以增加tag。例如增加“GameplayCue.Damage.Type1”和“GameplayCue.Damage.Type2”

    然后,找2个cue,例如Blueprint'/Game/Blueprints/GameplayCues/Cue_HitImpact.Cue_HitImpact',将它们的tags分别设为上面的1型和2型

    于是乎,在UGameplayEffect的成员FGameplayEffectCue.GameplayCueTags对应的BP窗口上就可以选中这2个tag了,多选就多个效果。

    其配置文件路径:GameAbility\Config\DefaultGameplayTags.ini


    ACharacter构造时挂接的子对象由于重构改名后造成ACharacterBP中被不正常清空的BUG

    ACharacter的构造挂了这样一个成员:
    AttributeSet = CreateDefaultSubobject(ucustomattributeset)(TEXT("AttributeSet")); 然后将UCustomAttributeSet重新换个名字
    于是只要开始Play就会发现AttributeSet被清空了,版本4.15.1。反复清空缓存和编译BP都无法解决,怀疑某些符号在C++重命名后在BP中的布局已经紊乱了,初始化的时候错误的被越界覆盖或清除了

    解决:
    将CharacterBP先reparent到一个更底层的类,然后再reparent回来还原。

    扯一只玛雅2016的蛋

    Maya2016按照官方的说明安装Animation and Rigging Tools Installation,启动Maya木有弹出Browser窗口。
    后来发现,这个淡本身就是扯淡,Maya LT并不支持Python。从而又有下一个蛋可以扯了:maya vs maya-LT。

    Maya vs. Maya LT

    Maya vs. Maya LT
    LT是个缩水版。

    NOT POT Texture

  • Never streaming
  • No Mipmap

  • 扯个IN/OUT的淡

    ApplyGameplayEffectSpecToSelf(OUT FGameplayEffectSpec& GameplayEffect, FPredictionKey PredictionKey = FPredictionKey());


    UnrealEngine\Engine\Source\Runtime\Core\Public\Windows\WindowsSystemIncludes.h
    #ifndef OUT
    #define OUT
    #endif
    #ifndef IN
    #define IN
    #endif


    菩提本无树,庸人自扰之。


    搞个USTRUCT(BlueprintType)新策略限制在BP中使用某些方法

    BP中一旦乱用起来,其实也是很可怕的。于是为了彰显千年的功绩,硬撸个新区让它横空出世以千年大计的牌坊插在流芳万世的信息锁国的遗臭上,随心所欲不怕矩。
    USTRUCT(BlueprintType)
    structFProjectileEffectContainer{
    GENERATED_USTRUCT_BODY()
    UPROPERTY(EditAnywhere)
    TArray Effects;
    TArray ApplyEffect(AActor* Target);
    }
    

    USTRUCT中的方法不能声明为BP方法,这样就不能再BP中滥用了。然后再撸个UBlueprintFunctionLibrary来访问这些USTRUCT中的方法,在BP中随心所欲的玩吧。

    来扯一只Camera自动激活的蛋

    场景中的CameraActor的属性中有一个Auto Player Activation,可以指定一个Player,自动给其激活camera。曾经有一只码农嫌的蛋痛于是在场景里放了2个这个CameraActor,都指定自动激活给Player0,于是开始游戏后Camera只是激活到了后来加入场景的CameraActor,这样这项很重要的工作这只码农有一半的时间做了无用功,只因为加了2个CameraActor。
    总结下,考虑一张Level,里面一只默认的ThirdPerson Character,当然默认是带一个CameraComponent的,另外Level里还放一只CameraActor。则Level激活Camera优先级顺序如下
  • 优先激活指定了Auto Player Activation的CameraActor。这个时候Character上的CameraComponent指定激活与否效果一样
  • 如果CameraActor没有指定Auto Player Activation,则其在Level中就是只废物,可以无视掉。在这个情况下,则:
  • 优先激活Character上带自动激活属性(Auto Activation)的CameraComponent,例如Character上有多个CameraComponent,激活其中带自动激活属性的。如果多个Component都带自动激活属性,那么就XX了。
  • 如果场景中既没有带指定Player的CameraActor,或根本就没有CameraActor,然后所有的ActorComponent都不带自动激活属性,则引擎将Camera的坐标指定为Character的世界坐标


  • 扯完了Camera的蛋,顺便扯扯如何切这只蛋:
  • 用Player Controller的Set View Target with Blend指定Camera
  • New View Target可以指定任意Actor,如果目标是CameraActor,则其上的PP属性等都可以继承过来,如果只是简单Actor,则只去这个Actor的变换矩阵。
  • 如果要切换回Character,New View Target指定为自己,例如Get Player Character


  • 不扯蛋就遗忘

    BP的For有2个参数:First ,Last。其基于人类友好的方式计数,也就是计算序列为:First, First+1 ... Last。不同于C。

    扯扯回调的蛋

  • DECLARE_DELEGATE( DelegateName )
  • DECLARE_MULTICAST_DELEGATE( DelegateName )
  • DECLARE_EVENT( OwningType, EventName )

  • USTRUCT的构造的蛋

    USTRUCT默认可以不写构造函数,但是如果写了带参数的构造函数,则蛋来了:必须补上那个不带参数的默认构造函数。例如下面代码块被注释后就无法通过UBT编译:

    USTRUCT(BlueprintType)
    struct FSortRecordItem
    {
    // GENERATED_USTRUCT_BODY()

    // FSortRecordItem()
    // {
    // }

    FSortRecordItem(int32 a)
    {
    }
    

    };


    一只friend function的蛋

    UCLASS(MinimalAPI)
    classULandscapeSplinesComponent:publicUPrimitiveComponent
    {
    // many friendsfriendclassFLandscapeToolSplines;
    friendclassFLandscapeSplinesSceneProxy;
    friendclassULandscapeSplineControlPoint;
    friendclassULandscapeSplineSegment;
    #ifWITH_EDITOR
    // TODO - move this out of ULandscapeInfo
    friend bool ULandscapeInfo::ApplySplinesInternal(boolbOnlySelected,ALandscapeProxy*Landscape);
    #endif

    Transform的蛋蛋

    Actor和Component取Transform是不同的:
  • Actor用GetTransform, Component用GetComponentTransform

  • Vector与Position进行Transform也是不同的,很容易混淆。或许再扯一万年的蛋,还是会误用吧:
  • Vector用TransformVector,Position用TransformPosition

  • 模块引用的蛋蛋

    假设主工程交模块MyProject,则底层宏会定义一个MyProject_API的模块导出宏。
    这个时候你另外定义了一个模块用于实现某个功能,例如CustomDetail。如果在它里面要引用MyProject的class,则只需:
    1,CustomDetail工程引入MyPrject作为依赖:PrivateDependencyModuleNames.AddRange
    2,MyPrject的class加装MyProject_API修饰。

    这种扯淡的事也能碰到!

    在Editor里Play后,全屏幕黑。刚build完lighting,以为是光照参数造成的bug。折腾之,我去,不是。偶然发现竟然是相当于相机被放在了Camera的Actor Mesh中间,被一个立方mesh包围了,相当于跑到这只mesh内部渲染了。
    只好修复引擎了。

    升级到4.15编译Android的蛋

    gc++崩溃,并找到提示:
    LogPlayLevel: UnrealBuildTool: This application has requested the Runtime to terminate it in an unusual way.
    LogPlayLevel: UnrealBuildTool: Please contact the application's support team for more information.
    Expression: DeclKind != Decl::LinkageSpec && "Should not perform lookups into linkage specs!"

    网上找的解决方式:
    更新AndroidWroks。
    c:\nvpack\Chooser.exe
    https://answers.unrealengine.com/questions/578929/launch-and-package-fail-for-c-android-projects-in.html
    扯淡的是,这并不能解决问题。然后尝试直接设置ndk目录:在配置,android sdk中设置ndk为最新的,发现编译C++后不会崩溃,但是UBT又报错。
    所以ndk更新是可以解决C++编译,但是根源在于UE4.15没有正确设置到最新的NDK.

    安装最新的AndroidWorks:
    D:\Program Files (x86)\Epic Games\UE_4.15\Engine\Extras\AndroidWorks\Win64\CodeWorksforAndroid-1R5-windows.exe
    安装后从之前的1R1升级到了1R5了,然后需要网络更新了。

    Invalid-or-unsupported-command---UE4.15与NDK android-24的蛋

    ====2017/4/26 14:05:28====PREPARING NATIVE CODE=================================================================
    UEDeployAndroid.RequiresOBB: APK contains data.
    UEDeployAndroid.GenerateManifest: Fixing minSdkVersion; NDK level above 19 requires minSdkVersion of 21 (arch=armv7)
    UEDeployAndroid.UpdateProjectProperties:
    ====2017/4/26 14:05:28====UPDATING BUILD CONFIGURATION FILES====================================================
    **************************************************************************
    The "android" command is deprecated.
    For manual SDK, AVD, and project management, please use Android Studio.
    For command-line tools, use tools\bin\sdkmanager.bat
    and tools\bin\avdmanager.bat
    **************************************************************************
    Invalid or unsupported command "--silent update lib-project --path JavaLibs/downloader_library --target android-24"
    
    破蛋之策在这里:
    https://forums.unrealengine.com/showthread.php?142035-Invalid-or-unsupported-command
    简单来说就是将在Project Setting里NDK的版本填为"Android-19"
    其实问题只是解决了部分。最终解决方式:
    在AndroidWorks中选中1R4,卸载sdk和ndk然后重新安装

    Building Lighting的蛋

    人生波谲云诡,一般人碰不到的事总能碰到,现在Building Lighting总是失败,报错:
    Lighting build failed. Swarm failed to kick off
    Error, fatal in BeginJobSpecification
    发现那个Build Lighting的关联逻辑:UE4Editor-UnrealEd.dll!FStaticLightingSystem::BeginLightmassProcess
    其实无甚鸟用。之前google有人提到:重新编译UnrealLightmass。之前想当然的重新编译solution以为UnrealLightmass也是重新编译了,没有效果也就不在意,毕竟google上各种答案混杂,偶然可以碰对。
    今天选中UnrealLightmass工程后编译,build lighting竟然好了!好吧,build solution是有些工程是可以默认不参与编译的。微软一向如此,总是隐式的干一堆你并不存完全总是意料之中的事,微软口碑烂了,这黑锅都没兴趣扔它了。

    Beam Particle的蛋

    需要在Particle的Source和Target中设置Methord为User Set,不然在运行时设置位置会无效。
    设置起源与目标
    SetBeamSourcePoint/SetBeamTargetPoint

    Sequence与Delay

    Sequence中的逻辑是“顺序并行”执行的,并不是顺序串行执行,不明白的自己去想!

    正确使用物理效果的姿势

    首先,扯点淡,不然后面说的都是扯淡: Mesh对象要生成collision,否则物理是无效的。

    对于地面:只需要开启gravity。
    对于地上的物体,需要开启:模拟物理,重力。如果要与其他物理碰撞,要在编辑器里设置collision preset类型,在代码或bp里对应UPrimitiveComponent.SetCollisionResponseToAllChannels 。

    创建Spline遇到的蛋蛋

    Add Spline Component默认情况下会添加2个Point,这个其实也不是很扯蛋,只是经常容易忘了。

    GooglePlay的蛋

    本是Google的蛋,不关Epic。总之,google之。24H后,加上googlegroup邮箱,刷新后几分钟beta show就出来了。只是中间在切了一下beta using googlegroup并加入googlegroup,不知道有没有关系。

    ---不知道说的什么

    来个Plugins中模块的蛋

    定义好模块编译神马的都OK了,启动时却报错,找不到这个模块。问题出在uproject文件中没有加入这个模块。

    蛋:不要混淆Editor和Game的模块目录

    这一蛋是混淆了Editor和Game的模块目录,在MyGame.Build.cs中用PrivateDependencyModuleNames引入了GameplayAbilitiesEditor。于是折腾了好久。

    DebugGame Editor的蛋

    假设在DebugGame Editor配置下开发,一起都很好。偶然一次你又双击uproject文件启动编辑器了,会发现修改了C++逻辑似乎不对。那是因为DebugGame Editor生成的编辑器并非Development Editor。

    升级后ACharacter莫名其妙问题

    //AbilitySystemComponent莫名其妙变空指针,调试发现初始化后某个地方导致变空 //具体细节不明,怀疑是版本升级后所致,之前也碰到过几次版本升级造成莫名其妙的问题 //在BP里将先reparent到Character,再reparent回BaseCharacter就好了

    <占位标题>

    <占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
  • <占位项1>
  • <占位项2>

  • UE4无法加载dll

    如果某个插件在.uproject中没有配置,会提醒无法加载这个模块的dll

    posted on 2017-01-15 00:04 的笔记 阅读(3289) 评论(0)  编辑 收藏 引用


    只有注册用户登录后才能发表评论。
    网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理