Jump to content
Unity Insider Forum
frkx316

function call

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...

Share this post


Link to post
Share on other sites

hast du alle protected (privat, public, etc.) richtig gesetzt?

mit getComponent kannst du auf die scripte von einem gameobjekt zugreifen. die methoden und die classen müssen dafür auf public gesetzt sein

Share this post


Link to post
Share on other sites

Kannst du ein bisschen beschreiben, was da jetzt für Klassen im Spiel sind und wie die miteinander interagieren sollen?

Share this post


Link to post
Share on other sites

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();

 

Share this post


Link to post
Share on other sites

Funktioniert nur im Play Mode, nur mit einem einzelnen Objekt und ist nach wie vor immer eher eine Notlösung...

Share this post


Link to post
Share on other sites

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 

Share this post


Link to post
Share on other sites

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 🤔

Share this post


Link to post
Share on other sites

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();

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Besser kann man es nicht beschreiben 

ich brauch eine allgemeine Lösung wie ich meine eigenen Klassen in verschiedenen Projekte integrieren kann 

 

Share this post


Link to post
Share on other sites

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.

 

 

  • Haha 1

Share this post


Link to post
Share on other sites

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 

Share this post


Link to post
Share on other sites

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"
    }
}

 

  • Sad 1

Share this post


Link to post
Share on other sites
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.😂

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites
//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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...