我想将网络代码与我的游戏逻辑分开。我不仅需要这样做才能在单人和多人游戏模式之间共享游戏逻辑,而且因为关注点分离的事情,我也想要它。
我目前的方法是为我的网络相关类生成代码,以便有在线和离线版本。我使用 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 的场景实例。
- 必须为单人/多人游戏模式维护单独的 Prefab
- 不得不干预 T4/代码生成
你知道更好的方法来解决这个问题吗?你是如何解决这个问题的?