Jump to content
Unity Insider Forum

Datenverarbeitung mit Scrited Objects


Zionfiction Studio

Recommended Posts

  • Antworten 60
  • Created
  • Letzte Antwort

Beides geliked..

 

Aber wie finde ich den Fehler...

am besten ich lösche und schreibe nochmal.

 

ACHSOOO

PLING

 

:blink:

 

das brauch ich nich uff irgendwas ruffmachen..daher auch die Meldung...es arbeitet auch so...ich hab dann aber nur die Logs zum prüfen...n bissel Editorcheck wär schon geil...

 

Aber wie kann ich nun die Inhalte der Liste sehen, wenn es nicht an nem Objekt hängt..außer einzelne Indexe anzusprechen...

 

für die scriptable Objekts is doch bestimmt besser wenn man sowas im Editor sieht, oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Status:

so geht das hinzufügen im Test schonmal.

meine Quelle für Werte heißt:

NewTowerController.contianervariable(zum Beispiel HP)

bei 11 Übergaben is das mist....wieder was gelernt..

 

In diesem Status würde mir also ein Listenobjekt erstellt mit den Werten des Editors, sofern ich deren Quelle dort eintrage.

 

Könnt ihr mich jetzt an den Punkt begleiten wo ich das Erstellte Testobjekt mit nem Gameobjekt gleichsetze?

 

Towersets
public class towerset : MonoBehaviour
{
 public int health;
 public int firepower;
 public int firerate;
 public int speed;
 public int range;
 public int energy;
 public int topID;
 public int baseID;
 public int gunID;
 public int ammoSET;
 public int ammoSELECTION;

 public towerset(int hp,int dmg,int rate,int spd,int rnge,int nrg,int top, int bse, int gun,int ammo, int ammoset)
 {
  health = hp;
  firepower = dmg;
  firerate = rate;
  speed = spd;
  range = rnge;
  energy = nrg;
  topID = top;
  baseID = bse;
  gunID = gun;
  ammoSET = ammo;
  ammoSELECTION = ammoset;
 }
}

handler
public class handler : MonoBehaviour
{
public List<towerset>towers = new List<towerset>();

void Awake()
{
 towers = new List<towerset>();
}
// Use this for initialization
void Start ()
{

}

// Update is called once per frame
void Update ()
{
 if(Input.GetMouseButtonUp(0))
 {
  towers.Add(new towerset(0,0,0,0,0,0,0,0,0,0,0));
 }
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

und erweitert auf den Editorcontainer.

 

So is die Übergabe nicht ganz so wild...

 

der Handler ist auch für die Zuweisung der entsprechenden Gameobjekte da oder passiert das von woanders?

 

public int hp = NewTowerController.TOWERcurrhealth;
public int dmg = NewTowerController.TOWER_FirePower;
public int rate = NewTowerController.TOWER_FireRate;
public int speed = NewTowerController.TOWER_Speed;
public int range = NewTowerController.TOWER_Range;
public int energy = NewTowerController.TOWERenergy;
public int top = NewTowerController.TOWERtop_part;
public int mybase = NewTowerController.TOWERbase_part;
public int gun = NewTowerController.TOWERgun_part;
public int ammo = NewTowerController.TOWERammoset;
public int ammoSet = NewTowerController.TOWERammoselection;

towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Zuweisung würd ich nicht so machen. Du könntest super einen Array für sowas nutzen:

int[] values = new int[11] { ersterWert, zweiterWert, /* Alle 11 Werte */ }
towers.Add(new towerset(values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[10])); // Denk drank: Arrays fangen bei 0 an!

 

Es ist wenigstens etwas sauberer ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe jetzt ein Prefab gemacht, eigentlich leer mit einigen Spawnpoints (in 3dsmax, so das sie da sind wo ich sie haben will)

diese habe ich in den Code eingebaut.

Das Prefab trägt das Script Towerset.

Davon gibt es drei Stück. Sollen drei Sets sein.

 

An den Spawnpunkten sollen top,mybase und gun instantiatet werden(siehe script), Kennung per int

 

was brauch ich noch um hier das ganze zusammenzuführen?

public class towerset : MonoBehaviour
{
 public GameObject basespawn;
 public GameObject topspawn;
 public GameObject gunspawn;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Zuweisung würd ich nicht so machen. Du könntest super einen Array für sowas nutzen:

int[] values = new int[11] { ersterWert, zweiterWert, /* Alle 11 Werte */ }
towers.Add(new towerset(values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[10])); // Denk drank: Arrays fangen bei 0 an!

 

Es ist wenigstens etwas sauberer ;)

die werte füllt ein editor...der user also...kann ich nicht setzen...und dann schreib ich da dann quasi auch nur meine obigen kürzel rinn..is das nich einmal mehr?

Link zu diesem Kommentar
Auf anderen Seiten teilen

hier der ganze rödel:

Geht.drück ich im Editor SET wird ein Element im Editor unter Size hinzugefügt.

Das Prefab läßt sich im laufenden Zustand hineinziehen.

 

Ich bin hier hilflos verloren, ich schaffe den Zusammenhang nicht wie nun die Daten Schlußendlich zum Gameobjekt gelangen.

Die erzeugten Elemente sind ertmal leer.

Brauche um weiter zu arbeiten drei befüllte Prefabscripte mit den oben zusammengewerkelten Inhalten.

 

Kann ich einfach den index eines Eintrages mit einem Gameobjekt verbinden? Dann kann ich im editor dann einsetzen was ich mag...So wäre jetzt mein oberflächliches Verständnis zu dem Listenzeug

 

 

 

public class towerset : MonoBehaviour
{
 public GameObject basespawn;
 public GameObject topspawn;
 public GameObject gunspawn;

 public int health;
 public int firepower;
 public int firerate;
 public int speed;
 public int range;
 public int energy;
 public int topID;
 public int baseID;
 public int gunID;
 public int ammoSET;
 public int ammoSELECTION;

 public towerset(int hp,int dmg,int rate,int spd,int rnge,int nrg,int top, int bse, int gun,int ammo, int ammoset)
 {
  health = hp;
  firepower = dmg;
  firerate = rate;
  speed = spd;
  range = rnge;
  energy = nrg;
  topID = top;
  baseID = bse;
  gunID = gun;
  ammoSET = ammo;
  ammoSELECTION = ammoset;
 }
}
public class handler : MonoBehaviour
{
public int hp = NewTowerController.TOWERcurrhealth;
public int dmg = NewTowerController.TOWER_FirePower;
public int rate = NewTowerController.TOWER_FireRate;
public int speed = NewTowerController.TOWER_Speed;
public int range = NewTowerController.TOWER_Range;
public int energy = NewTowerController.TOWERenergy;
public int top = NewTowerController.TOWERtop_part;
public int mybase = NewTowerController.TOWERbase_part;
public int gun = NewTowerController.TOWERgun_part;
public int ammo = NewTowerController.TOWERammoset;
public int ammoSet = NewTowerController.TOWERammoselection;

public NewTowerGen _Gen;
public bool enableDefine = false;

public List<towerset>towers = new List<towerset>();


void Awake()
{
 towers = new List<towerset>();
 _Gen = GetComponent<NewTowerGen>();

}
// Use this for initialization
void Start ()
{

}

// Update is called once per frame
void Update ()
{
 //towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
 defineSet();

}
void defineSet()
{
 if(_Gen.SETnumber == 1 && enableDefine == true)
 {
  towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 2&& enableDefine == true)
 {
  towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 3&& enableDefine == true)
 {
  towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
}
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine towerset klasse erbt von MonoBehaviour, wenn du diese per new erzeugst meckert Unity, ist der bezug auf MonoBehaviour an der Stelle nötig oder reicht eine normale klasse bzw ScriptableObject?

 

ScriptableObjects müssen mit ScriptableObject.CreateInstance und MonoBehaviours mit gameObject.AddComponent erzeugt werden.

 

Deine towersets haben deswegen keine GameObjecte (*spawn) weil diese nie zugewiesen werden. Wenn du noch keine Liste/Array mit allen möglichen Elementen erstellt hast wäre es ein guter Moment irgendwo diese Liste zu erzeugen. Du könntest diese dann verwenden um anhand dieser Liste und den ElementIndexen neue GameObjekte zu erzeugen (Instantiate).

 

Kurz nochmal zusammengefasst:

  1. Deine Towersets dürfen nicht mit new erzeugt werden solange sie von MonoBehaviour erben.
  2. Deine Towersets enthalten nichts weil du keine GameObjekte erzeugst.
  3. Du brauchst eine Tabelle (eine einfache Liste reicht hier vermutlich schon) mit allen möglichen bauteilen die du als Stempel verwenden kannst um deine Towersets aufzubauen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine towerset klasse erbt von MonoBehaviour, wenn du diese per new erzeugst meckert Unity, ist der bezug auf MonoBehaviour an der Stelle nötig oder reicht eine normale klasse bzw ScriptableObject?

 

ScriptableObjects müssen mit ScriptableObject.CreateInstance und MonoBehaviours mit gameObject.AddComponent erzeugt werden.

 

Deine towersets haben deswegen keine GameObjecte (*spawn) weil diese nie zugewiesen werden. Wenn du noch keine Liste/Array mit allen möglichen Elementen erstellt hast wäre es ein guter Moment irgendwo diese Liste zu erzeugen. Du könntest diese dann verwenden um anhand dieser Liste und den ElementIndexen neue GameObjekte zu erzeugen (Instantiate).

 

Kurz nochmal zusammengefasst:

  1. Deine Towersets dürfen nicht mit new erzeugt werden solange sie von MonoBehaviour erben.
  2. Deine Towersets enthalten nichts weil du keine GameObjekte erzeugst.
  3. Du brauchst eine Tabelle (eine einfache Liste reicht hier vermutlich schon) mit allen möglichen bauteilen die du als Stempel verwenden kannst um deine Towersets aufzubauen.

kann ich nochmal den Link zu den scriptable Objekt Tut hier haben?

Nein es muß nicht unbedingt erben, so dachte ich nur sehe ich erstmal ob werte eingetragen weren

 

zu2)

dabei brauche ich konkrete Hilfe. Ich kenne instantiate aber ich wüßte nicht wie ich das in einer Liste anwenden soll/muss

also: ich kann das nicht herleiten...

 

zu3)

das rumgescrippte oben ist der versuch drei zu bewerkstelligen. Das bedeutet ich stecke offensichtlich an dem Punkt fest.

 

Das habe ich:

3 Gameobjekte mit dem Script und Spawndummies

den handler

die Liste mit den Settings (Werte des Towers.

 

Meine Frage an dem Punkt war:

WIE kann ich weiter machen...demnach wäre das nächste die Blaupause fertig zu haben...Wie kommen jetzt da die Gamobjekte in Verbindung hinein..ein simples Beispiel reicht oder n Link wo ich nochmal lesen muß...aber in Bezug aug Instatiate Gameobjekt via Lists...oder so

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du meinst das hier? http://forum.unity-community.de/topic/3989-unity-serialization/ Entweder ScriptableObject oder deine Klasse die von nichts weiter erbt mit [serializable] markieren.

 

Du kannst wenn du dein towerset erzeugt hast deine GOs erzeugen, entweder baust du dazu eine Start() Methode in deine towerset Klasse ein,l oder du steuerst das ganze expliziter indem du eine beliebige andere Methode public in dein towerset implementierst. In jedem Fall dürfte die implementierte methode dann sowas in der Art machen:

 

public class Towerset
{
 ..
 public void Start()
 {
   basespawn = (GameObject)GameObject.Instantiate(TowerPrefabs.Bases[baseID]);
topspawn = vGameObject.Instantiate(TowerPrefabs.Tops[topID]);
gunspawn = (GameObject)GameObject.Instantiate(TowerPrefabs.Guns[gunID]);

/// weitere Konfigurations arbeiten
...
 }
}

 

Wichtig oder interessant an dem Beispiel hier ist die Benutzung von TowerPrefabs, welche ich mir als einfache Klasseninstanz vorstelle welche ca so aussieht:

 

public class TowerPrefabs : ScriptableObject
{
 public GameObject[] Bases;
 public GameObject[] Tops;
 public GameObject[] Guns;
}

 

Die Klasse kann auch eine Komponente oder was anderes sein, du musst die Instanz dazu nur noch irgendwie an deine Towersets bekommen, was aber nur ein kleines Randproblem sein dürfte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du meinst das hier? http://forum.unity-community.de/topic/3989-unity-serialization/ Entweder ScriptableObject oder deine Klasse die von nichts weiter erbt mit [serializable] markieren.

 

Du kannst wenn du dein towerset erzeugt hast deine GOs erzeugen, entweder baust du dazu eine Start() Methode in deine towerset Klasse ein,l oder du steuerst das ganze expliziter indem du eine beliebige andere Methode public in dein towerset implementierst. In jedem Fall dürfte die implementierte methode dann sowas in der Art machen:

 

public class Towerset
{
 ..
 public void Start()
 {
basespawn = (GameObject)GameObject.Instantiate(TowerPrefabs.Bases[baseID]);
topspawn = vGameObject.Instantiate(TowerPrefabs.Tops[topID]);
gunspawn = (GameObject)GameObject.Instantiate(TowerPrefabs.Guns[gunID]);

/// weitere Konfigurations arbeiten
...
 }
}

 

Wichtig oder interessant an dem Beispiel hier ist die Benutzung von TowerPrefabs, welche ich mir als einfache Klasseninstanz vorstelle welche ca so aussieht:

 

public class TowerPrefabs : ScriptableObject
{
 public GameObject[] Bases;
 public GameObject[] Tops;
 public GameObject[] Guns;
}

 

Die Klasse kann auch eine Komponente oder was anderes sein, du musst die Instanz dazu nur noch irgendwie an deine Towersets bekommen, was aber nur ein kleines Randproblem sein dürfte.

 

krass..

 

Dann ist mein Post wegen meiner vielen Zusatzposts wahrscheinlich untergegangen. Ich hatte nämlich weiter oben genau das gefragt... Die Farge war da oben, ob ich nicht an dieser Stelle schon das Gameobjekt brauche/ setze... Ich merke das mein Ziel noch nicht ganz vermittelt ist:

Ich habe nur 3 ganz einfache leere GO (nennen wir sie 1 2 und 3).

diese hinterlege ich wie von Dir beschrieben, weil es genau das ist wie du es dir vorstellst.

Was nicht passt sind: top,gun und Base.

DER gesamte Tower (BasisGO,+topID,+gunID,+baseID) darf hier nicht gespawned werden. Er soll nur wählbar sein (Beispiel: auf einem Knopf, klassisch)

An dieser Stelle soll nur das Gameobjekt zur Verfügung stehen (in der Liste??!) und dann explicit in die Szene gespawned..(towerplacement is ja nicht neu...)

 

Ich hoffe damit kannst Du mehr anfangen, Marrk...Wenn nicht, frag. Aber so wie du es grob verstanden hast so soll es laufen...nur halt nicht mit den Geometrien..sondern nur mit der Blaupause

 

Ich weiß allerdings nicht ob ich auf Kurs bin.,..das müßt ihr mir sagen. Ich lese sonst auch gern nochmal woanders weiter...jeder Ansatz is mir recht

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du nur beim platzieren des Towers selbst die richtigen GOs brauchst dann ist das was du jetzt schon hast, ohne das von mir vorgeschlagene Instantiate, bereits deine Blaupause. Beim platzieren selbst machst du dann quasi nur das was ich mit dem Instantiate verdeutlicht habe. Dass du beim platzieren natürlich diverse Einstellungen zusätzlichen treffen musst, ist natürlich klar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@ACM

super, das wollte ich mir ja ohnehin noch reinziehen weil es ja dann der nächste schritt war...Du hast was von aus dem Ordner laden geschrieben, und Anpassungen über den Inspector..

 

Das interessiert mich.

 

für das Beispiel oben und damit ich die Basis der Implementierung verstehe reicht es mir wenn ich bei einem Druck auf meinen Knopf in meiner Liste ein komplett nutzbares Gameobjekt finde und es von dort von mir aus einfach zum testen dann auf Wunsch spawne..

 

sagt mir bitte klar was ich noch hinzufügen muß, um in meinem Code einen Spawn erreiche von einem erstellten GO in meiner Liste mit den Werten des Editors...

Bisher habe ich alles versucht umzusetzen was mir empfohlen wurde. Liste verstehen in den Grundlagen, auch haken dran..

 

Aber jetzt gehts denke ich um tiefere Vernetzung von Listenwerten und nutzbaren Objekts..

Ich bin noch immer nicht über diese Brücke rüber..ich hoffe das ist nicht schlimm..

 

@Marrrrk

Es war das was ACM und ich besprachen als ich die ersten Wegmöglichkeiten suchte.

Und es ist interessant.

Monobehavior hatte ich bis jetzt nur drin weil ich noobiosch annahm das ich so wenigstens schnell mal gucken könnte ob sich die Werte übertragen...

tun sie auch, siehe script. Der Handler zweigt mir die aktuellen ÜbergabeWerte an die in das towerset sollen

 

Ware es denn nicht auch möglich in der Klasse towerset zu sagen:

"dieses Prefab hier is DEIN Grundobjekt" so wie im Code von Mark angedacht...so wie die anderen ints im Konstruktor einfach das GO mitgeben.

 

Diese Info geht an den Handler

der Handler trägt ein GO in seine Liste ein und ab hier soll das Script towerset auf dem GO den Wert erhalten...

 

Später teilt er dann noch die Geometrie zu. für mein Verständnis is das aber erstmal unwichtig...erstmal muß ich raffen wie aus diesen Listenwerten ein GO wird..

 

Stell ich mich blöd an?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie bereits gesagt, eventuell missverstehen wir uns da ja auch ein wenig, du hast ja bereits die Blaupause, um die Blaupause in ein konkretes Objekt umzuwandeln musst du eine Spawn Funktion implementieren die alles Instantiiert und zuweist. Das könnte im Endeffekt so aussehen:

 

public GameObject SpawnTower(Towerset blueprint, Vector3 position)
{
 var towerGO = new GameObject("Tower");
 towerGO.position = position;
 var tower = towerGO.AddComponent<Tower>();

 var baseGO = (GameObject)GameObject.Instantiate(TowerPrefabs.Bases[blueprint.baseID]);
 var topGO = (GameObject.Instantiate(TowerPrefabs.Tops[blueprint.topID]);
 var gunGO = (GameObject)GameObject.Instantiate(TowerPrefabs.Guns[blueprint.gunID]);

 baseGO.transform.parent = towerGO;
 topGO.transform.parent = towerGO;
 gunGO.transform.parent = towerGO;


 // Es gibt mehrere Möglichkeiten zum setzen der Tower Elemente
 // Option A wenn die Prefabs schon ihre positionen vorgeben
 // hier wird nichts getan

 // Option B wenn der Tower die Positionen vorgibt
 baseGO.transform.localPosition = tower.basePosition;
 topGO.transform.localPosition = tower.topPosition;
 gunGO.transform.localPosition = tower.gunPosition;

 // Option C wenn die Elemente aneinander steckbar sind
 topGO.transform.parent = baseGO.transform.Find("TopLocationGO");
 gunGO.transform.parent = gunGO.transform.Find("GunLocationGO");
 // bin mir nicht sicher ob man hierbei die localPosition zurücksetzen müsste..


 // Es gibt mehrere Möglichkeiten zum setzen der Einstellungen:
 // Option A
 var basePart = baseGO.GetComponent<TowerBasePart>();
 basePart.health = blueprint.health;

 var topPart = topGO.GetComponent<TowerTopPart>();
 topPart.speed = blueprint.speed;

 var gunGO = topGO.GetComponent<TowerGunPart>();
 gunGO.range = blueprint.range;
 gunGO.energy = blueprint.energy;
 gunGO.firepower = blueprint.firepower;
 gunGO.firerate = blueprint.firerate;
 gunGO.ammoSET = blueprint.ammoSET;
 gunGO.ammoSELECTION = blueprint.ammoSELECTION;

 // Option B
 // Hierbei müssen die parts im Parent nach dem Tower suchen und sich selbst mit Informationen aus dem towerset versorgen
 tower.towerset = blueprint; 

 return towerGO;
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, dann habe ich wie ich annahm schon das beisammen was mein blueprint ausmacht.

Ich habe folgendes so verstanden:

1) ich bin schon an dem Punkt an dem man Liste mit GO via Instantiate verbinden kann.

 

Deine aufgeführten Optionen (allesamt interessant, besonders die letzte):

a) Position der Prefabs => wie im TD eigentlich immer übleich würde ich die gerne auf ein Grid legen. Das ganze habe ich schon vorbereitet und kann das auch gern hier hinterlegen bei Interesse oder Notwendigkeit.

daraus ergibt sich das die Position eine Art einfacher Spawnpunkt ist.

Das habe ich schonmal gemacht und das sollte dann so ähnlich klingen wie GO.pos = spawn.trans.pos oder spawn.pos..schätze ich

B)

setzen der Werte mit dem gesamten towerset (deshalb ja die 11 Argumente), also die Option in der alles übergeben wird.

Wenn ich nicht irre geht das in die Richtung Deiner letzen Option

c)Zusammenstellung

in dem GO sind untergeordnet spawnpoints also habe ich die Position für die Erzeugung der IDtower,idgun,idbase.

dafür habe ich noch kein Prefab, das mache ich jetzt, damit man das vollständig testen kann.

Aber im Grunde sollte das in Deinen Optionen die Möglichkeit gewesen sein, in der alles im Parent nachsieht und sich versorgt

 

Daraus schließe ich das oben gerade alles drin ist was ich zum spawnen eines Towers auf dem Platz brauche.

 

In meinem Script:

 

 

script handler:
void defineSet()
{
 if(_Gen.SETnumber == 1 && enableDefine == true)
//hier instantiaten?
 {
  towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 2&& enableDefine == true)
 {
  towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 3&& enableDefine == true)
 {
  towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }

 

bisher kannte ich nur diesen Weg zum Instatiaten und habe das so gemacht. Ich habe jetzt Schweirigkeiten das in das obige Prinzip zu übertragen.

ich möchte ungern einfach kopieren sondern versuchen meinen Kram anzupassen. Das ganze oben kann doch in den Handler oder muss das in das towerset...ich seh den Wald vor lauter towersets nimmer...

void ShootNow()
{
 if(_shootOrder == true && _stopShoot == false)
 {

  GameObject Pat;
  Pat = Instantiate(Projektil,_ProjektilSpawn.position,gameObject.transform.rotation)as GameObject;
  Pat.rigidbody.AddRelativeForce(Vector3.forward * _Projektilkraft);
  Destroy(Pat,2);
  _stopShoot = true;
 }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur ums mal zusammen zu fassen, weil ich ehrlich gesagt deinen Schreibstil sehr verwirrend finde.

  1. Du legst dein BluePrint eines einzelnen Towers in eine Tabelle ab.
    • Ein BluePrint ist eine Ansammlung von Eigenschaften für die einzelnen Elemente eines Towers
      • Lebenspunkte
      • Feuerkraft
      • Munition
      • etc.

[*]Der BluePrint hat die Formen für die einzelnen Elemente eines Towers

  • Basis
  • Kopf
  • Kanone

[*]Du benutzt einen BluePrint um einen Tower zu bauen.

  • Eine Position auf dem Grid wird angegeben
  • Es gibt ein Tower Prefab was die Positionen für die einzelnen im BluePrint angegebenen Elemente angibt
    • Dies sind sogenannte Spawnpoints, symbolisiert durch auffindbare GOs im Tower Prefab GO

    [*]Es werden anhand des BluePrints die Element Prefabs gesucht und davon Klone erzeugt

    • Diese werden an ihre entsprechenden Spawnpoints geparentet

    [*]Der Tower bekommt das Blueprint von dem es erzeugt wurde zugewiesen

    • Womit sich die einzelnen Elemente selbst alle notwendigen Informationen besorgen können

Ist das so korrekt?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey Zusammen.

Zuerst zu Marrrrk...

 

Weiß gar nicht was Du hast. Du hast es bis auf Winzigkeiten genauso verstanden wie ich es versuche hinzubekommen.

Am Ende haben wir den Ansatz zu UserGernerated Content...reicht ja erstmal um von da über den Tellerrand zu schauen..

 

erste Aufzählung:

Alles richtig erfasst. Das wären sowas wie Vitals für den Tower...Attribute halt...oder Porperties...

der Blueprint hat nicht die Formen, aber deren ID als int. top,base,gun => jeweils 6 Stück später=> listen...

aber erstmal ein einziger...mit 3 Elementen...

 

zweite Aufzählung:

Auch richtig.

Später auch per Gridähnlichem System, ganz simpel. wenn bebaut blockt es, wenn nicht bebaut, Towerwahl

ab da hab ich angefangen nachzudenken wie man das verwaltet wenn man was auswählen mag...und das endete hier und beim Editor...

Für Jetzt reicht ein Spawnpunkt, was auch nix anderes is als ein offenes Grid das ich gerade wähle..

 

hier meine Erweiterungen auf dieser Basis..

zum testen reicht das zuweisen. Wenn ich das Zusammenspiel geschnallt habe kann ich versuchen zu erweitern und erstmal für mich rumtesten...mit den Listen warm werden, Teile hinterlegen

 

handler erweitert um Spwans etc:
ich hoffe zuweisen und die Transforms sind so richtig
public class handler : MonoBehaviour
{

//Gamobjekte für die Erstellung

//das Grundobjekt mit den Spawnpunkten für die Geometrie
//leeres GameObjekt mit 3 Child Spawnpoints,gunlink,toplink,baselink
public GameObject blueprint;
public Transform spawnpoint_blueprint;
//Fortsetzung von oben: Die Punkte für gunlink,toplink,baselink
//beim erstellen des Spielobjektes sollten beim Spawn am Spawnpunkt alle Geometrien über eine ID geladen werden.
//im Beispiel soll es nur eine Auswahl geben.
public Transform spawnpoint_top;
public Transform spawnpoint_base;
public Transform spawnpoint_gun;

public GameObject toppart;
public GameObject thebase;
public GameObject gunpart;
///um die Spawnposition im Konstruktor erweitert, geht das klar so oder is das nich cool..
void defineSet()
{
 if(_Gen.SETnumber == 1 && enableDefine == true)
 {
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 2&& enableDefine == true)
 {
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 3&& enableDefine == true)
 {
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
}
//und hier möchte ich dann testen
void OnGUI()
{
 if(GUI.Button(new Rect(0,0,50,50),"testspawn"))
 {

 }
}
///dazu das towerset...muß ich das nochmal wie in dem Beispiel von MARRRK zuweisen?
public class towerset : MonoBehaviour
{
 public Transform spawnpos;
 public int health;
 public int firepower;
 public int firerate;
 public int speed;
 public int range;
 public int energy;
 public int topID;
 public int baseID;
 public int gunID;
 public int ammoSET;
 public int ammoSELECTION;

 public towerset(Transform spwn ,int hp,int dmg,int rate,int spd,int rnge,int nrg,int top, int bse, int gun,int ammo, int ammoset)
 {
  spawnpos = spwn;
  health = hp;
  firepower = dmg;
  firerate = rate;
  speed = spd;
  range = rnge;
  energy = nrg;
  topID = top;
  baseID = bse;
  gunID = gun;
  ammoSET = ammo;
  ammoSELECTION = ammoset;
 }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier mal das was das ganze Geschreibsel macht...falls jemand neu ist oder einer von Euch diesen Einblick braucht:

aktueller Stand nach 3 Klicks auf einen Button..

 

post-963-0-02127000-1377699346_thumb.jpg

new Edit:

Ich kann das nicht umsetzen was mir als Beispiel oben übergeben wurde. Ich geb mir mühe abe ich kann das nicht in mein Projekt übertragen. Abschreiben bringt mich nur bis hier:

 

Hier ist für mich Schluß. An dieser Stelle kann ich nicht weiter eigenständig nachvollziehen was ich wo noch setzen mss.

 

Ziel ist:

das leere prefab spawnen mit befülltem Attributescript.

Hier ist alles was ich versucht habe.

Ich steh so nah vor dem was ich brauche und komme einfach nicht zum Abschluß...

:wacko:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class handler : MonoBehaviour
{

//Gamobjekte für die Erstellung

//das Grundobjekt mit den Spawnpunkten für die Geometrie
//leeres GameObjekt mit 3 Child Spawnpoints,gunlink,toplink,baselink
public GameObject blueprint;
public Transform spawnpoint_blueprint;
//Fortsetzung von oben: Die Punkte für gunlink,toplink,baselink
//beim erstellen des Spielobjektes sollten beim Spawn am Spawnpunkt alle Geometrien über eine ID geladen werden.
//im Beispiel soll es nur eine Auswahl geben.
public Transform spawnpoint_top;
public Transform spawnpoint_base;
public Transform spawnpoint_gun;

public GameObject toppart;
public GameObject thebase;
public GameObject gunpart;

public int hp = NewTowerController.TOWERcurrhealth;
public int dmg = NewTowerController.TOWER_FirePower;
public int rate = NewTowerController.TOWER_FireRate;
public int speed = NewTowerController.TOWER_Speed;
public int range = NewTowerController.TOWER_Range;
public int energy = NewTowerController.TOWERenergy;
public int top = NewTowerController.TOWERtop_part;
public int mybase = NewTowerController.TOWERbase_part;
public int gun = NewTowerController.TOWERgun_part;
public int ammo = NewTowerController.TOWERammoset;
public int ammoSet = NewTowerController.TOWERammoselection;

public NewTowerGen _Gen;
public bool enableDefine = false;

public List<towerset>towers = new List<towerset>();


void Awake()
{
 towers = new List<towerset>();
 _Gen = GetComponent<NewTowerGen>();

}
// Use this for initialization
void Start ()
{

}

// Update is called once per frame
void Update ()
{
 //towers.Add(new towerset(hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
 defineSet();
 setValues();

}
void defineSet()
{
 if(_Gen.SETnumber == 1 && enableDefine == true)
 {
  //hier werden neue Werte in ein leeres Element0 übergeben
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
  //Spawn erlauben

 }
 if(_Gen.SETnumber == 2&& enableDefine == true)
 {
  //hier werden neue Werte in ein leeres Element1 übergeben
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
 if(_Gen.SETnumber == 3&& enableDefine == true)
 {
  //hier werden neue Werte in ein leeres Element1 übergeben
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  enableDefine = false;
 }
}
void setValues()
{

 //hier überprüfe ich nur im Inspector ob die Werte aktuell sind damit ich prüfen kann was im towerset ankommt
 //wird später entfernt
 hp = NewTowerController.TOWERcurrhealth;
 dmg = NewTowerController.TOWER_FirePower;
 rate = NewTowerController.TOWER_FireRate;
 speed = NewTowerController.TOWER_Speed;
 range = NewTowerController.TOWER_Range;
 energy = NewTowerController.TOWERenergy;
 top = NewTowerController.TOWERtop_part;
 mybase = NewTowerController.TOWERbase_part;
 gun = NewTowerController.TOWERgun_part;
 ammo = NewTowerController.TOWERammoset;
 ammoSet = NewTowerController.TOWERammoselection;
}
//hier möchte ich gern ein einziges Gameobjekt spawnen am Testpunkt und die Werte des Editors übergeben
void OnGUI()
{
 if(GUI.Button(new Rect(0,0,50,50),"testspawn"))
 {
 }
}
//schon der Anfang kann nicht richtig sein vermutlich.
//ich habe doch ein towerset.cs. => blueprint mit allen werten
//
public GameObject Spawntower(towerset _blueprint, Vector3 _position)
{

 //1 Werte an Blueprint hängen mit Script towerset.cs
 //var tower = towerGO.AddComponent<towerset>; ==> geht nicht.
 //2 SpawnpunktGO der Parts setzen
 toppart.transform.parent = spawnpoint_top;
 gunpart.transform.parent = spawnpoint_gun;
 thebase.transform.parent = spawnpoint_base;

 //später relevant, aber nicht notwendig hier:
 //3 Parts ID ermitteln aus int top, int gun, int mybase
 //4 Int top,gun,mybase vergleichen mit Objekten mit der selben ID (GunGO,TopGO;BaseGO)

 //5 instanzieren des Basisobjektes am Spawnpunkt
 //6 instanzieren der Teile im Basisobjekt

 //towerGO ist mein Basisobjekt, also entspricht es dem GO blueprint im Inspector
 var towerGO = blueprint;

 //das verursacht einen Fehler, ohne transform kam ich nicht an .position, mit transform jehtet nich
 towerGO.transform.position = _position;
 //ausrichten der Parts..hier richten sie sich an den Links aus siehe Screenshot GO Aufbau

 //Instanzieren des Generics
 towerGO = Instantiate(blueprint,spawnpoint_blueprint.position,gameObject.transform.rotation)as GameObject;
 //Instanzieren der Parts

 return towerGO;
}

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aktueller Status:

 

Komme noch nicht zum Endpunkt.

 

Erzeugen des Objektes klappt solo

Erzeugen der Werte klappt solo

Erzeugen eines leeren Elementes klappt

Objekt hat aber nullwerte im Script, weil mir nicht einleuchtet WAS ich ansprechen muss damit das rübergeht..

.

In dem Code wird doch schon alles weitergeben...nur eben nicht werte an script sondern nur werte an Handler und leeres Element

 

// das geht. Beides separat
//ich seh nich mehr durch, bitte sagt mir wie ich schreibe das towerset.cs an den erzeugten tower geht
void defineSet()
{
 if(_Gen.SETnumber == 1 && enableDefine == true)
 {
  //hier werden neue Werte in ein leeres Element0 übergeben
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  GameObject towerGO = (GameObject)Instantiate(blueprint,spawnpoint_blueprint.position,spawnpoint_blueprint.transform.rotation);
  enableDefine = false;

 }

 

hier weitere Versuche ohne Erfolg

//nochmal versucht in handler das hier zu packen:
public GameObject Spawntower(towerset _blueprint, Vector3 _position)
{
 var towerGO = new GameObject("GENERIC");
 //das will er nicht! das .position will er nicht ausgeben. Wenn ich es von Hand schreibe gibts einen Error
 towerGO.position = _position;
 var TowerSet = Instantiate(towerGO,_position,gameObject.transform.rotation);

}

 

Letzter Gedankengang:

 

if(_Gen.SETnumber == 1 && enableDefine == true)
 {
  //hier werden neue Werte in ein leeres Element0 übergeben, Index wäre null...
  towers.Add(new towerset(spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet));
  //GameObject towerGO = (GameObject)Instantiate(blueprint,spawnpoint_blueprint.position,spawnpoint_blueprint.transform.rotation);
  // towerset Element0 dem GO zuweisen
  //GO = towerst[1]
  enableDefine = false;
  //Spawn erlauben

 }

Link zu diesem Kommentar
Auf anderen Seiten teilen

...man ist das ne Geburt mit dir...

Warum willst du sowas machen, wenn du die Zusammenhänge nicht verstehst? Das ist einfach auch nicht das beste Beispiel um sowas zu erklären, weil es einfach mal zuviel ist. Warum immer gleich solche Sachen machen, wenn man die Hälfte nicht versteht? Und dann im Forum nach Hilfe schreien... was meinst du warum hier keine Sau hilft?! es ist alles völlig verquer und insgesamt für den Helfenden ne Menge Schreibarbeit dir zu erklären was anders laufen muss... davon abgesehen erstmal nachzuvollziehen was du eigentlich willst...

Ich würde dir einfach den Tipp geben das erstmal zu lassen und einfachere Sachen zu machen oder jemanden zu finden, der das für dich macht...

 

Objekt hat aber nullwerte im Script, weil mir nicht einleuchtet WAS ich ansprechen muss damit das rübergeht..

WELCHES Objekt macht das? Wie fragst du das ab um diese Aussage treffen zu können? Seh ich nirgends. Wann und wo werden von wem "Nullwerte" ausgegeben?

 

Dein towederset landet mit seinen Werten schon in der Liste. Schau mal dort nach. (In der Liste)

Zumindest sollte es das, es sei denn, du gibst schon anfangs falsche Werte weiter.

Wie wäre es, wenn du erstmal alles "durchlogst".

haben

spawnpoint_blueprint,hp,dmg,rate,speed,range,energy,top,mybase,gun,ammo,ammoSet

die richtigen Werte wenn du ein neues towerset anlegst?

Bevor das towerset erstell wird: Wert debugloggen, danach das betreffende Element in der Liste angucken und Werte debugloggen, dann vergleichen...

 

Ansonsten mach was einfacheres, so hat das ja keinen Zweck.

 

ach...das seh ich doch gleich den nächsten Fehler... Marrrk sagte bereits: klassen die von MonoBehaviour erben sollen nicht nicht über "new" instanziert werden... das passiert aber

public class towerset : MonoBehaviour


towers.Add(new towerset(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Handtuchwerfen..

Danke für diesen Satz. Aus Deinem Mund.

 

Die Idee die Sache in diese Richtung anzugehen war von Dir, meine ich.

Die Beispiele für den Konstruktor und die Basiklasse (ohne Mono, auch dazu gab es einen hinweis im Script, ich wiederhols jetzt nich nochma)

 

Meine Fragen zum Debuggen wurden nicht beantwortet, sieh nach. Jetzt schlägst Du debuggen vor.

 

Meine Frage warum .position in MARRKS Beispiel nicht geht bei mir MIT CODE ist ebenfalls nicht beantwortet.

 

Zum Instantiate habe ich ein Beispiel geliefert, wie ich es bisher kannte und beschrieben das ich das nicht auf MARRRKS Code adaptieren kann (was per se auch mal kein Laienthema ist sofort jeden Syntax umsetzen zu können) auch dazu habe ich keine Antwort

 

Mark hat nachgefragt und exakt alle so zusammengefasst und mir versucht ein Beispiel aufzuzeigen

ALLE Fragen dazu UND meine Scriptversuche dazu sind nicht beantwortet.

 

Dennoch habe ich mir das so hingemogelt das ich mir ein Objekt spawne (geht auch!!!und auch an meinen Spawnpunkt).

Das letzte soll nur sein die Werte an das Objekt zu übergeben.

 

MARRK zeigt dafür Beispiele, die ich nicht nachmachen kann weil meine Fragen zu den dort auftauchenden Fehlern nicht beantwortet sind.

 

Wenn ich dann nach eigenen Wegen Suche isses am Ende wieder die alte Leier mit: lass es doch...

naja von mir aus...

 

Wenn man sich das so reinzieht kann man dann auch nur noch das Handtuch werfen. Mehr als Fragen kann ich nicht.

 

Ich bedanke mich für den coolen Tagesabschluß...bisher hatte ich das Gefühl mir was erarbeitet zu haben..

Schon echt manchmal Kino...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

Ankündigungen


Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×
×
  • Neu erstellen...