Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Tankard

Treue Seele

  • »Tankard« ist der Autor dieses Themas

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

1

29.12.2013, 20:47

[Unity/C#] Funktionen anderer Objekte aufrufen

Moin,

ich kam endlich dazu mal ein wenig mit Unity rumzuspielen. Ich habe mir ein Skript geschrieben um eine Kamera frei im Raum zu bewegen. Eine der Funktionen ist, um ein gegebenes Ziel zu rotieren. Dieses Ziel wähle ich per Mausclick aus. Problem dabei ist, wie bekomme ich das target ins Kameraskript?

Ich habe bis jetzt einen unschönen Umweg gemacht. Ich habe ein leeres GameObjekt namens Cameras welches ein Skript enthält mit 2 static Methoden und einem Dictionary. In diesem Dictionary kann ich CameraMovementScripts mit einem Namen speichern und entsprechend anhand des Namens das Skriptobjekt holen.
Alle anklickbaren Objekte bekommen ein ClickableScript, welches sich dann bei einem Click über den Namen das Kamerskript-Objekt holt um sich dort selbst als Target für das Orbiting einzusetzen. Das muss doch eifnacher gehen!


Wie kann ich in einerm Skript Funktionen eines anderen Skripts aufrufen? Oder muss ich da einen ganz anderen Weg gehen?

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

Tankard

Treue Seele

  • »Tankard« ist der Autor dieses Themas

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

3

29.12.2013, 23:33

Danke hat funktioniert.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void OnMouseDown ()
    {
        selected = !selected;
        
        //Camera cam = Camera.current;
        Camera cam = Camera.main;
        
        if (cam == null)
            Debug.Log ("cam == null");
        
        if (selected)
        {
            cam.SendMessage("setTarget", this.transform);
        }
        else
        {
            cam.SendMessage("removeTarget", this.transform);
        }
    }


Allerdings stellt sich mir die Frage, warum Camera.current null zurück gibt. Mit Camera.main funktioniert es zwar, aber warum nicht mit Camera.current?

Die Doku sagt zwar

Zitat

Use this function only when implementing one of the following events: MonoBehaviour.OnRenderImage, MonoBehaviour.OnPreRender, MonoBehaviour.OnPostRender.

aber kann ich mir die aktuelle Kamera wirklich nur zurückgeben lassen wenn ich die Events implementiere? Hat das irgendeinen Sinn der sich mir noch nicht erschließt?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

30.12.2013, 15:55

Wahrscheinlich steht Camera.current nur dann zur Verfügung, wenn eine der entsprechenden Methoden aufgerufen wird, da diese sehr wahrscheinlich nur für eine einzelne Kamera aufgerufen werden.
Alle anderen Methoden (bspw. Awake, Start und Update) wiederum werden nicht für eine bestimmte Kamera aufgerufen, weshalb es keine Aktuelle Kamera geben kann.

Auf die Camera könntest die ggf. auch zugreifen, indem du in dem entsprechenden, aus dem heraus du darauf zugreifen willst, einen öffentlichen Member (public Camera myCamera;) oder einen privaten mit der SerializeField-Annotation ([SerializeField] private Camera myCamera;) anlegst und dann darüber den Aufruf durchführst (myCamera.SendMessage("setTarget", this.transform);).
Auf die gleiche Weise könntest du allerdings auch eine Referenz auf das jeweilig andere Skript hinterlegen (public MyScript myScriptReference;) und den Aufruf der Methode direkt darüber durchführen (myScriptReference.setTarget(this.transform);).

Auch solltest du dir im Klaren darüber sein, warum du das Transform (this.transform oder this.gameObject.transform) und nicht das GameObject (this.gameObject) übergibst.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Tankard

Treue Seele

  • »Tankard« ist der Autor dieses Themas

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

5

30.12.2013, 23:32

Wahrscheinlich steht Camera.current nur dann zur Verfügung, wenn eine der entsprechenden Methoden aufgerufen wird, da diese sehr wahrscheinlich nur für eine einzelne Kamera aufgerufen werden.
Alle anderen Methoden (bspw. Awake, Start und Update) wiederum werden nicht für eine bestimmte Kamera aufgerufen, weshalb es keine Aktuelle Kamera geben kann.

Auf die Camera könntest die ggf. auch zugreifen, indem du in dem entsprechenden, aus dem heraus du darauf zugreifen willst, einen öffentlichen Member (public Camera myCamera;) oder einen privaten mit der SerializeField-Annotation ([SerializeField] private Camera myCamera;) anlegst und dann darüber den Aufruf durchführst (myCamera.SendMessage("setTarget", this.transform);).
Auf die gleiche Weise könntest du allerdings auch eine Referenz auf das jeweilig andere Skript hinterlegen (public MyScript myScriptReference;) und den Aufruf der Methode direkt darüber durchführen (myScriptReference.setTarget(this.transform);).


Die Möglichkeiten gucke ich mir mal an.

Auch solltest du dir im Klaren darüber sein, warum du das Transform (this.transform oder this.gameObject.transform) und nicht das GameObject (this.gameObject) übergibst.


Ust das nicht im Grunde egal? Wenn ich this.gameobject übergebe, dann kann ich mit target.transform auf das transform zugreifen und wenn ich this.transform übergebe, dann komme ich doch immer noch mit target.gameobject ans gameobject.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

6

31.12.2013, 02:55

Ich wollte nicht sagen, dass du es bisher falsch gemacht hättest. Der Name der Methode (setTarget) lässt darauf schließen, dass du die Koordinaten des Gameobject benötigts, wo das Übergeben eines Transform durchaus sinnvoll sein kann, allerdings wird das nicht immer der Fall sein.
Der Unterschied zwischen den beiden Zugriffen (Transform und GameObject) ist, dass Transform eine Komponente ist, die an einem Gameobject hängt, wodurch das Abrufen des Transform eines Gameobject etwas langsamer ist, als das Abrufen des GameObject eines Transforms. Grundsätzlich sollte man sich Komponenten, die man häufig benötigt, zwischenspeichern, um ggf. den zusätzlichen Aufwand für das Abrufen einzusparen (bspw. bei Verwendung während des Updates).

Ich wollte nur darauf hinaus, dass einem die Unterschiede bekannt sein sollten. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Renegade123

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

7

31.12.2013, 03:39

Wahrscheinlich steht Camera.current nur dann zur Verfügung, wenn eine der entsprechenden Methoden aufgerufen wird, da diese sehr wahrscheinlich nur für eine einzelne Kamera aufgerufen werden.


Sowohl aus der Dokumentation, einer Google-Suche und deiner Antwort werde ich nicht ganz schlau wozu Camera.current sein soll?! Wozu gibt es dieses Feld?
Liebe Grüße,
René

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

8

31.12.2013, 13:09

Die Methodennmen (und deren Dokumentation) deuten darauf hin, dass sie Funktionalität für das PostProcessing beinhalten, welches gemäß Doku für eine bestimmte Kamera ausgeführt wird (abhängig davon, an welche man ein Skript mit einer der Methoden anhängt). Wenn man ein Skript an mehreren Kameras anbringt, kann man so zwischen den Kameras unterscheiden. Dies wäre zwar grundsätzlich auch mit this.GetComponent<Camera>() oder einer Variablen möglich, gleiches trifft aber auch mehr oder weniger auf Camera.main zu. (So weit zumindest mein Verständnis...)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige