2017-02-02 4 views
2

Haftungsausschluss: Also der Titel möglicherweise nicht übermäßig genau, aber es ist die nächste, die ich bekommen konnte.Wie erstellt man eine Beziehung zwischen zwei Spielobjekten ohne Vererbung?

Also mache ich ein Strategiespiel in Unity und die Idee ist, dass es verschiedene Arten von "Einheiten" geben wird und sie können aus einem Pool von Waffen wählen. Diese verschiedenen 'Einheiten' erben alle von ihrem Einheitentyp, dann erbt der Einheitstyp von einer abstrakten Grundeinheitseinheit und auf der anderen Seite ist es eine ähnliche Geschichte, die Waffe erbt vom Waffentyp, der dann von einem Basis- 'Waffen'-Abstrakt erbt Klasse. Das ist nicht das Problem, das Problem besteht darin, die Beziehung zwischen der spezifischen Einheit und der ihr zugewiesenen Waffe herzustellen, damit die Einheitenklasse sehen kann, welche Waffe sie hat und ihren Angriff auf die zugewiesene Waffe stützt, indem sie auf die enthaltenen Variablen zugreift. sowie; Reichweite, Schaden etc.

Weil ich am besten visuell arbeite ich habe zeigt ein Diagramm gezeichnet, was ich meine

enter image description here

So Einheit an der Spitze diejenigen, die immer noch verwirrt, meine Frage zu helfen, ist die Einheit abstrakte Klasse, die ich zuvor erwähnt habe, dann ist Mensch der Einheitstyp, dann Soldat ist die spezifische Einheit, die später installiert wird, diese (wieder wie zuvor erwähnt) wird für Waffe gespiegelt.

+1

Ist das komplexer ist als eine Waffe Schlitz an der Einheit zu denen Waffen zugeordnet werden? – Theo

Antwort

0

Auf etwas, was Sie tun können, ist eine öffentliche Eigenschaft (mit Getter und privaten Setter) für die aktuelle Waffe.

public class Soldier : Human 
{ 
    public Weapon CurrentWeapon {get; private set;} 
    [...] 
} 

Sie können dann auf die Waffe aus dem Soldaten mit:

public Soldier mySoldier = new Soldier(); 
mySoldier.CurrentWeapon; 

Hoffe, es hilft!

0

Ich würde vorschlagen, Sie injizieren die Waffen auf Soldaten, wenn sie initialisieren, dann lassen Sie den Soldaten entscheiden, welche Waffe sie verwenden möchten.

Zum Beispiel:

public class Solider : Human { 

    IEnumerable<IWeapons> _allAvailableWeapons; 
    IWeapon _selectedWeapon; 

    public Soldier(IEnumerable<IWeapon> weapons) 
    { 
     _allAvailableWeapons = weapons; 

     // some conditions 
     // Select the correct weapon for this soldier 
     _selectedWeapon = _allAvailableWeapons.Single(x => x.Id == "Something"); 
    }  
} 

public class Civilian : Human 
{ 
    public Civilian() 
    { 
    } 
} 
1

Unity ist Component based Motor so bedeutet dies, dass Sie Component verwenden sollten, die kann oder kann nicht vererbt werden (je nach Bedarf). Aber im Grunde genommen ohne Vererbung können Sie dies wie so:

// Unit.cs 
public class Unit : Component { 
    // logic for your Unit Component 
} 

// Human.cs 
[RequireComponent(typeof (Unit))] 
public class Human : Component { 
    Unit _parent; 

    public void Initialize(){ 
     _parent = (Unit)GetComponentInParent(typeof(Unit)); 
    } 
} 

// Soldier.cs 
[RequireComponent(typeof (Human))] 
public class Soldier: Component { 
    Human _parent; 

    Weapon _meWeapon; 

    public void Initialize(){ 
     _parent = (Human)GetComponentInParent(typeof(Human)); 
    } 

    public void AttachWeapon(Weapon wpn){ 
     _meWeapon = wpn; 
    } 

    public void DetachWeapon(){ 
     if(_meWeapon != null) { 
      Destroy(_meWeapon); 
      _meWeapon = null; 
     } 
    } 
} 

Dann können Sie das gleiche tun mit Ihrem Weapon, RangedWeapon und AK47. Aber diese Methode ist im Grunde nicht effizient, weil Sie sich auf andere Component s beziehen und Code in jeder einzelnen Component ändern müssen, wenn Sie etwas verbessern möchten. Bessere Weg von jedem von diesen erben würde:

public class Unit : Component { 
    // logic for your Unit Component 
} 

public class Human : Unit { 

} 

public class Soldier : Human { 
    Weapon _weapon; 

    public void AttachWeapon(Weapon wpn){ 
     _meWeapon = wpn; 
    } 

    public void DetachWeapon(){ 
     if(_meWeapon != null) { 
      Destroy(_meWeapon); 
      _meWeapon = null; 
     } 
    } 
} 

Jetzt müssen Sie beschäftigen nur mit einem Component und Sie können sicherstellen, dass Weapon ‚s Typ für diese besondere Component ausreichend ist:

//Soldier component 
if(wpn is AK47) { 
    _meWeapon = wpn; 
} 

Und natürlich, wenn Sie Unity 's eingebaute Methoden wie Awake(), Update() benötigen, dann können Sie von MonoBehaviour anstelle der Basis Component Klasse erben.

Um dann in der Lage sein, um Waffen wechseln Sie wie einfach tun, einfach anrufen:

Soldier solider = GetComponent<Soldier>(); 
soldier.AttachWeapon(AddComponent<AK47>()); 

Dann in Ihrem Soldier Komponente, die Sie den Verweis auf diese bestimmten Weapon verwenden können. Und lösen Ihre AK47 Sie können auch anrufen:

Soldier soldier = GetComponent<Soldier>(); 
soldier.DetachWeapon(); 
Verwandte Themen