Jump to content
Unity Insider Forum

Wie eigene Funktionssammlung erstellen?


feivel3333

Recommended Posts

Hallo zusammen,

langsam wächst mein Anfängerwissen über Unity, und ab und zu schreibe ich eine Funktion/Method, die ich in anderen kleinen Projekten wiederverwenden möchte. Github möchte ich dafür nicht in Anspruch nehmen, das halte ich für Schießen mit Kanonen auf Spatzen. Mein Gedanke ging in die Richtung, dass ich gern eine zentrale Sammlung lokal auf meinem Rechner erstellen möchte, wo ich meine Methods sammle und von wo aus ich mein gesammeltes Wissen anzapfen kann.

Da ich am Beginn eines C#-Scripts gesehen habe, dass ich dort eine Using-Anweisung platzieren kann, versuchte ich, selbst so etwas zu erstellen und stieß auf den Begriff "Namespace". Doch es will mir einfach nicht gelingen, so etwas hinzubekommen. Leider finde ich auch in den einschlägigen Foren und im Internet nichts darüber. Ich weiß auch nicht, ob das mit dem Namespace tatsächlich richtig ist.

Ich dachte, ich könnte zum Nachvollziehen der Vorgehensweise die dort oben im C#-Script genannten Dateien auf meiner Festplatte finden, indem ich nach "UnityEngine.UI" oder ähnlichem suche, doch dann wird man mit Ergebnissen zugeschüttet. Mehrere hundert wenn nicht tausend Dateien vom Typ DLL erscheinen, mit denen ich so direkt nichts anfangen kann. Half also nichts.

Es muss doch einfacher gehen. Deshalb meine Frage ins Forum, ob sich jemand damit auskennt und mir mit ein paar Worten erklären kann, wie man das macht. Ich wäre euch sehr dankbar, dann müsste ich meine Funktionen nicht in jedes C#-Script kopieren. Diese Kopiererei macht die Pflege der Funktionen/Methoden nicht gerade einfach, vor allem dann nicht, wenn man mal etwas daran ändert.

Viele Grüße aus Brühl, André

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 43 Minuten schrieb feivel3333:

Github möchte ich dafür nicht in Anspruch nehmen, das halte ich für Schießen mit Kanonen auf Spatzen.

Ich würde sogar empfehlen, ein Git-Repo zu erstellen, aber... eins nach dem anderen. Github hat auch eine nette "Gists"-Sektion, die sieht bei mir so aus. Sachen, die du nicht (oder zumindest: nicht ausschließlich) alle in einem Paket haben willst, können da sehr schön hin.

vor 46 Minuten schrieb feivel3333:

Mein Gedanke ging in die Richtung, dass ich gern eine zentrale Sammlung lokal auf meinem Rechner erstellen möchte, wo ich meine Methods sammle und von wo aus ich mein gesammeltes Wissen anzapfen kann.

Das geht auch mit einem Git-Repo sehr gut - du musst es ja nicht bei Github oder so hochladen, sondern kannst es lokal behalten.

vor einer Stunde schrieb feivel3333:

Da ich am Beginn eines C#-Scripts gesehen habe, dass ich dort eine Using-Anweisung platzieren kann, versuchte ich, selbst so etwas zu erstellen und stieß auf den Begriff "Namespace".

Namespaces sind nett, um den Scope etwas kleiner zu halten. Oder anders gesagt: Wenn du anfängst, zu tippen, dann ploppen dir da ja Vorschläge auf. Und diese Liste kann man etwas kürzer halten, indem man seine Sachen in Namespaces packt. Namespaces erlauben dir aber nicht, Code in dein Projekt zu importieren oder so. Der Code liegt entweder vor oder er tut es nicht. Eine using-Direktive hat darauf keinen Einfluss.

vor einer Stunde schrieb feivel3333:

Es muss doch einfacher gehen. Deshalb meine Frage ins Forum, ob sich jemand damit auskennt und mir mit ein paar Worten erklären kann, wie man das macht.

Gerne! Was du haben willst, ist ein Paket, das der Paketmanager für dich importiert.

Seit Unity 2018.irgendwas hast du ja zwei Hauptordner in deiner Project View: "Assets" und "Packages". Assets ist für alle Dinge, die für dein Projekt spezifisch sind, während Packages eben Pakete enthält, die nicht speziell für dieses Projekt sind, sondern generell eingesetzt werden können. Ein Paket erstellst du, indem du ein Paket-Manifest in einen Ordner voller Assets legst. Dafür will Unity afaik noch Editor-Support bauen. Laut Manual funktioniert das Manifest Window in 2019.4, tut's bei mir aber nicht. Also bastelst du dir im Moment einfach eine json-Datei in einem beliebigen Text-Editor. Das sieht dann etwa so aus. Die Datei muss dabei genau "package.json" heißen. Erstelle dir gerne eine Kopie von meinem Manifest und passe es an. Nette Falle: Die Versionsnummer muss dem Schema "x.x.x" entsprechen, "x.x" (z.B. "0.1" statt "0.1.0") ist nicht erlaubt.

Dann müssen noch alle Scripts einer Assembly Definition untergeordnet sein. Dazu kannst du in deinen Assets rechtsklicken, "Create", und dann "Assembly Definition". Dem Ding gibst du einfach einen sinnvollen Namen - bei mir gibt's ein Paket namens "Unity-Essentials" (;)), und die asmdef-Datei heißt dann "ThirteenPixels.Unity-Essentials". Schau dir den Aufbau auch gerne genauer in meinem Projekt an, das ich verlinkt habe.

Wenn das Paket so eingerichtet ist (klingt nach viel Arbeit, aber da gewöhnt man sich ganz schnell dran), dann kannst du in deinem Projekt, in dem du das Paket importieren willst, den Paketmanager dafür benutzen. Den findest du oben unter "Window", "Package Manager". Damit der auch richtig funktioniert, solltest du auf jeden Fall Unity 2019.3 oder höher benutzen, davor hatte der noch erhebliche Mängel und man musste per Hand Dinge in eine Textdatei eintragen.

Sobald du den Paketmanager offen hast, kannst du das hier auswählen:

grafik.png

Und dann im Dialog die package.json raussuchen und auswählen. Der Paketmanager importiert jetzt das Paket und packt es in den Packages-Ordner deines Projekts:

grafik.png

Um da jetzt noch auf den Anfang zurück zu kommen: Du kannst wunderbar aus deinem Paket ein Git-Repo machen, dann hast du schon einmal Versionierung (was super ist). Optional kannst du das Repo dann auch noch auf Github oder sonstwo hinpushen, dann hast du direkt noch ein Online-Backup und kannst von überall auf das Paket zugreifen (wenn du mal an einem anderen Rechner sitzt oder jemand anderes mit dir arbeitet). Öffentlich kann so ein Ding auch super für dein Portfolio sein. Zu guter Letzt finde ich es irgendwie simpler, Updates von Paketen zu ziehen, wenn diese in einem Git-Repo sitzen. Statt "from disk" wählst du sonst im Paketmanager dann "from git URL" aus und fertig. Jedenfalls ist das dann auch nicht mit Kanonen auf Spatzen schießen :)
Damit sage ich nicht, dass du das machen musst -
wie gezeigt kannst du Pakete auch einfach von der Platte laden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

 

Ich benutze einfach eine statische Klasse und packe dort die entsprechenden Funktionen rein. Diese Date nehme ich dann von Projekt zu Projekt mit. Ist nicht sehr elegant, aber wunderbar simpel:

 

namespace Chrische
{
    public static class Tools
    {
        public static Vector3 GetMouseWorldPostion(Vector2 mousePosition)
        {
            return Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }
        
        
        public static T GetChildComponentByName<T>(GameObject objectToSearch, string componentName) where T : Component
        {
            foreach (T component in objectToSearch.GetComponentsInChildren<T>(true))
            {
                if (component.gameObject.name == componentName)
                    return component;
            }
            return null;
        }
        
        public static List<T> GetChildComponentsByName<T>(GameObject objectToSearch, string componentName) where T : Component
        {
            var items = new List<T>();
            foreach (T component in objectToSearch.GetComponentsInChildren<T>(true))
            {
                if (component.gameObject.name == componentName)
                    items.Add(component);
            }
            return items;
        }

        public static T GetMax<T>(params T[] numbers)
        {
            return numbers.Max();
        }
        
        public static T GetMin<T>(params T[] numbers)
        {
            return numbers.Min();
        }

 

Christoph

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab einen riesen Ordner ca mit 600 Dateien und wenn man ein Ordner verschoben, mal ein Script umbenannt hat und wenn man dann ein anderes Projekt damit updaten wollte war es nicht möglich. Da müsste man quasi ganzen Ordner löschen und sonst hatte man manchmal Dinge doppelt.

Wenn ich nun ein Projekt A habe und dort diese Sachen benutze und irgendwann Projekt B habe und weil Unity auch updated müsste ich paar Dinge anpassen. Dabei werden auch Ordner umstrukturiert. Nun wenn nun diesen Ordner in den Gitordner schiebe.. dann hab ich Spaß, dann sind da Skripte doppelt vorhanden oder sonst was. Ebenfalls nach Projekt A ist auch wiederum Spaß. Mittlerweile versuche ich mich daran zu gewöhnen extra einen Unity Projekt mit nur diesen Sachen zu öffnen und da immer anzupassen, wo auch git ordner ist. Ich seit dem nur noch unitypackages. Aber das ist auch nicht immer möglich, denn vllt will ich ja nur eine Sache reinladen und habe das mal angepasst. 

Ist ziemlich nervig. Dazu würde ich auch gerne wissen, wie ich da am besten vorgehen kann. Denn ich starte echt viele Projekte, auch wenn mal kleine oder große sind, dabei sind die meisten Dinge vom Ordner dabei und passe je nach Bedarf an.

Das mit Package Manager müsste ich auch mal langsam machen. Hab ja die Sachen vor dem PackageManager gehabt und daher so geblieben ^^.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb MaZy:

Dazu würde ich auch gerne wissen, wie ich da am besten vorgehen kann.

Hast du ja schon selber beantwortet :D

vor 9 Stunden schrieb MaZy:

Das mit Package Manager müsste ich auch mal langsam machen.

Der existiert halt genau dafür.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...