![](/img/trans.png)
[英]Script in C# is meant to move clouds in Unity but failed to work properly
[英]How to properly build a script architecture in unity C#
一段時間以來,我一直在使用 C# 編寫統一游戲。 在每場比賽之后我變得越來越有經驗,我的代碼改變了,我開始使用最佳實踐。
然而,今天我有一個問題:如何正確構建應用架構?
我不喜歡我的代碼中有很多字段與主邏輯混在一起,我覺得不應該這樣。 到目前為止,我找到的解決方案是創建 2 個類,一個包含所有信息,第二個實現所有邏輯,但是所有邏輯所在的 class 變得依賴於帶有信息的 class。
告訴我,更有經驗的同事,什么是正確的做法?
首先,嘗試將包含邏輯的 class 划分為更小的部分,以便每個部分只負責一項職責並執行一項特定的操作。 然后將這些部分移動到其他類中。 在拆分邏輯 class 時嘗試找到平衡。 為每種方法制作新的 class 是一個極端,擁有一個具有所有邏輯的 class 是另一個極端,解決方案介於中間。 完成后繼續下一步。
下一步是命名這些類。 這似乎很容易,但它真的很重要。 一些好的命名示例:
命名技巧:
下一步是分離不同的層。 盡量使邏輯獨立於 UI,這樣 UI 可以在不影響邏輯層的情況下更改或刪除。 繼續播放器子系統的示例,如果需要,使 PlayerMovement 獨立於它使用抽象的輸入類型,因此它可以是鍵盤輸入或操縱桿輸入,而 PlayerMovement 不在乎哪一個。 還要使 PlayerInput 獨立於是否有人使用它,例如使用屬性或事件。 它將允許創建一次組件,然后在任何項目中使用,而無需重寫所有內容。
談到從邏輯中划分數據,它很可能會導致具有兩個非常相似的 inheritance 層次結構,因此最好將數據存儲在使用它的位置,這與設置文件或大量數據的特殊情況不同。
這些是關於這個主題的基本技巧,當然構建項目架構要比這復雜得多,但這些都是很好的開始。
你可以繼續使用 Solid(這里已經提到了一些原則)和 Zenject 之類的東西
每個項目都有自己的需求,架構會根據這些需求而改變。
起點應該是您的 SOLID 原則,因為許多事情都基於這些原則,例如 IoC,它基於依賴倒置原則。
然后,您可以使用設計模式將這些原則應用於您的需求。
在熟悉了設計模式之后,您可以查看一些已經編寫好的框架,例如 Strange(IoC + MVCS) 和 Entitas(ECS)。
我感覺你可能只是因為你可以將復雜的設計模式合並到你的代碼中,而不是因為它解決了任何問題。
您可以使用接口來將系統類與數據類分離:
public interface IHealth
{
int Current { get; set; }
int Max { get; set; }
}
public class Health : IHealth
{
public int Current { get; set; }
public int Max { get; set; }
}
public class DamageCommand
{
public void Invoke(IHealth health, int amount)
{
health.Current -= amount;
}
}
然而,在你走這條路之前,我建議你先停下來問問自己,這是否為你提供了任何實際的切實好處來抵消復雜性的增加?
刪除具體類之間的依賴關系通常對於它可以提供的具體好處很有用,例如使代碼更容易進行單元測試,並且更容易在以后將 class 與另一個實現交換。 但是當我們只討論純數據對象時,您真正會多久遇到一次想要交換實現的場景?
如果您喜歡將數據和系統分開,那么我建議您研究 Unity 的實體組件系統 (ECS)以獲得良好的面向數據的架構。 或者,如果您想構建自己的架構,仍然可以考慮使用面向數據的設計,因為這可以極大地提高性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.