2016-04-11 4 views
3

Ein wenig Hintergrund:Ich bin neu in C# und Unity, aber sehr schnell auffangen. Ich hoffe auch, dass dieser Thread wird nicht eine Debatte über die Vorzüge der Klassen und abstrakte Codierung, wie diese Debatte ist ohne Bezug und abgenutzt (und unnötig erhitzt); also behalte das im Hinterkopf.C# in Unity 3D/2D: Muss ich Klassen für jedes Skript verwenden?

Ich frage mich einfach, ob jedes C# -Skript in Unity eine Hauptklasse in irgendeiner Weise oder aus irgendeinem Grund haben muss.

Oder können stattdessen Methoden und Variablen außerhalb einer Klasse in eine leere Datei (mit Namespaces) geschrieben werden, um in einem Videospiel verwendet zu werden?

Ich frage, weil, wenn ich ein neues C# -Skript erstelle, es scheint, eine Klasse in meine Akte zu zwingen, und ich habe Angst, Dinge zu brechen.

  • Ich hoffe Code Abstraktion auf ein Minimum zu halten, und das aktuelle Projekt ich gerade arbeite hat mehrere Situationen, in denen eine Klasse nicht benötigt wird, oder nur eine Instanz der Klasse verwendet werden. Ich möchte einfach mit Klassen in diesen Fällen vermeiden.
+1

Hallo John, die einfache Antwort ist "ja, natürlich". Wenn du sagst: "Ich würde es einfach vermeiden, Klassen in solchen Fällen zu benutzen." *, Vergiss das einfach, es ist völlig bedeutungslos. Nehmen wir an, Sie haben eine sehr einfache Aufgabe zu erledigen (was ist mit "Blinken an und aus"). OK, also ist es eine Codezeile, in einer einfachen Klasse namens "Blinken" in einer Datei "Blink.cs". Das ist alles dazu. Legen Sie die Datei auf die Objekte, die dieses "blinkende" Verhalten benötigen. – Fattie

+0

Tut mir leid, Joe Blow, all diese Antworten waren sehr hilfreich und ich hatte Mühe, den richtigen auszuwählen. Ich habe viel gelernt und wünschte, ich hätte alle drei Antworten auswählen können. –

+1

gut gemacht, es ist wichtig für neue Benutzer, eine Antwort zu ticken! Du bekommst Punkte. Prost. – Fattie

Antwort

1

Ja, das sind Sie.

In C# gibt es Dinge wie globale Variablen und Funktionen einfach nicht. Alles muss in einer Klasse enthalten sein.

"Aber was soll ich tun, um einige Dinge zu deklarieren, auf die man überall zugreifen kann, ohne ein Objekt zu erstellen?" du hast gefragt. Es gibt etwas, das statischen Modifikator genannt wird. Sie können auf die Methoden oder Variablen oder Felder oder Eigenschaften zugreifen, die mit diesem Modifikator markiert sind, ohne ein Objekt dieser Klasse zu erstellen.

Sie fügen einfach das Wort static in einer Methode hinzu und es wird zu einer statischen Methode! Wie einfach!

Lassen Sie uns ein Beispiel sehen.

Ich habe diese nicht-statische Methode:

public class MyClass { 
    public void DoStuff() { 

    } 
} 

ich es so nennen kann:

var obj = new MyClass(); 
obj.DoStuff(); 

Aber wenn ich es mit static, kann ich

public class MyClass { 
    public static void DoStuff() { 

    } 
} 

ändern nenn es so:

MyClass.DoStuff(); 

Wie praktisch!

Hinweis:

Bitte den statischen Schlüssel nicht missbrauchen! Nur verwenden, wenn es Sinn macht! Wann? Wenn die Methode eine Hilfsmethode ist oder wenn die Methode nicht zu einzelnen Objekten gehört, sondern zur Klasse selbst.

+1

Versuchen Sie, etwas zu verkaufen? Bitte verwenden Sie nicht diese rhetorischen "wie bequem/wie einfach" Fragen, sie gehören nicht in eine Antwort. Globale vars existieren auch, werden aber nur innerhalb einer Klasse deklariert. – Jannik

2

In Bezug auf die Deklaration/Definition von Variablen und Methoden außerhalb jeder Klasse, you can't really do that in C#. Es ist einfach nicht so, wie die Sprache entworfen wurde (die Antworten auf die Frage, die ich verlinkt habe, um diese Idee zu erweitern, also werde ich sie hier nicht kopieren).

Sie sind jedoch nicht ohne Optionen; Wenn Sie über mehrere Variablen oder Methoden verfügen, auf die von verschiedenen Stellen aus zugegriffen werden muss und die keine Objektreferenz benötigen, können Sie sie static angeben. Daher müssen Sie die Klasse nicht instanziieren, um sie zu verwenden:

public class UtilityClass 
{ 
    public static float GravityConstant = 3.51f; 
    public static string GameName = "MyFirstGame"; 

    public static float CalculateProduct(float a, float b) 
    { 
     return a * b; 
    } 
} 

Dann können Sie die Klasse Methoden/Mitglieder verweisen, indem sie durch ihren Namen zugreifen:

float product = UtilityClass.CalculateProduct(6, 1.5f); 

Ein Beispiel, wo Sie dieses Muster verwenden können, wenn mathematische Formeln zu definieren, die nicht in Unity enthalten Mathf Methoden und ihre Verwendung in mehreren Klassen.

Zusätzliche Anmerkung: Beim Erstellen eines neuen C# -Skripts über die Editor-Benutzeroberfläche von Unity wird standardmäßig eine Klasse desselben Namens deklariert, die von Monobehaviour erbt. Sie können es ändern, um die Vererbung von Monobehaviour zu entfernen, wenn Sie keine der Methoden/Attribute der Klasse benötigen, wodurch unnötiger Overhead vermieden wird. Ein Beispiel hierfür wäre eine statische Klasse, die Sie nie instanziieren müssen.

1
  1. Zu allererst müssen Sie prüfen, wo Methods als offical docs

    "Methoden angegeben definierenin einer Klasse oder Struktur deklariert werden durch den Zugang Niveau angeben, wie öffentlich oder privat ....Oder stattdessen können Methoden „

    So, Verfahren sollten in einer Klasse oder Struktur und A given class should be, ideally, responsible for just one task. (see also)

  2. Ihr diese Frage erklären werden“, und Variablen geschrieben außerhalb einer Klasse sein kann in einer leeren Datei (mit Namespaces) in einem Videospielen verwendet werden?“ Antwort in der Frage unten versteckt ist.

    Can there be stand alone functions in C# without a Class? Nein. Machen Sie sie statisch und fügen Sie sie in eine statische Dienstprogrammklasse ein, wenn sie tatsächlich nicht in eine Ihrer vorhandenen Klassen passen.

    Sie müssen eine Klasse erstellen, um Methoden oder ihre Variable Instanzklasse oder statische Klasse zu verwenden.

  3. Muss ich Klassen für jedes Skript verwenden? Jedes Skript bedeutet, dass Sie eine Klasse benötigen. Unity Support Component Based Architectural Design und wenn Sie benötigen ein Skript arbeiten dann benötigen Sie definitiv eine Skriptkomponente, die eine Klasse erfordert.

  4. Endlich für singleton, dank Unity3dWiki tolle Details verfügbar. Ich denke, Sie werden sich wohl fühlen, Klasse zu codieren und zu schreiben, wenn Sie Komponenten-basierte Architektur von Unity3d beachten.

  5. Singleton vs Static: Ich werde auch diese empfehlen zu überprüfen: Why do you use a Singleton class if a Static class serves the purpose

Hoffe, es hilft.

[Hinweis: Wenn dies hilfreich ist, kann jemand diese Antwort für künftige Bezugnahme aktualisieren und verwenden].

Verwandte Themen