我想讓網絡代碼與我的遊戲邏輯分開。我不僅需要這樣做才能在單人遊戲模式和多人遊戲模式之間共享遊戲邏輯,我還希望能夠分離關注事物。讓Unity網絡代碼與遊戲邏輯分開
我目前的做法是爲我的網絡相關類生成代碼,使其具有在線和離線版本。我用T4模板做這個。
產生的階級是這樣的:
單機/單人版本:
// T4 GENERATED CODE
// Head (Singleplayer version)
class StandaloneHelloWorld : MonoBehaviour, IHelloWorld
{
private string name;
public void SayHello()
{
SayHelloInternal();
}
// Body
public string Name
{
get { return name; }
set { name = value; }
}
void SayHelloInternal()
{
Debug.Log(Name + ": Hello World");
}
}
多人版本:
// T4 GENERATED CODE
// Head (Multiplayer version)
class NetworkedHelloWorld : NetworkBehaviour, IHelloWorld
{
[SyncVar]
private string name;
public void SayHello()
{
CmdSayHello();
}
[Command]
void CmdSayHello()
{
RpcSayHello();
}
[ClientRpc]
void RpcSayHello()
{
SayHelloInternal();
}
// Body
public string Name
{
get { return name; }
set { name = value; }
}
void SayHelloInternal()
{
Debug.Log(Name + ": Hello World");
}
}
它們共用一個接口來隱藏從呼叫者的實現:
interface IHelloWorld
{
string Name { get; set; }
void SayHello();
}
因此,您可以看到,兩個實現使用相同的主體,共享大部分代碼,而入口點取決於是否聯網。 另請注意,這兩個實現繼承了不同的基類。
優點:
- 單人代碼具有朝向聯網代碼沒有依賴關係和(手動保持沒有具有至少)反之亦然
- 無重複碼
缺點:
- Unity中對接口的支持是有限的。我無法從編輯器內部引用IHelloWorld的場景實例。
- 用戶必須爲單人/多人遊戲模式
- 獨立的預製件經與T4 /代碼生成
你知道的更好的方法來處理這個染指?你是如何解決這個問題的?