Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Jar

Treue Seele

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

31

14.02.2018, 13:10

Noch so eine Sache ist das mit den Structs.

Komme aus der Java Welt, bzw. habe in den letzten Jahren hauptsächlich in Java programmiert.
Was ist denn nun der Vorteil von structs? Ich bin es gewohnt eigentlich für alles Klassen anzulegen und habe mir noch keine großen Gedanken zu structs gemacht. Damals im Studium habe ich sie trotzdem in C genutzt. Vielleicht auch ein bisschen Offtopic hier :)

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

32

14.02.2018, 15:03

Structs in C# sind Werttypen, d.h. die Instanzen werden nicht auf dem Heap angelegt und sind wie in C++ normale Klassen/Struct-Instanzen oder in Java eine Variable von einem primitiven Datentyp (int, float, etc.). Im Gegensatz zur class in C#, welche sich wie ein Referenztyp verhält. Das bedeutet Instanzen werden auf dem Heap angelegt, sind Garbage-collected, wie Pointer/Referenzen in C++ und Klassen in Java.
D.h. von einem Referenztyp eine Variable zu Kopieren, kopiert nur die Referenz, nacher referieren beide Variablen auf dasselbe Objekt und Änderungen bemerkt man dementsprechend. Bei Integern in Java z.B. kannst du nach einer Kopie den einen unabhängig vom anderen verändern, weil es Werttypen sind. Genau wie eine struct in C#.

33

14.02.2018, 15:11

Offtopic möchte ich mal sagen:

Gibt es hier keins. Es entwickelt sich gerade eine ungeheuer interessante Diskussion!

Dem füge ich nur einen Witz an:

C#-Quelltext

1
2
3
4
5
6
7
Public Void (Collider otherCollider)
    if (otherCollider.GetComponent<Frau>) {
    Sex;
    }Else {
    "klatsch";
}
}


Nur so als Gag :D

also : ich möchte nur sagen - ich finde das gar nicht "offTopic".

Allerdings bin ich ehrlich: ich bin kein Java Freund. Leider.
Wo es hingehört, okay, aber es hat in meinen Augen den "Desktop PC" viel zu sehr vereinnahmt. Dafür war Java auch
nie vorgesehen. Meiner Meinung nach gibt es 2 richtig dicke Sicherheitslücken: AdobeFlash und Java.

hm. ( also in einem Windows System )
Vorsicht! Tante Gretel darf man nicht hänseln.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

34

14.02.2018, 15:18

Ich verstehe deinen Post nicht ganz. Es ging hier ja nicht um Java sondern um C# was du ja auch verwendest. Jar erwähnte nur dass er aus dem Bereich kommt und gerne wüsste was Structs in C# können.
Außerdem finde ich die Diskussion nicht soo offtopic, geht immerhin um Unity und was man noch besser machen könnte. So wie ich das mitbekommen habe, könntest du da was von mitnehmen.

Tiles

Treue Seele

Beiträge: 168

Wohnort: none

  • Private Nachricht senden

35

14.02.2018, 15:24

Zitat

Wenn du eh gern den Inspektor nutzt und darüber zuweist, dann mach das weiter. Damit aber anzufangen um die Performance zu optimieren ist wohl quatsch. Wenn dein Spiel schlechte Performance hat guckst du mit einem Profiler wo deine Bottlenecks sind. Wenn du die gefunden hast kannst du anfangen zu optimieren.


Naja. Wenn du es erst falsch machst hast du ja doppelt Arbeit. Was du gleich richtig machst brauchst du erst gar nicht optimieren. Und man arbeitet nicht ohne Not gegen Unity, sondern mit Unity. Das ist das schöne Arbeiten. Unschön wird es da wo du um Unity rumentwickeln willst.

GetComponent ist ja nur ein Teil des Problems. Die nächste Stufe wäre dann GameObject.Find. Das sind alles Sachen die du dir sparen kannst wenn du den Unity Weg über die Inspectorvariablen gehst. Dazu musst du aber wissen dass es diesen Weg überhaupt gibt. Und das bedeutet dass du zuallererst mal Unity lernen solltest, nicht C#. Inspektorvariablen sind Unity Basics.

Ich fand damals die Möglichkeit Variablen im Inspektor zuzuweisen einfach eine klasse Sache. Erhöht die Übersicht, und ist hier und da auch noch performanter. Was will man denn mehr? Also ich habe da kein grosses Bedürfnis mehr das noch extra händisch zu lösen.

Aber da gleiten wir wohl ins philosophische Offtopic ab. Jeder wie er mag. Erlaubt ist was funktioniert :)
Free Game Graphics, Freeware Games https://www.reinerstilesets.de

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

36

14.02.2018, 15:41

GetComponent ist ja nur ein Teil des Problems. Die nächste Stufe wäre dann GameObject.Find. Das sind alles Sachen die du dir sparen kannst wenn du den Unity Weg über die Inspectorvariablen gehst. Dazu musst du aber wissen dass es diesen Weg überhaupt gibt. Und das bedeutet dass du zuallererst mal Unity lernen solltest, nicht C#. Inspektorvariablen sind Unity Basics.

Wenn deine Skripte und Objekte sich untereinander massiv kennen müssen dann wird das zum Problem, das ist richtig. Oft brauchst du das aber gar nicht. Wie oft müssen Skripte andere Objekte kennen? In den meisten Fällen bekommst du das gewünschte Objekt geliefert. Damit meine ich zum Beispiel Kollisionen. Das dich besitzende Objekte kennst du auch schon ohne es zuweisen zu müssen. In wie vielen Fällen musst du wirklich fremde Objekte kennen? Ich selbst hab ewig nichts mit Unity gemacht, gucke aber regelmäßig über die Codes und Probleme von Bekannten. Diese Verzweigung der Objekte gab es bei denen vor allem am Anfang. Da war deren größtes Problem alles in MonoBehaviors unterbringen zu wollen. Seitdem die aber verstanden haben dass in Unity nicht jede Klasse ein MonoBehavior an irgendeinem Objekt sein muss gibt es diese Probleme immer weniger. Ich will nicht sagen dass der Inspector böse ist. Den gibt es und du darfst ihn gern so benutzen so viel du möchtest. Du sollst die Dinge aber aus guten Gründen benutzen. Benutz den Inspector an der Stelle wo er dir die Arbeit erleichtert.
Und ja, du musst die Unity Basics drauf haben um damit arbeiten zu können. Wenn du aber vernünftige Skripte schreiben willst musst du eben auch C# drauf haben. Und nicht nur die Sprache, du musst auch vernünftig Entwickeln können. Du hattest doch selbst letztens noch ein Problem mit deinem Questsystem. Solche Probleme kommen doch daher dass die Erfahrung beim entwickeln fehlt. Ob du jetzt erst C# oder erst Unity lernst ist auch erst mal völlig egal. Fakt ist einfach dass du am Ende eben beides vernünftig kennen solltest wenn du damit ordentlich arbeiten willst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

37

14.02.2018, 17:08

Ich erlaube mir noch einmal einzuwerfen:

ich bin NOOB, und habe folgendes Script (was ich entgegen 1. Antwort 100% verstehen kann, nicht wie die 1. Antwort, und die Direktion : lies ein buch )

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// Aufheben von Objekten und Klärung der Munition von Feinden

    void OnTriggerEnter (Collider otherCollider) {
        if (otherCollider.GetComponent<Kugel> () != null) {
            Hit ((transform.position - otherCollider.transform.position).normalized);
            Destroy (otherCollider.gameObject);
        } else if (otherCollider.GetComponent<HealthPack> () != null) {
            if (health <= 4) {
                health++;
                Destroy (otherCollider.gameObject);
            }
        } else if (otherCollider.GetComponent<BigHealth> () != null) {


Kurzum: Ja, ich gehe über "getComponent" und definiere dann *welchen*

d.h. z.B. Kugel.

ich sehe da im Moment für *Mich* in meinem Projekt kein Problem.
Das Hauptproblem war für mich, das der Collider an einer ganz anderen Ecke war, als das Game Object (d.h. der Würfel den ich testweise hatte )
Die Empty mit dem Collider, war an einer ganz anderen Ecke, so konnte das nicht gehen )

Danach habe ich zuerst Belehrungen darüber erhalten, das ich ein Buch lesen soll.
dann, gab es hier einen echt fruchtbaren Austausch, den find ich total genial.

d.h. bitte: auch wenn es kein OffTopic gibt: meine Frage war nicht dazu gedacht, sich gegenseitig zu zerfleischen. Okay ?

Jeder arbeitet, wie er mag.
Ich komme mit dem GetComponent, sehr gut zurecht.
Vielleicht hat meine Art von Spiel, einfach zu wenig Anspruch an Unity ?

Andere, mögen es eher schneller bzw. anders.
Wiederum andere, sind mir unzählige Schritte voraus, empfehlen mir Bücher, oder debattieren hier Systeme, deren Ansatz ich
noch nicht einmal verstehe.

Leute:
Es ist mein erstes Gaming Project, und es funktioniert fantastisch.

und ich dachte immer:
das etwas funktioniert, ist der Sinn der Sache.

Und wenn Du 10 Programmierer, über eine Situation fragst, wirst Du stets 10 000 Antworten haben,
die sich alle unterscheiden.

ich denke: das Ziel ist der Weg, d.h. : wenn das Ziel erreicht ist - egal wie - und das fehlerfrei,
war nur der Weg dahin interessant.

den muß man lernen.
Beim nächstem Ziel, lernt man den nächsten Weg - so beginnt man.

hm.

also bitte:
Zerfleischt Euch nun nicht, das war nie Sinn der Sache.

ok ?

Aber vielleicht kann mir einer etwas beantworten (bevor sich das doch ganz OT verliert )

C#-Quelltext

1
health++; <- definiert, das meine Lebensleiste +1 bekommt.


dafür gibt es keinen Amount, sondern nur:

C#-Quelltext

1
public int health = 5; 


aber daran dürfte eigentlich das System nicht scheitern.

Wenn ich nun "health" nicht nur +1 sondern +xxx hinzufügen will, habe ich 2 Möglichkeiten:

Möglichkeit A kenne ich , das wäre :

C#-Quelltext

1
health++;


Wie weise ich da einen tatsächlichen Wert zu ?

z.B. health+5 funktioniert nicht.
auch kein Healt+ = 5 oder ähnliches.

d.h. wenn ich nun 5 Herzen zuadden möchte, ohne 5x health++;health++;health++;health++;health++; zu tippen / zu hinterlegen

wie bekomme ich von health++;
ein Statement dazu, das statt health++; eben health+5; ( als Beispiel ) wäre ?

normal so würde ich mal "denken" wäre das health = +5

geht aber nich.
gesucht, nix gefunden.

einer eine Idee ?
Vorsicht! Tante Gretel darf man nicht hänseln.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NullAhnungsJoe« (14.02.2018, 17:18)


Garzec

Alter Hase

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

38

14.02.2018, 18:19

Also zum Thema GetComponent..

Ich finde es überhaupt nicht kritisch, ich habe das nirgendwo außerhalb von Start stehen und selbst dort hat man das maximal 2x.

Jetzt könnte man ja behaupten, wenn ich mir 1000 Objekte erzeuge, rufen die alle erstmal Start auf, aber beim Erzeugen kann man ja anstatt Start eine public "Custom Start" Methode anlegen und das gesuchte Objekt einfach als Parameter mitgeben.

@NullAhnungsJoe

Also irgendwie konnte ich dein Problem jetzt nicht verstehen

Wenn du 5 Leben addieren möchtest schreibst du

C#-Quelltext

1
health += 5;


Wenn du irgendwas ganz anderes meintest kann ich dir noch ne Schleife anbieten ?(

C#-Quelltext

1
2
3
4
for(var i = 0; i < 10; i++) // 10 Leben über die gesamte Schleife verteilt hinzu addieren
{
    health++;
}


Vielleicht haben es ja andere verstanden

Tiles

Treue Seele

Beiträge: 168

Wohnort: none

  • Private Nachricht senden

39

14.02.2018, 18:48

@Schorsch, wir drehn uns im Kreis. Du magst den Inspector nicht, du willst als Programmierer lieber alles programmatisch lösen. Das sehe ich leider immer wieder. Als Entwickler nehme ich mir das Tool und den Workflow der mich am schnellsten und effektivsten zum Ziel führt.

Letztenendes kommen wir beide zum Ziel. Und spätestens da wird die Diskussion müssig, denn erlaubt ist was funktioniert. Auch wenn ich eben der Meinung bin dass du die Unity Katze da gegen den Strich bürstest. Best Practice in C# ist eben nicht gleich Best Practice in Unity. Kein Wunder faucht es ab und zu ;)

So. Und jetzt bin ich hier mal ruhig. Ich denke mal unsere Standpunkte sind nun klar. Was der Joe draus macht muss er wissen. Wir zwei haben unsere Arbeitsweisen schon :)

@NullAhnungsjoe, Zu deinem jetzigen Problem, schon das probiert?

health = health + 5;

Da würde ich jetzt allerdings auch zu einem C# Tutorial in Sachen Variablen raten :D
Free Game Graphics, Freeware Games https://www.reinerstilesets.de

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

40

14.02.2018, 19:03

Da würde ich jetzt allerdings auch zu einem C# Tutorial in Sachen Variablen raten :D

Siehste :P

@NullAhnungsjoe:
Wenn ++health; oder health++; funktioniert, dann muss health += 5; bzw. health = health + 5; auch funktionieren.

Werbeanzeige