ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)
今天,在單步調試程序時,對照引擎,突然有了些想法。以前沒注意到,是因為以前都是用引擎的dll,并沒有這么調試過。
1,每個引擎都是有自己的初始化和幀循環,使用引擎的過程,就是相當于把引擎當做工廠,自己的數據相當于原材料,進行加工的過程。不同的引擎有不同的加工流水線。
2,加工過程,要遵循引擎的流水線流程,而不是自己創造一個,如果只用引擎的類初始化,而沒有用引擎的幀循環,很可能沒有掌握住精髓。前幾年,有個項目,用OSG,架構師自己寫了個幀循環過程,結果,由于是單線程,最后卡的一筆,項目失敗。
3,如何使用引擎的幀循環過程?一個方法是用該類,或者繼承抽象類,用父類調用子類的方式,把自己的東西嵌套進去,貍貓換太子,即父類轉小圈,子類替代父類轉大圈。而不是只看這個引擎一個循環多么熱鬧,卻無從下手。
使用UE4時,
1,在PreInit()
(1)首先動態加載自定義工程的dll,(這里隱藏了,其實應該到項目的dll)
(2),調用動態鏈接庫中派生類的構造函數,這里解釋下,其實就是UCLASS()派生類,既然要用父類調用子類的方式,起碼要知道有哪些子類
比如
UClass()
class myActor : public AACtor
{
GENERATED_BODY()
public:
myActor ();
}
這里就是要調用
myActor::myActor()了。
單步調試:(這里應該跟蹤到myActor::myActor(),隱藏了)
這里的ClassDefaultObject就是派生類,如myActor,ParentDefaultObject即為父類AActor,只是前面加了個前綴Default_。
接下來,就是工程動態鏈接庫中的一系列UCLASS()派生類。
這時候,可以趁機把一系列的游戲中用到的類都派生出來,比如,AActor,APawn,AGameModeBase,UGameViewportClient,
在構造函數中可以加點私貨,自己的自定義類。在此時調用構造函數中干點自己的事。
2,在FEngineLoop::init()階段,進行初始化了
這里上面也隱藏了,注意,這個this是什么,這個this是FEngineLoop,也就是說,在這里,可以不失時機地派生一個類
UCLASS()
class myGameEngine : public UGameEngine
{
GENERATED_BODY()
public:
virtual void Init(class IEngineLoop* InEngineLoop) override;
}
去實現自定義的myGameEngine::Init(class IEngineLoop* InEngineLoop)
可以只寫UGameEngine::Init(),也可以加一些自定義的東西,UGameEngine類其實比較全了。成員變量有
/** Maximium delta time the engine uses to populate FApp::DeltaTime. If 0, unbound. */
UPROPERTY(config)
float MaxDeltaTime;
/** Maximium time (in seconds) between the flushes of the logs on the server (best effort). If 0, this will happen every tick. */
UPROPERTY(config)
float ServerFlushLogInterval;
UPROPERTY(transient)
UGameInstance* GameInstance;
/** The game viewport window */
TWeakPtr<class SWindow> GameViewportWindow;
/** The primary scene viewport */
TSharedPtr<class FSceneViewport> SceneViewport;
/** The game viewport widget */
TSharedPtr<class SViewport> GameViewportWidget;
/** Handle to a movie capture implementation to create on startup */
FMovieSceneCaptureHandle StartupMovieCaptureHandle;
/** Last time the logs have been flushed. */
double LastTimeLogsFlushed;
以及相關的方法,由于太多了,所以不列出了。
主要進行一些初始化
先調基類(UGameEngine派生與UEngine)
游戲設置
游戲實例
編輯器模式下視頻捕捉
如果是客戶端,則開個客戶端視口
看到這里,想到什么?是的,派生,再派生出一個自定義的客戶端視口類
UCLASS()
class myGameViewportClient : public UGameViewportClient
{
GENERATED_BODY()
。。。
}
這樣,客戶端視口也為我所用了,而不是干瞪眼看著UE4自己玩了。
將視口放在視口界面里,創建視口所在的窗口。
3,現在初始化完畢了,該啟動引擎了。
依照慣例,也要把gameInstance派生出來,為我所用
UCLASS()
class myGameInstance : public UGameInstance
{
GENERATED_BODY()
.......
}
在這里,照樣 UGameInstance::StartGameInstance()不是純虛函數,所以還要除了自定義的外,還要用一用。這里的初始化主要就是業務內容的初始化了。也就是開始游戲了。
(1)加載游戲地圖,得到gameMode
可以回憶下,fps模板中,生成默認pawn,初始化彈簧手臂和攝像機一類的。
很明顯,這里要派生個pawn類,到這里,就和ue4編輯器的c++模板連貫起來了。
(2)
總結
以上是生活随笔為你收集整理的ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 随机取列表值 重复_pyt
- 下一篇: sprintf函数的格式化字符串_尚学堂