一、前言
學習UE4也有一段時間了,将遇到的問題做了一個彙總,也許對我來說目前這寫問題還算是一個知識點,因為其中還有一些基本的操作問題。當然也有一些非常費解的、截至到目前為止我也沒有找到解決方法的問題。
二、具體内容
2.1、界面操作BoxBrush
剛建立的BoxBrush在Details中找不到Materials、Physics等屬性,無法對材質進行設定,如圖2.1.1所示:
圖2.1.1
這是因為剛建立的Bush需要轉換成StaticMesh才會有上述的屬性,點選BrushSetting下的Create StaticMesh後,如圖2.1.2所示,會将該Brush儲存為一個靜态網格到文
圖2.1.2
件夾中,并且世界大綱中的Brush也會自動轉成StaticMesh,針對StaticMesh的Details是會包含上述的屬性的。
2.2、自定義的GameInstance藍圖或類的使用
如果自定義了GameInstance藍圖或類,比如命名為MyGameInstance,一定要在ProjectSetting裡設定為自定義的MyGameInstance,如圖2.2.1所示,
2.2.1
否則會出現轉換問題。如圖2.2.2所示,如果不進行圖2.2.1的設定,在将系統GameInstance轉成MyGameInstance時出現轉換失敗。
圖2.2.2
2.3、每個UI中的元件都可以成為設計視圖中的變量
在UI中有兩個視圖分别為Designer和Graph,在Designer中建立的UI元件在Graph中預設是不能引用的,需要将UI元件的IsVariable勾選方可。如圖2.3所示,勾選元件的Is Variable後在Graph視圖
圖2.3
的Variable/UI下會顯示剛剛勾選的元件,此時在定義的方法和事件中可以引用該元件。
2.4、 UI的Text綁定更新問題
如圖2.4.1所示,在控件Text上綁定文本更新方法,如果是從這建立的綁定
圖 2.4.1
方法會執行,但如果是從這選的一開始建立好的方法,如圖中的GetPing方法有可能不執行,這個可能是虛幻4(版本為4.25.4)的Bug。也即一定要從圖1.4.1中點選“Create Binging”建立綁定後的處理方法才會被每幀重新整理,如果是事先在“Graph”視圖中建立好的方法,在圖2.4.1中選擇後,不會每幀執行。
2.5、如果UI按鈕的子部件設定為“Collapse”則整個按鈕都會隐藏并且不會占用布局空間
如圖2.5.1所示,按鈕“DebugDestroySession”的子物體為“TextBlock”,并且
圖2.5.1
設定這個子物體的Behavior->visibility為Collapsed,則整個按鈕在運作時都會隐藏,并且不占用布局空間。
2.6、Cast To 自定義的GameInstance時失敗
在2.2中設定了預設的GameInstance為自定義的MyGameInstance類還是出現轉換失敗的情況,可以檢查下系統的配置檔案DefaultEngine.ini裡的GameInstanceClass是否為對應的自定義遊戲執行個體名,如圖2.6.1所示為出現錯誤時對應的名字不是我建立的GameInstance名,我建立的遊戲執行個體名字為“MyGameInstance”,将其修改過來即可。比如我建立的“MyGameInstance”藍圖腳本在如圖2.6.2所示的檔案夾下,則在DefaultEngine.ini裡預設GameInstanceClass下面添加一句“GameInstanceClass=/Game/Blueprints/MyGameInstance.MyGameInstance_C”
修改完了之後,一定要重新開機一下工程才可以使用。
圖2.6.1
圖2.6.2
2.7、 關卡藍圖的Event BenginPlay不執行
如果關卡Level1的Word Setting中設定了GameMode為自定義的模式,如圖2.7.1所示,則從别的關卡進入到該關卡時,如通過Open Level方法加載到Level1關卡時,Level1的關卡藍圖中Event BenginPlay會出現不執行的現象。隻需要将GameMode設定為None即可。
圖 2.7.1
2.8、 靜态網格Sockets屬性使用
如圖2.8.1所示,帽子的模型可以通過設定其Sockets屬性為head而快速放置帽子的位置。
圖2.8.1
2.9、新編譯或重新打開工程能解決很多問題
比如如圖2.9.1所示,同樣的兩個動畫狀态,上面的是編譯後帶幀率條的,下面的就沒有。不要覺得奇怪編譯一下就可以,如果還是不行,重新打開一下工程。
圖2.9.1
2.10、 動畫出現重複播發可能需要關閉循環
2.11、藍圖中自定義的事件有Replicate屬性而自定義的方法沒有
2.12、User Widget可以作為一個另外一個User Widget的一部分
比如建立了一個User Widget A,并且在A裡面有一個容器AC,再建立了一個User Widget B,可以直接将B建立完之後放置到容器AC中,如圖2.12.1所示的藍圖,建立完之後使用Add Child方法添加到容器AC中。
圖2.12.1
2.13、 純函數和非純函數的差別
如圖2.13.1所示,在建立函數的屬性中有一個Pure的選項,勾選即成為純函數,反之為非純函數。純函數和非純函數的差別主要有:
圖 2.13.1
用途不一樣:純函數通常用于隻輸出資料值的 getter函數或運算符;調用方式不一樣:純函數不需要執行引腳,非純函數需要執行引腳,并且是作為輸入調用,如圖2.13.2的純函數
圖 2.13.2
“SetPlayerNumber”作為藍圖“Cast To MyPlayerState”的輸出調用時是不會執行的,必須作為輸入時才可以調用,如圖 2.13.3所示,當純函數“SetPlayerNumber”所謂“New Var 0”的輸入端調用函數時會執行。也即純函數連接配接到資料引腳,當需要依賴它們的資料時,編譯器會自動執行它們。
圖2.13.4
2.14、在事件圖中可以使用Delay方法,在自定義的方法中不能使用
如圖2.14.1所示的Delay藍圖方法是在藍圖的事件圖章建立的,當複制到方法中時提示不能複制,如圖2.14.2所示。這也就意味着Delay隻能在事件中使用不能在方法中調用,但是我想要在調用方法後執行一段延遲的功能要如何實作,隻能通過方法後面調用自定義的事件了,略顯得繁瑣了些。有點類似于Unity的協程,單獨在方面裡面使用yield關鍵字是無法建立延遲的效果,必須要方法裡調用一個建立的協程才能實作。
圖2.14.1
圖2.14.2
方法中不能調用的方法還有
- 和Session有關的所有方法,如Create Session、Destroy Session、Find Session等;
- Timeline方法,但Set Timer by Function Name可以調用
目前總結到的就這麼多,後續再補充。
三、總結
整理的都是平時遇到的問題,比較雜亂,不過有些問題還是很有幫助;