本期教程將是整個系列教程的重點部分,這是最核心的內容。在本期中,我們將討論Harmony補丁的基礎知識。首先,讓我們來了解一下什麼是Harmony。
Harmony是一個用於對遊戲內方法進行補丁的庫,是我們經常使用的工具之一。
舉例來說,假設我們之前實現了一個按鍵R來觸發某項功能。但很多時候,我們並不希望通過按鍵來觸發功能,比如我想要我的收入翻倍,我不可能每按一次快捷鍵就會增加相應金額,那並非我們想要的效果。我們希望的是完全不需要按鍵,而是自動實現收入翻倍或其他隨機效果。這時候我們就需要使用Harmony,在其中找到“Harmony”,然後找到我們的手冊進行操作。
這期教程中,我會先介紹一些基礎的使用方法,如何創建一個簡單的後置補丁。什麼是後置呢?簡單來說,就是在函數執行完畢後再執行其他操作。與之相對應的是前置,即在函數即將執行之前先執行其他操作。通過這兩種方式,我們可以實現大多數功能。
在mod製作中,後置和前置是最常用的兩種技術。接下來,我們將編寫一個後置補丁,當遊戲中顯示傷害數字時,在控制檯打印出造成的傷害值。我們將編寫一個靜態方法,確保函數命名符合習慣格式,以便更好地管理代碼。接下來,我們將把這個函數轉換為後置補丁,通過藍圖編輯器添加必要的設置來實現我們的目標。
接著,讓我們優先創建一個標籤。在這裡,我們添加一個名為"HAMMCOFFIX"的標籤,這是一個持續生效的標籤。這個標籤可以寫在同一行,也可以另起一行,我通常會選擇寫在同一行並在逗號旁邊加上"pass"。
首先,我們將第一個參數選為函數類型。接下來是函數名的參數設置。完成後,我們就成功創建了一個後置補丁。但目前我們還沒有將其注入到遊戲中,參數方面需要進一步調整。
在此過程中,我們可以查看參數的獲取方式。通過下劃線兩次的方式(__instance)代表對象本身,而"In test"則表示對象發生時的調用者。如果函數有返回值,我們可以在這裡處理返回值。"set"的作用是定義了一個後置定位,用於在前置和後置之間傳輸數據。
在最後,參數名稱需要具體指明,數量要保持一致。通過複製粘貼方法可以獲取數量,並輸出結果。另外,需要注意的是由於靜態屬性無法直接使用,我們可以將其保存為靜態變量或將插件製作成一個單元進行間接使用。最後,我們可以使用內插字符串的方式進行輸出,美元符號表示內插字符串。
如果對內插字符串不熟悉,建議學習一下基礎知識,以便更好地理解。
我們可以記錄傷害是多少G。這樣,一個後置補丁就寫好了,但目前尚未生效,因為我們還沒有進行注入。之前的步驟已經無用,需要特別註釋掉。
接下來,我們將創建一個"Harmonycreate and party"類,並輸出一個類。記住,這個類的作用是自動創建一個哈密實例,並對該類下所有帶有MTT標籤的函數進行補丁操作。因為手動一個一個輸出非常繁瑣,在本期視頻中不涉及手工操作的內容。
在未來的教程中會介紹如何使用注入,實際情況下很少需要,除非遇到大量相似命名的情況。絕大多數情況都不需要使用這種方式,因為Harmony已經能解決95%以上的問題。
重新生成後,啟動遊戲,放置一個防禦塔,然後檢查輸出,確認傷害值已被記錄。如果塔的攻擊力是24,而敵人有防禦值,那麼我們成功完成了最基礎的後置補丁。
接下來,我們將編寫一個前置補丁。雖然和後置補丁相似,但前置補丁會返回一個boss對象。需要注意的是要做出區分,並學習相關知識。
另外再說一下,在之前的代碼中,如果有未使用的參數,可以將其刪除,只保留使用到的參數。可以複製一份代碼並修改,這樣的代碼重構也是有效的。
在前面所提到的post中,將其改為pr就表示前置補丁。在前置補丁中返回一個布爾值,用來表示是否要攔截原函數的執行。如果返回true,則在執行完自己的代碼後會繼續執行原函數;若返回false,則執行完自己的代碼後原函數會被直接拋棄,不再執行。
這種方式通常有兩個主要用途,比如傳入傷害值並輸出,或者在前置處對數值進行修改。如果要修改數值,可以使用REF關鍵字對實際數值進行修改。例如,無論造成多少傷害,都傳入9999這個數值。預期的結果是顯示的傷害數字為9999,但實際傷害仍然是六。
對於否則情況,當再次建立一個塔時,觀察發現下一波攻擊敵人沒有任何輸出,但控制檯中輸出了。這說明函數已經執行過,但實際體現被拒絕了。這種拒絕操作通常很少需要,主要用來重寫輸入參數,或者重新實現邏輯。
重寫一般在你需要改變具體實現邏輯時使用,比如生成敵人的邏輯等。你想要自定義生成規則時,可以拒絕原函數並進行重寫。學會了這些基礎使用方法,已經能夠實現許多效果。分析代碼功能,修改參數或重寫就能完成任務。