我想让网络代码与我的游戏逻辑分开。我不仅需要这样做才能在单人游戏模式和多人游戏模式之间共享游戏逻辑,我还希望能够分离关注事物。让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 /代码生成
你知道的更好的方法来处理这个染指?你是如何解决这个问题的?