Jump to content
Unity Insider Forum

Varible statt Code


axam

Recommended Posts

Ok, ich weiß nicht ob das überhaupt möglich ist, aber last mich erklären:

Manchmal wiederholen sich Code-Teile, zB.:
 

private Vektor3 position;

void something () 
{
	p.GetComponent<Player> ().Abstand ();
	p.GetComponent<Player> ().Letzter ();
	p.GetComponent<Player> ().speed;

	position = new Vektor3 (p1.transform.position.x, p1.transform.position.y, p1.transform.position.z);
	p1.transform.position = position
}


Hier wiederholen sich "p.GetComponent<Player>" und "p1.transform.position".

Jetzt kam mir der Gedanke, könnte man das ganze nicht irgend wie mit Variablennamen übersichtlicher machen, etwa in der Art:
 

private Vektor3 position;
private variable SN1 = p.GetComponent<Player>; // ShortName
private variable SN2 = p1.transform.position;

void something () 
{
  SN1 ().Abstand ();
  SN1 ().Letzter ();
  SN1 ().speed;
  
  position = new Vektor3 (SN2.x, SN2.y, SN2.z);
  SN2 = position;
}

Hinweis: Das obige Script dient nur als Beispiel um mein Vorhaben zu verteutlichen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi @axam,

ja du bist auf den richtigen Ansatz gekommen du kannst die Adresse in einer variable Speichern um später oder mehrere Informationens davon abzufragen.

Dazu benutz du einfach den Classen-Name(Type)

 

Hier ein kleines Beispiel

public class MyClass
{
	private GameObject _playerGo;
	private Player _player;	

	private void Start()
	{
		_player = _playerGo.GetComponent<Player>();
	}

	private void DoSomething()
   	{
    		int speedFromPlayer = _player.Speed;
      		PlayerStatus statusFromPlayer = _player.Status;
      		bool canMovePlayer = _player.CanMove;
    	}      
}

 

Du bekommst jeweils beim Methode aufruf GetComponent die Instanz der jeweils gesuchten Klasse zurück.

Mfg.

-John

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antwort

Würde das ganze auch mit transform.position bzw. transform.Translate funktionieren?

siehe hier was ich meine:

private Transform tp;
private Transform tr;
private Transform tT;
private Transform tR;

void Start () 
{
	tp = transform.position;
	tr = transform.rotation;
	tT = transform.Translate;
	tR = transform.Rotate;
}

void Spawn ()
{
	spawn = new Vector3 (tp.x, tp.y, tp.z - 30f);
	tp = spawn;
	tr = Quaternion.identity;
	tT (Vector3.forward * p.speed * Time.deltaTime);

}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das kann man auch machen, aber die frage ist ob das viel Sinn macht. Ich bin ja ein starker verfechtern von Clean Code und für mich ist das ein anzeichen für schlechten Code wieso das?

Nunja einerseits wen ich jetzt in die Methode Spawn reinspringe und sie mir anschaue ohne mir voher den rest anzugucken dan stelle ich mir schnell die fragen bedeutet tp oder tr or tT. Anderseits jetzt gehen wir mal ein step weiter und schauen das ganze in einer anderen Methode an nehmen wir man an wir möchten gerne eine größeren Algo. in einer Methode packen, durch solche abkürzungen kommt man schnell ins trudan. Sprich man verwechselt schnell z.b. tp mit tr oder to ect.

 

Also muss man sich gut überlegen ob es wirklich sinn macht eine Abkürzung dafür zu schreiben. Stelle dir vor deine Methode ist wie ein Absatz den du liest so sollte deine Methode aufgebaut sein es gibt verschiede prinizpen nach dem man sein Code verschändlich und übersichtlich sowie ordentlich aufbauen kann. Ich kann nur aus erfahrung sprechen es ist verdammt wichtig und hilfreich und ich verwende nur sehr selten Abkürzungen für gewisse Stellen im Code und wen ich das mal benutze dan nur diejenigen die sich mit laufe der Zeit eingebürgert haben und die im Allgemeinen jeden bekannt sind.

 

Meint Tipp an dich: schreibe ruhig transform.position ect. aus es dient einerseit der übersichtlichkeit und der sauberkeit deines Codes und reducted fehlerstellen die in deinem Code auftretten können. Code duplication zu reduzieren ist ein guter ansatz aber meistens ist der auf andere cases bezogen und haben meinsten einen anderen sinn hinter.

 

PS: Rotate und Translate sind Methode Aufrufe das heißt diese kann man nicht im type Transform speichern.

- position sowie rotate sind vom Typen Vector3 und deshalb auch nicht vom Type Transform.  

Link zu diesem Kommentar
Auf anderen Seiten teilen

Deine Einwände machen durchaus Sinn.

Das mit den kürzeln ist übrigens die Extremvariante. Meine Frage zielt im Grunde eher darauf ab, wo sind meine Grenzen - wie weit kann ich C#/Unity "verbigen", und wie sieht die korrekte Syntax dafür aus.

Ich gebe dir recht, mit " tp tr tk to " ist keinem wirklich geholfen - wenn ich aber bei transform.rotation und transform.Rotate das transform überall weglasen kann und nur noch rotation  bzw. Rotate schreibe erhöht dies für mich persönlich die lesbarkeit durchaus.

Ein weiter Aspekt - meine Mutersprache ist Deutsch, ich kenne zwar die Bedeutung von rotation, aber wenn ich mit "Variabelnamen" arbeite kann ich es  auch genau so gut in drehen umbenenen.

Weiterer Vorteil von Variblen - ich ändere wärend der Arbeit immer wider mal die Namen meiner Variblen - heute schreibe ich der einfachheit halber p1, morgen ist mir dies zu ungenau und daraus wird wieder ein Player1, und übermorgen kämpfe ich für den Erhalt unsrer deutschen Sprache und nene es Spieler1 - sind die Variblen in einer weiteren Variable verschachtelt, muss die Variable nur an dieser einen stelle angepast werden, anstatt im ganzen Code. (aus  _playerGo.GetComponent<Player>  wird dann z.B einfach Spielerobjekt.GetComponent<Spieler>)

Der Ideallfall wäre natürlich, wenn sich dass ganze am Ende so weit verbigen ließe, bis daraus tatsächlich ein fast schon flüßiges Deutsch wird - allerdings bin ich dann zu symbolverliebt, als dass ich "drehe.X-Achse um 5.0" schreiben würde, antselle von " dreh.x + 5f" (Wenn ihr wist was ich meine ;) )

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten morgen,

ja ich kann jetztert nachvollziehen vorauf du hinaus möchtest. Ich hab bereits die ein oder anderen Tools gesehen die auf so eine Art bzw. scripting langue abzielen.

Aber für dich würde ich empfehlen dir mal Visual Scripting Tools anzuschauen:

PlayMaker:

https://www.assetstore.unity3d.com/en/#!/content/368

Behavior Designer:

https://www.assetstore.unity3d.com/en/#!/content/15277

Asset Store Visual Scripting Category:

https://www.assetstore.unity3d.com/en/#!/search/page=1/sortby=relevance/query=behaviour&category:110

 

Ich vermute mal das ist glaub ich der bessere Einstieg. Im grund würde dein vorhaben funktionierten, das wäre aber mit einer eigener scripting-lamgue verbunden, die du für entwicklen müsstest.

Ich würde dir empfehlen C# oder JavaScript Tutorials anzugucken (oder threads zu lesen) um die ein guten Einblick in die Syntax zu bekommen. Da du schnell herausfinden wirst wieso das letzendlich so aufgebaut wird und welcher Sinn dahinter steckt.

 

 

Mfg.

-John

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi.

Eigentlich bringt C# von sich aus alles mit, um solche "Probleme" ;-) zu lösen. Du kannst sogar Scripts während der Laufzeit neu erstellen oder ändern; bestimmen, ob nur im Speicher kompiliert wird oder den neuen Code in eine Datei schicken usw.; du kannst auch Inline-Code "injizieren".
Und natürlich kann man auch Code, der mit den Variablennamen "m, o, f, i, h, m1" läuft, verändern und testen, ob er auch mit den Variablennamen "meine, oma, faehrt, im, huehnerstall, motorrad" funktioniert.
Falls es dich interessiert, schau dir mal die Klassen "CodeDomProvider" und "CSharpCodeProvider" an.

Link zu diesem Kommentar
Auf anderen Seiten teilen

kann mich John da eigentlich nur anschließen.

Klar ist es möglich - für einen selbst macht es auch bestimmt Sinn.

ABER - wenn du mal hilfe benötigst oder Fragen/Probleme hast,  die Leute die dann helfen wollen/können müssen sich selber erstmal überall durch lesen, wo die "Standards" geändert wurden.

das Coden ist halt nicht umsonst auf english gehalten.

selbst wenn man davon ausgehen würde, dass nur deutsche Leute über den Code lesen würden - einfacher wäre es für diese durchaus wenn die Standards (Transform.Rotate...) bleiben würden.

und wenn du täglich die Variablen die bereits existieren ändern möchtest, das ist durchaus machbar - man benötigt dann nur die richtige IDE die ändert dann nicht nur die Zeile sondern ändert die Variable im ganzen Code. Glaub Visual Studio kann das sogar (bin mir nicht sicher, aber glaub variablenamen markieren & rechtsklick sollte eine auswahl dafür haben)

Man muss halt überlegen was man will, nur für sich selbst weil es dann "schöner" ist oder aber für alle so praktisch lassen wie irgendwie möglich.

 

(Meine Methoden & oft auch Variabeln gebe ich durchaus deutsche Bezeichner)

In der Schule hatten wir ein Abklatscher von Java damals, dieser war eben Coden auf Deutsch.

statt IF (WENN) und so weiter & es war ätzend.

Wenn man sich einmal dran gewöhnt hat, liest man eigentlich auch die englishen Befehle so weg.

 

Es gab sogar schon Spiele die einfach eingestampft werden mussten mit der Zeit, weil die damaligen Programmierer ausgewechselt wurden & die neuen mit deren Codes nicht mehr klar kamen. (Als ein Kritisches Beispiel wollte ich das jetzt mal erwähnen)

EDIT: MonoDevelop kann aufjedenfall den Variabelnamen im gesamten Script ändern. Variable markieren und mit F2 sollte sich das Fenster zum umbennen öffnen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sage erneut danke,

Werde mit "C# in Unity für Einsteiger" in den nächsten Tagen mal ansehn, muß allerdings erst noch für einen Freund ein "Spiel" fertig stellen, welches er für eine Prüfung braucht.

Werde eure Radschläge natürlich, im Rahmen meiner Möglichkeiten, durchaus beherzigen, aber auch unkommentiert stehen lassen, denn selbst wenn ich irgend etwas momentann vielleicht anders sehe, wäre vermutlich jedes wort sonst - zu oft habe ich schon gesehen, wenn ich meine Ziele erstmal  erreicht habe, erwies sich das ganze dann als irgend wie ein wenig sinbefreit, oder ich erkannte warum ich das ganze eigentlich machen wollte und sah dann einen sehr viel einfacheren besseren weg, wie ich das Hauptziel erreichen kann, und, und, und - andererseits, egal was für einen Schwachsin ich da manchmal fabriziere, am Ende lerne ich dabei auch immer eine ganze Menge, und darum geht es ja eigentlich - oder etwa nicht?

 

Auf jeden Fall bin ich euch stehts dankbar für jede Hilfestellung die ich von euch erhalte.

 

 

 

 

 

 

 

 

PS.: Bezüglich:

Am 10.3.2014 um 18:12 schrieb Tiwaz:

Falls das Thema überhaupt noch irgendwie aktuell ist,

Das " Game", welches ich in im Jahr 2014 mal Angesprochene habe ruht zwar Momentan, aber aufgehoben ist nicht aufgeschoben - allerdings möchte ich zuvor noch versuchen ein anderes Projekt zu verwirklichen, welches mir in weiterer Folge die Arbeit an dem Spiel erheblich erleichtern würde. Aber so bin ich nun mal leider - ich habe stehts dutzende Projekte am laufen, an denen ich dann ganz nach Lust und Laune arbeite. Wirkt für Ausenstehende zwar schnell mal so als würde ich ales möglich beginnen ohne je irgend etwas fertig zu machen, aber in Wahrheit lasse ich die wenigsten Dinge tatsächlich unvollendet, den wenn es sich nicht irgend wann als völlig unmöglich erweist, und ich das Projekt daher verwerfe, oder "unersetzliche Informationen" im "Datennirvaner" "verschwinden", dann komme ich früher oder später auf jedes Projekt irgend wann wieder zurück und arbeite daran weiter bis es auf diese Weise irgend wann fertig ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...