Jump to content
Unity Insider Forum

function call


frkx316

Recommended Posts

Hallo,

ich schreibe gerade an einem Editor (window) und würde gerne wissen wie ich methoden von anderen scripten aufrufen kann?

Mein Programm wir mittlerweile relativ unübersichtlich und ich würde es gerne aufteilen.

Die Geschichte mit GetComponent funktioniert ja leider nicht da man ein editorscript nicht an ein Gameobject legen kann...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum Beispiel so:

//irgend ein script
public class WndMarkers : MonoBehaviour
{
    public static WndMarkers singleton { get; private set; }

    void Awake()
    {
        if (singleton == null)
            singleton = this;
    }

    public void MeineFunktion()
    {
        Debug.Log("Es funktioniert!");
    }
}

Jetzt kannst du die Funktion im Editor Script und auch von überall sonst aufrufen:

WndMarkers.singleton.MeineFunktion();

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da ich gerade länger nicht an meinen Rechner komme versuche ich das mal aus dem Gedächtnis so gut wie es geht zu rekonstruieren und da ich am Handy schreibe sieht es auch nicht so gut aus 

 

Void class myeditor : Editor{

Script ScriptA= wird irgendwie aufgerufen
 

 void OnGUI(){

     if(Button){
           ScriptA.method1();

     }

}

}
 

 

 

 

und das andere Script

Public class ScriptA : Editor{
 

Public void method1(){
      Mache irgendwas 

}

 

Wie man sieht würde ich gerne 

bestimmte Funktionen zwischen Editorscripts Austauschen und ebenso variabeln 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also... Editor ist ja die Basisklasse für eigene Inspektoren; das heißt, du willst zwei Komponenten im Editor haben und der Inspektor des einen soll irgendetwas im Inspektor des anderen auslösen. Zuerst solltest du dir überlegen, ob du nicht in Wirklichkeit nur den Inspektor von Komponente A Komponente B manipulieren lassen willst. Denn deine Möglichkeiten sind:

  • Von einem Inspektor auf die jeweilige Komponente zugreifen (bzw. mehrere, wenn mehrere GameObjects markiert sind), mit "target" bzw. "targets".
  • Von einer Komponente auf eine andere zugreifen (mit GetComponent, ist klar).

Was aber meines Wissens nach nicht geht (man korrigiere mich gegebenenfalls, auch wenn ich mir nicht sicher bin, ob ich den Code dafür sehen wollen würde...):

  • Von einer Komponente auf dessen Editor zugreifen.

Ich frage mich ehrlich gesagt sowieso, was das für eine Komponentenstruktur ist, bei der so ein Setup von Vorteil wäre 🤔

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es soll eben nicht etwas im Inspektor des anderen auslösen (soweit ich das verstanden habe meinst du doch mit dem Inspektor das Fenster)

ich möchte doch nur eine eigene Klasse Schreiben die ich in anderen scripten Aufrufen kann 

 

vielleicht dann irgendwie so das ich folgendes schreiben kann 

using myclass;

und dann 

myclass.method();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es geht also gar nicht um Editorklassen? Ich habe ein bisschen das Gefühl, du hast dir da irgendetwas zusammengesucht, aber vieles davon hat überhaupt nichts mit dem zu tun, was du eigentlich tun willst?

Kannst du vielleicht einmal ganz spezifisch erläutern, was für Klassen/Objekte du hast, die da interagieren sollen? So ein ganz handfestes Beispiel? Denn die Lösung für dein Problem lautet ganz anders, je nach dem, was du da tun willst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein ich verarsche euch nicht.

Und wie kommst du darauf das ich Lehrer bin? 😂

Ich bin übrigens zufällig auf die passende Lösung gekommen 

Wenn man weis wonach man sucht findest man es relativ schnell raus 

Sobald ich wieder an meine Rechner bin, schicke ich euch mein Ergebnis 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Um eigene klassen global zu nutzen sind die befehle  namespace irgendwas { ... } und using irgendwas;  zu benutzen.

Dabei handelt es sich um reine C#  deklarierung.

Mit dem folgendem Code erstellt man seine eigene Klassen so das man sie in jedem Script aufrufen kann 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Myclass
{
    public class ScriptA : MonoBehaviour
    {
		
		// Property
        public int Numb { get; set; }

        // method
        internal int Multiply(int zahl)
        {
            return Numb * zahl;
        }

		//method
        internal void Method()
        {
            Debug.Log("es funktioniert");
        }

		//Konstruktor
        public ScriptA()
        {
            Numb = 2;
        }

    }
}

wenn man dieses Script erstellt hat kann folgendes ausgeführt werden:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Myclass; 

public class ScriptB : MonoBehaviour
{   
    void Start()
    {
        ScriptA scr = new ScriptA();
        Debug.Log(scr.Numb);// 2

        scr.Numb = 5;
        Debug.Log(scr.Numb);//5

        scr.Multiply(6);
        Debug.Log(scr.Multipl(6));//30

        scr.Method();//"Es funktioniert"
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 3.3.2020 um 11:05 schrieb Thariel:

Du verarschst uns doch 😁

Oder du bist Lehrer und planst eine Projektwoche und bist im falschen Film gelandet 😆
Da weiss ich leider auch nicht, wie du deine Klasse in andere Projekte integrierst.

 

 

Sowas sollte man lieber lassen, wenn man selbst keine Ahnung hat.😂

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also... An dem, was du geschrieben hast, ist nichts falsch, aber es ist etwas merkwürdig. Denn Klassen, die in keinem expliziten Namespace sind, funktionieren halt auch. Du kannst den Namespace um ScriptA und das using-Statement vor ScriptB halt weglassen und es wird immer noch funktionieren.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

//Aber statt
ScriptA scr = new ScriptA();

//solltest du lieber so die Komponente erzeugen (Komponente = weil die von MonoBehaviour erbt)
ScriptA scr = gameObject.AddComponent<ScriptA>();

//Oder du nimmst bei ScriptA oben das ": MonoBehaviour" weg, weil du dort keine Komponenten-Logik benötigst bzw. diese nicht auf dem GameObject liegen soll

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...