發表文章

UE4 C++ Delegate

圖片
參考過的文章:  https://blog.csdn.net/netyeaxi/article/details/81673691 https://zhuanlan.zhihu.com/p/46358868 https://www.twblogs.net/a/5b7cd6ef2b71770a43dcd2b0 先介紹自己使用過的Delegate好了 若是你的Delegate打算在C++中宣告與使用,且也能在BP中被綁定後續要執行的內容 那你的Delegate必須被宣告為「DECLARE_DYNAMIC_MULTICAST_DELEGATE」類性的delegate 且後續宣告delegate物件時需要加上 UPROPERTY(BlueprintAssignable)來告訴UE4這是可以在BP中被呼叫且塞入綁定內容的 自己寫過的範例: 宣告了一個FUpdateUI,可以傳兩個參數 的 這樣一個類型的Delegate 這邊的兩個參數是  float Score; float Health; 兩個,因為UE4 C++的delegate要求所以看起來是一個delegate名稱+4個參數 其實是一個名稱,一個型別對一個參數 接著,我宣告使用FUpdateUI這個類型的Delegate 「 UpdatePlayerUIDelegate 」,並且他是可以在UE4 BP中被bind要執行的function的 像這樣,我就將寫在PlayerController中的Delegate 「 UpdatePlayerUIDelegate 」他一旦被broadcast的時候要執行的事情寫在BP,用BP拉好了要執行的行為。 若是不需要在BP中被呼叫使用到,可以宣告到DECLARE_MULTICAST_DELEGATE()類型的delegate即可 宣告了一個不傳任何參數,只在C++內使用的delegate FonEnemyDead類型Delegate 宣告使用這個類型的Delegate 「 EnemyDeadDelegate 」 在生成新敵人的時候,我將一個function bind綁定進去了敵人的物件中 當敵人被生成的時候,我將生成新敵人的function bind到enemy死亡時broadcast廣播的delegate EnemyDeadDelegate.Broadcast(); 如此一來,當敵

Unreal C++ - UPROPERTY() 及 UFUNCTION()常見設定差異

UPROPERTY( )   UPROPERTY(EditAnywhere) :  表示此變數可在Detail視窗 (Property Windows)變更 UPROPERTY(EditDefaultsOnly) :  表示變數僅可在Detail視窗中被修改 UPROPERTY(Category = "AAAA") :  表示此變數在grapchi與BP編輯工具中可以變顯示收納在某個分類中 UPROPERTY(BlueprintReadOnly) : 表示此變數在BP中只能被Read,不能被修改   UPROPERTY(BlueprintReadWrite) :  表示此變數在BP中可被Read可被Write UPROPERTY(BlueprintReadWrite, meta = (BindWidget)) 表示此變數和BP中某個 同名 同型別的Widget綁定,會指向同一個物件 UPROPERTY(BlueprintAssignable) 用在Delegate上,表示此Delegate可在BP中被Assign (像是Bind?) UPROPERTY(DisplayName="Property Name") 在BP上的顯示名稱,取代掉C++中宣告的名稱 UFUNCTION( ) UFUNCTION(BlueprintCallable) 表示此C++ Function可以在BP被呼叫使用 UFUNCTION(BlueprintImplementableEvent) 表示此C++Function是在BP中被實作出來的,意思是你要先去BP把他的程式邏輯拉好,然後在C++這邊送好參數去讓這個BP處理 UFUNCTION(Client, ...) 表示為Client RPC function,呼叫只在client端上執行的function UFUNCTION(Server, ...) 表示為Server RPC function,呼叫只在Server端上執行的function UFUNCTION(NetMulticast,...) 表示為Multicast RPC function,若由server端呼叫這個,則Server端與所有有這個actor的client都會執行這個function 。(詳情見UE4 RPC / Replica

Clean Code隨筆筆記整理

圖片
Ch1. Clean code 好的程式碼應具有以下特質 能通過所有測試 沒有重複的程式碼 能充分表達意思 內容很短,最少量的class、Method \ Function存在 盡量少的互相依賴關係 有意義的命名,應該要光看遍數名就能懂這個變數的存在用意 Ch2. 有意義的命名 請讓命名能夠展現他的意圖。 不要用一些自己才知道是什麼意思的方式來命名: 取名不應太過相似,要有明確區別 reports report_list the_reports 都是複數的報告,請問誰是誰 使用一些Searchable,可被IDE搜尋的到的名稱(不要跟撞名或前面掛一堆一樣的前綴增加搜尋難度或演殘選錯的機會) Class和Instance不要同名 用m來代表class的member前綴不是很必要,可以直接用this 避免想到甚麼就打甚麼,可以的話明確定義。ex: for(int i = 0) <=可以的話就不要用i了,告訴他 i是甚麼吧 變數、class、object應該使用「名詞」或名詞片語來命名 Function應該使用「動詞」或動詞片語來命名 取名時盡量避免雙關。ex : Add就有 數學加法 和 加上、添上的意思。 像後者的話我們可以取名為append或extend 通常看你code的都會是工程師,取名以工程師看得懂為主,不需要刻意取得太過艱深。 如果日常單子不足以應付取名,再以專案需求領域的專業術語單字來取名。 Ch3. Function Function內容要盡量輕量短小為好 一個Function只做一件事,也只做好一件事 一個Function只作一個層級的事。抽象層級: https://www.itread01.com/content/1520062710.html (看起來跟作用範圍有關) ex: getHtml();//高層級        String pagePathName = PathParser.render(pagePath)  //中層級        .append("\n")  //低層級 「由上至下閱讀原則」,由上層層級開始往下層level編寫 最好的參數類型就是沒有參數 如果一個function需要到兩個以上參數,可以考慮把參數包成class來傳給function Ch4. 註解 有益的註解;對意圖做解釋 寫//TOD

C/C++筆記 : Pass by Value 與 Pass by Reference 與 Pass by Address的差別

圖片
剛剛作為新鮮人在公司感覺有點被再教育了的感覺,一方面可能也是C#跟Java這種寫習慣了突然換回大一在用的C++結果被洗臉的感覺。再次感受到C#真的是很容易上手的語言,也重新回想起C++的pointer難關的感覺。 不過關關難過還是得要關關靠腰關關過(嘆),趕快趁著好人主管教完來做個筆記。 先來張可愛的ミク壓壓驚 喔,爽 ------------------------------------------------ 這邊自己覺得要先講一下C++變數的概念。 C++用了兩個容器來存所有的變數 如果你是用 new 出來的變數,他到死都不會被delete和釋放出記憶體空間。 這類變數會被放在Heap中 而其他非透過new的來宣告建立instance化的變數則是會被放在stack中,並有自己的生命周期(注意看一下{ }包到哪裡) 範例中的class結構 :  Pass by Value 其實就是我們一般在C# / Java的那種寫法,沒有指標,沒有地址 使用這種傳法在C++的話會有一個情況需要去注意。 那就是, 他並不是把你的參數傳進去,而是copy了一份你的參數內容然後在收到的那個function內產生一個一樣的變數去接你copy出來的結果 ,也就是說 你在這邊修改變數的值,並不會直接連動影響到外部的值 ,兩邊變數的生命週期並不一樣,因為是兩個不一樣的變數。(C#就會連動了,這跟C#的特性有關 ,所以珍惜生命遠離C++) 然後我們在main裡寫這樣一段程式 :  最後結果: 在main裡面的Point pt此一物件,存在0042FC1C這個記憶體位置 外面function中的p, 他接了pt的資料,但是並不是pt本身 ,是新創的一個變數,存在0042FB44這個記憶體位置中 外面function中的p, 0042FB44這個記憶體位置裡面存了數值2 但是在main裡面的Point pt,存在0042FC1C ,因此外面function中的p (0042FB44)裡面的值變為2的時候,Point pt (0042FC1C)裡面的oint pt (0042FC1C)裡面的值並沒有跟著變, 所以main裡面的pt並不會收到p的變化,因為已經是兩個分開出來的兩個變數了 Pass by Reference  以往以為Pass by reference就是用pointer來傳值這樣。