Ich möchte den Netzwerkcode von meiner Spiellogik getrennt halten. Ich muss das nicht nur tun, um die Spiellogik zwischen Einzel- und Multiplayer-Spielmodi teilen zu können, ich möchte es auch wegen der Trennung von Sorgen.Den Unity-Netzwerkcode getrennt von der Spiellogik halten
Mein aktueller Ansatz besteht darin, den Code für meine netzwerkbezogenen Klassen so zu generieren, dass es eine Online- und eine Offline-Version gibt. Ich mache das mit T4-Vorlagen.
Die resultierenden Klassen wie folgt aussehen:
Standalone/Einzel Version:
// 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");
}
}
Multiplayer-Version:
// 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");
}
}
Sie beide teilen eine Schnittstelle, die Umsetzung von den Anrufern zu verstecken:
interface IHelloWorld
{
string Name { get; set; }
void SayHello();
}
So wie Sie sehen können, verwenden beide Implementierungen den gleichen Körper und teilen den meisten Code, während die Einstiegspunkte davon abhängen, dass die Implementierung vernetzt ist oder nicht. Beachten Sie auch, dass die beiden Implementierungen unterschiedliche Basisklassen erben.
Vorteile:
- Single Code keine Abhängigkeiten Richtung vernetzten Code hat und umgekehrt
- Keine doppelten Code
Nachteile (keine, die manuell zumindest beibehalten werden muss):
- Die Unterstützung für Schnittstellen in Unity ist begrenzt. Ich wäre nicht in der Lage, Szeneninstanzen von IHelloWorld aus dem Editor heraus anzusprechen.
- mit getrennten Prefabs für Einzelspieler-/Multiplayer-Modi Mit
- zu halten mit T4/Code-Generierung einzumischen
Ergänzender besserer Möglichkeiten kennen, damit umzugehen? Wie hast du dieses Problem gelöst?