收集2018-2-10前的,新的在新帖里
周末,是扯淡的日子,正如詩(shī)里扯的淡:
你是一樹(shù)一樹(shù)的花開(kāi),
是燕在樑間呢喃,
你是愛(ài)、是暖、是希望,
你是人間的四月天!
最新劇情:UE4扯淡大雜燴第二季
First Egg
APawn.IsLocallyControlled 和APawn.IsPlayerControlled 完全就是扯淡。不能準(zhǔn)確表示單機(jī)、客戶端、獨(dú)立服務(wù)器、監(jiān)聽(tīng)服務(wù)器下的Pawn狀態(tài)。
Game動(dòng)態(tài)更新csv表格
官方版本UDataTable只能在Editor中實(shí)例化,Game中都被宏定義禁用了。如果要搞,將對(duì)應(yīng)的邏輯相關(guān)的代碼文件遷移到客戶端就可以用了,只有三五個(gè)文件。記之。
屬性與RPC的網(wǎng)絡(luò)包處理過(guò)于復(fù)雜
實(shí)現(xiàn)部分不是一般的復(fù)雜,什么每個(gè)包里解析出object和guid,然后分發(fā)消息。每個(gè)UObject都可能是一個(gè)網(wǎng)絡(luò)包里的object。Guid大概從自然數(shù)簡(jiǎn)單遞增,每個(gè)對(duì)象在客戶端和服務(wù)端都有個(gè)映射表。還有個(gè)channel,不是channel V,混在里面濫竽充數(shù)。那UDP還要處理重發(fā)來(lái)著。那Replicator不是SG中的小蟲(chóng)子,是用來(lái)處理object的消息分發(fā)的代理。那ip connection和net driver,在十幾個(gè)對(duì)象里穿梭把別人都不放在眼里。
扯個(gè)SceneCapturer的淡
這個(gè)淡可以一扯是因?yàn)橛?份重名的類(lèi)和文件名字(4.11)
Engine\Plugins\Experimental\StereoPanorama\Source\StereoPanorama\Private\SceneCapturer.h
Engine\Source\Runtime\Engine\Classes\Engine\SceneCapture.h
好了,扯完了淡,要記得實(shí)驗(yàn)庫(kù)中的SceneCaputre的Acotr和Component與Engine庫(kù)中有重名,不要混淆了
扯個(gè)Gameplay Tags的蛋
USING GAMEPLAY TAGS TO LABEL AND ORGANIZE YOUR CONTENT IN UE4
使用游戲性標(biāo)記在 UE4 中標(biāo)記和整理內(nèi)容
Missing:扯蛋
你們要的蛋蛋來(lái)了:
首先在Gameplay Ablitities開(kāi)啟后,有個(gè)Cue編輯窗。在這里可以可以增加tag。例如增加“GameplayCue.Damage.Type1”和“GameplayCue.Damage.Type2”
然后,找2個(gè)cue,例如Blueprint'/Game/Blueprints/GameplayCues/Cue_HitImpact.Cue_HitImpact',將它們的tags分別設(shè)為上面的1型和2型
于是乎,在UGameplayEffect的成員FGameplayEffectCue.GameplayCueTags對(duì)應(yīng)的BP窗口上就可以選中這2個(gè)tag了,多選就多個(gè)效果。
其配置文件路徑:GameAbility\Config\DefaultGameplayTags.ini
ACharacter構(gòu)造時(shí)掛接的子對(duì)象由于重構(gòu)改名后造成ACharacterBP中被不正常清空的BUG
ACharacter的構(gòu)造掛了這樣一個(gè)成員:
AttributeSet = CreateDefaultSubobject(ucustomattributeset)(TEXT("AttributeSet"));
然后將UCustomAttributeSet重新?lián)Q個(gè)名字
于是只要開(kāi)始Play就會(huì)發(fā)現(xiàn)AttributeSet被清空了,版本4.15.1。反復(fù)清空緩存和編譯BP都無(wú)法解決,懷疑某些符號(hào)在C++重命名后在BP中的布局已經(jīng)紊亂了,初始化的時(shí)候錯(cuò)誤的被越界覆蓋或清除了
解決:
將CharacterBP先reparent到一個(gè)更底層的類(lèi),然后再reparent回來(lái)還原。
扯一只瑪雅2016的蛋
Maya2016按照官方的說(shuō)明安裝Animation and Rigging Tools Installation,啟動(dòng)Maya木有彈出Browser窗口。
后來(lái)發(fā)現(xiàn),這個(gè)淡本身就是扯淡,Maya LT并不支持Python。從而又有下一個(gè)蛋可以扯了:maya vs maya-LT。
Maya vs. Maya LT
Maya vs. Maya LT
LT是個(gè)縮水版。
NOT POT Texture
Never streaming
No Mipmap
扯個(gè)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
菩提本無(wú)樹(shù),庸人自擾之。
搞個(gè)USTRUCT(BlueprintType)新策略限制在BP中使用某些方法
BP中一旦亂用起來(lái),其實(shí)也是很可怕的。于是為了彰顯千年的功績(jī),硬擼個(gè)新區(qū)讓它橫空出世以千年大計(jì)的牌坊插在流芳萬(wàn)世的信息鎖國(guó)的遺臭上,隨心所欲不怕矩。
USTRUCT(BlueprintType)
structFProjectileEffectContainer{
GENERATED_USTRUCT_BODY()
UPROPERTY(EditAnywhere)
TArray Effects;
TArray ApplyEffect(AActor* Target);
}
USTRUCT中的方法不能聲明為BP方法,這樣就不能再BP中濫用了。然后再擼個(gè)UBlueprintFunctionLibrary來(lái)訪問(wèn)這些USTRUCT中的方法,在BP中隨心所欲的玩吧。
來(lái)扯一只Camera自動(dòng)激活的蛋
場(chǎng)景中的CameraActor的屬性中有一個(gè)Auto Player Activation,可以指定一個(gè)Player,自動(dòng)給其激活camera。曾經(jīng)有一只碼農(nóng)嫌的蛋痛于是在場(chǎng)景里放了2個(gè)這個(gè)CameraActor,都指定自動(dòng)激活給Player0,于是開(kāi)始游戲后Camera只是激活到了后來(lái)加入場(chǎng)景的CameraActor,這樣這項(xiàng)很重要的工作這只碼農(nóng)有一半的時(shí)間做了無(wú)用功,只因?yàn)榧恿?個(gè)CameraActor。
總結(jié)下,考慮一張Level,里面一只默認(rèn)的ThirdPerson Character,當(dāng)然默認(rèn)是帶一個(gè)CameraComponent的,另外Level里還放一只CameraActor。則Level激活Camera優(yōu)先級(jí)順序如下
優(yōu)先激活指定了Auto Player Activation的CameraActor。這個(gè)時(shí)候Character上的CameraComponent指定激活與否效果一樣
如果CameraActor沒(méi)有指定Auto Player Activation,則其在Level中就是只廢物,可以無(wú)視掉。在這個(gè)情況下,則:
優(yōu)先激活Character上帶自動(dòng)激活屬性(Auto Activation)的CameraComponent,例如Character上有多個(gè)CameraComponent,激活其中帶自動(dòng)激活屬性的。如果多個(gè)Component都帶自動(dòng)激活屬性,那么就XX了。
如果場(chǎng)景中既沒(méi)有帶指定Player的CameraActor,或根本就沒(méi)有CameraActor,然后所有的ActorComponent都不帶自動(dòng)激活屬性,則引擎將Camera的坐標(biāo)指定為Character的世界坐標(biāo)
扯完了Camera的蛋,順便扯扯如何切這只蛋:
用Player Controller的Set View Target with Blend指定Camera
New View Target可以指定任意Actor,如果目標(biāo)是CameraActor,則其上的PP屬性等都可以繼承過(guò)來(lái),如果只是簡(jiǎn)單Actor,則只去這個(gè)Actor的變換矩陣。
如果要切換回Character,New View Target指定為自己,例如Get Player Character
不扯蛋就遺忘
BP的For有2個(gè)參數(shù):First ,Last。其基于人類(lèi)友好的方式計(jì)數(shù),也就是計(jì)算序列為:First, First+1 ... Last。不同于C。
扯扯回調(diào)的蛋
DECLARE_DELEGATE( DelegateName )
DECLARE_MULTICAST_DELEGATE( DelegateName )
DECLARE_EVENT( OwningType, EventName )
USTRUCT的構(gòu)造的蛋
USTRUCT默認(rèn)可以不寫(xiě)構(gòu)造函數(shù),但是如果寫(xiě)了帶參數(shù)的構(gòu)造函數(shù),則蛋來(lái)了:必須補(bǔ)上那個(gè)不帶參數(shù)的默認(rèn)構(gòu)造函數(shù)。例如下面代碼塊被注釋后就無(wú)法通過(guò)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進(jìn)行Transform也是不同的,很容易混淆。或許再扯一萬(wàn)年的蛋,還是會(huì)誤用吧:
Vector用TransformVector,Position用TransformPosition
模塊引用的蛋蛋
假設(shè)主工程交模塊MyProject,則底層宏會(huì)定義一個(gè)MyProject_API的模塊導(dǎo)出宏。
這個(gè)時(shí)候你另外定義了一個(gè)模塊用于實(shí)現(xiàn)某個(gè)功能,例如CustomDetail。如果在它里面要引用MyProject的class,則只需:
1,CustomDetail工程引入MyPrject作為依賴:PrivateDependencyModuleNames.AddRange
2,MyPrject的class加裝MyProject_API修飾。
這種扯淡的事也能碰到!
在Editor里Play后,全屏幕黑。剛build完lighting,以為是光照參數(shù)造成的bug。折騰之,我去,不是。偶然發(fā)現(xiàn)竟然是相當(dāng)于相機(jī)被放在了Camera的Actor Mesh中間,被一個(gè)立方mesh包圍了,相當(dāng)于跑到這只mesh內(nèi)部渲染了。
只好修復(fù)引擎了。
升級(jí)到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!"
網(wǎng)上找的解決方式:
更新AndroidWroks。
c:\nvpack\Chooser.exe
https://answers.unrealengine.com/questions/578929/launch-and-package-fail-for-c-android-projects-in.html
扯淡的是,這并不能解決問(wèn)題。然后嘗試直接設(shè)置ndk目錄:在配置,android sdk中設(shè)置ndk為最新的,發(fā)現(xiàn)編譯C++后不會(huì)崩潰,但是UBT又報(bào)錯(cuò)。
所以ndk更新是可以解決C++編譯,但是根源在于UE4.15沒(méi)有正確設(shè)置到最新的NDK.
安裝最新的AndroidWorks:
D:\Program Files (x86)\Epic Games\UE_4.15\Engine\Extras\AndroidWorks\Win64\CodeWorksforAndroid-1R5-windows.exe
安裝后從之前的1R1升級(jí)到了1R5了,然后需要網(wǎng)絡(luò)更新了。
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
簡(jiǎn)單來(lái)說(shuō)就是將在Project Setting里NDK的版本填為"Android-19"
其實(shí)問(wèn)題只是解決了部分。最終解決方式:
在AndroidWorks中選中1R4,
卸載sdk和ndk然后重新安裝。
Building Lighting的蛋
人生波譎云詭,一般人碰不到的事總能碰到,現(xiàn)在Building Lighting總是失敗,報(bào)錯(cuò):
Lighting build failed. Swarm failed to kick off
Error, fatal in BeginJobSpecification
發(fā)現(xiàn)那個(gè)Build Lighting的關(guān)聯(lián)邏輯:UE4Editor-UnrealEd.dll!FStaticLightingSystem::BeginLightmassProcess
其實(shí)無(wú)甚鳥(niǎo)用。之前google有人提到:重新編譯UnrealLightmass。之前想當(dāng)然的重新編譯solution以為UnrealLightmass也是重新編譯了,沒(méi)有效果也就不在意,畢竟google上各種答案混雜,偶然可以碰對(duì)。
今天選中UnrealLightmass工程后編譯,build lighting竟然好了!好吧,build solution是有些工程是可以默認(rèn)不參與編譯的。微軟一向如此,總是隱式的干一堆你并不存完全總是意料之中的事,微軟口碑爛了,這黑鍋都沒(méi)興趣扔它了。
Beam Particle的蛋
需要在Particle的Source和Target中設(shè)置Methord為User Set,不然在運(yùn)行時(shí)設(shè)置位置會(huì)無(wú)效。
設(shè)置起源與目標(biāo)
SetBeamSourcePoint/SetBeamTargetPoint
Sequence與Delay
Sequence中的邏輯是“順序并行”執(zhí)行的,并不是順序串行執(zhí)行,不明白的自己去想!
正確使用物理效果的姿勢(shì)
首先,扯點(diǎn)淡,不然后面說(shuō)的都是扯淡: Mesh對(duì)象要生成collision,否則物理是無(wú)效的。
對(duì)于地面:只需要開(kāi)啟gravity。
對(duì)于地上的物體,需要開(kāi)啟:模擬物理,重力。如果要與其他物理碰撞,要在編輯器里設(shè)置collision preset類(lèi)型,在代碼或bp里對(duì)應(yīng)UPrimitiveComponent.SetCollisionResponseToAllChannels 。
創(chuàng)建Spline遇到的蛋蛋
Add Spline Component默認(rèn)情況下會(huì)添加2個(gè)Point,這個(gè)其實(shí)也不是很扯蛋,只是經(jīng)常容易忘了。
GooglePlay的蛋
本是Google的蛋,不關(guān)Epic。總之,google之。24H后,加上googlegroup郵箱,刷新后幾分鐘beta show就出來(lái)了。只是中間在切了一下beta using googlegroup并加入googlegroup,不知道有沒(méi)有關(guān)系。
---不知道說(shuō)的什么
來(lái)個(gè)Plugins中模塊的蛋
定義好模塊編譯神馬的都OK了,啟動(dòng)時(shí)卻報(bào)錯(cuò),找不到這個(gè)模塊。問(wèn)題出在uproject文件中沒(méi)有加入這個(gè)模塊。
蛋:不要混淆Editor和Game的模塊目錄
這一蛋是混淆了Editor和Game的模塊目錄,在MyGame.Build.cs中用PrivateDependencyModuleNames引入了GameplayAbilitiesEditor。于是折騰了好久。
DebugGame Editor的蛋
假設(shè)在DebugGame Editor配置下開(kāi)發(fā),一起都很好。偶然一次你又雙擊uproject文件啟動(dòng)編輯器了,會(huì)發(fā)現(xiàn)修改了C++邏輯似乎不對(duì)。那是因?yàn)镈ebugGame Editor生成的編輯器并非Development Editor。
升級(jí)后ACharacter莫名其妙問(wèn)題
//AbilitySystemComponent莫名其妙變空指針,調(diào)試發(fā)現(xiàn)初始化后某個(gè)地方導(dǎo)致變空
//具體細(xì)節(jié)不明,懷疑是版本升級(jí)后所致,之前也碰到過(guò)幾次版本升級(jí)造成莫名其妙的問(wèn)題
//在BP里將先reparent到Character,再reparent回BaseCharacter就好了
<占位標(biāo)題>
<占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述占位描述>
<占位項(xiàng)1>
<占位項(xiàng)2>
UE4無(wú)法加載dll
如果某個(gè)插件在.uproject中沒(méi)有配置,會(huì)提醒無(wú)法加載這個(gè)模塊的dll