簡體   English   中英

如何在統一 C# 中正確構建腳本架構

[英]How to properly build a script architecture in unity C#

一段時間以來,我一直在使用 C# 編寫統一游戲。 在每場比賽之后我變得越來越有經驗,我的代碼改變了,我開始使用最佳實踐。

然而,今天我有一個問題:如何正確構建應用架構?

我不喜歡我的代碼中有很多字段與主邏輯混在一起,我覺得不應該這樣。 到目前為止,我找到的解決方案是創建 2 個類,一個包含所有信息,第二個實現所有邏輯,但是所有邏輯所在的 class 變得依賴於帶有信息的 class。

告訴我,更有經驗的同事,什么是正確的做法?

首先,嘗試將包含邏輯的 class 划分為更小的部分,以便每個部分只負責一項職責並執行一項特定的操作。 然后將這些部分移動到其他類中。 在拆分邏輯 class 時嘗試找到平衡。 為每種方法制作新的 class 是一個極端,擁有一個具有所有邏輯的 class 是另一個極端,解決方案介於中間。 完成后繼續下一步。

下一步是命名這些類。 這似乎很容易,但它真的很重要。 一些好的命名示例:

  1. PlayerMover 或 PlayerMovement,class,其職責是將玩家移動到選定的方向。
  2. PlayerInput,class,其職責是與輸入交互並將其翻譯成其他組件可以理解的語言。 例如將鍵盤輸入翻譯成 Vector3,因此 PlayerMovement 不必擔心按下了哪個鍵,它只知道要移動到哪里,因此他們的職責不會過多地攔截。

命名技巧:

  1. 類代表實體,所以它們應該被命名為實體,這意味着它們的名字應該是名詞
  2. 如果給 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM