Jump to content
Unity Insider Forum

Referenz in ein Prefab generell nicht möglich? - GELÖST


Der_Stefan_

Recommended Posts

Hallo Zusammen,

ich habe mal wieder ein Problem, bei dem ich trotz ewiger Google und YouTube-Recherche einfach nicht alleine weiterkomme...

Und zwar möchte ich in einem Script (auf Objekt B ) einen Bool-Value aus einem anderen Script (auf Objekt A) übernehmen. Sprich wenn Objekt A XY gemacht hat, soll Objekt B YX machen.

Ganz konkret dreht sich ein GameObjekt mit der Kamera, diversen Lampen, etc als Children. um einen zylindrischen Sockel auf dem sich die Figuren bewegen. Sobald sich das Kamera-Objekt halb um den Zylinder gedreht hat, sprich die 180 Grad-Marke erreicht hat, wird ein entsprechender Bool-Wert über einen Collider eingestellt (Backside = true). Die Figuren auf dem Zylinder (nebst anderen Dingen) sollen den neuen Bool-Wert erhalten und die Steuerungsparameter umkehren, sich umdrehen usw.  

Soweit so gut, ich weiß auch theoretisch wie ich das machen muss. Ich stocke nun an dem Punkt, bei dem ich ScriptA, bzw. das entsprechende Objekt davon, den Figuren, wo das Script B liegt, zuordnen muss. Das klappt wunderbar, solange sich das GameObject in der Szene befindet ist. Allerdings sind die Figuren Prefab-Klone, welche erst während des laufenden Spiels gespawnt werden. Und Unity erlaubt mir nicht mein Objekt A in den passenden Slot im Prefab zu ziehen. 

Habt ihr eine Idee wo das Problem liegt? Ist das generell nicht möglich? Und wie kann ich das umgehen? 

In den meisten Internet-Beiträgen geht es a) in erster Linie darum einen Bool-Wert aus einem anderen Script heraus zu verändern. Ich möchte ihn aber nur passiv "lesen". Ich suche nur etwas ganz einfaches, dass ich meinen Prefabs sagen kann "Wenn ihr im Spiel seid, achtet bitte auf das Script A!" Und b) ist immer die Bedingung eines Verweises auf das jeweils andere Objekt - Was ich hier ja nicht machen kann. 

Hier noch ein bisschen Bildmaterial: 

Zu den Scriptauszügen: "Backside" ist das Script welches dem Kamera-Setting anhängt und die Drehung erkennt.  "Cubemovement" - logisch - ist für die Bewegungssteuerung der Instantiates. Es kämen theoretisch noch weitere Klassen dazu die den Bool-Value benötigen, aber das bekomme ich ja wohl (hoffentlich) adaptiert, sobald ich erstmal überhaupt zu einer Lösung gelangt bin...

Ich danke euch schon mal im Voraus.

Snip1.JPG

Snip2.JPG

Snip3.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin Stefan,

das Prefab hier im Inspektor zu referenzieren würde dich nicht weiter bringen da das Preab eine art Template oder Blaupause ist aber Kein instanziertes objekt. Wenn du das Prefab in deine Szene ziehst erzeugst du eine Instanz . Wenn du die dann in dein Inspektor feld ziehst referenzierst du hiermit die instanz deines Prefabs (nicht das Prefab selbst).

Wenn du nun Objekte dynamisch instanzieren willst und die dann später irgendwie ansprechen willst musst du dich zur laufzeit um die referenzierung kümmern. d.h. du musst dir die Objekte beim spawnen merken. Wenn du mehrere Objekte has z.B. in einer Liste und die kannst du dann abarbeiten und das gewünschte Feld abfragen (z.B. BacksideBool). Wenn du allerdings immer nur 1 Objekt hast wonach mir hier das grade aussieht musst du Beim spawnen des dynamischen objekts die referenz an dein Cubemovement script übergeben

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also wenn ich dich richtig verstanden habe, dann meine ich das genau andersrum 😅 Ich möchte nicht auf die Funktion eines Prefabs/einer Instanz verlinken, von denen will ich nichts. Vielmehr möchte ich, dass die Instanz von einem bestehenden Objekt etwas Abfragen soll.

ich kann morgen noch mal bessere Bilder posten. Das Ganze ist ein Konfigurator. Man wählt nach Baukastenprinzip verschiedene Objekte, deren Instanzen dann auf der Bildfläche erscheinen und über die Pfeiltasten arrangiert werden können. Und wie gesagt, die Instanzen sollen dann prüfen wo die Kamera steht (vorne oder hinten) und sich entsprechend umdrehen (grob gesprochen). Die sich drehende Kamera ist die ganze Zeit über da.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Edit:


Du könntest ein Skript in deinem Projekt anlegen, kann z.B. so aussehen.

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

public class staticScript : MonoBehaviour
{
    public static bool backside = false;
}

somit kannst du von jedem beliebigen Script in deiner Scene aus den boolien Wert ändern und auch abfragen was er so macht und etsprechend etwas tun.

z.B.

public class ScriptA : MonoBehaviour
{

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            staticScript.backside = true;
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            staticScript.backside = false;
        }
    }
}
public class ScriptB : MonoBehaviour
{

    // Update is called once per frame
    void Update()
    {
        if(staticScript.backside == true)
        {
            Debug.Log("istrue");
        }
        else
        {
            Debug.Log("isfalse");
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, genau so war ja auch mein Ansatz (siehe Scripte oben). Ich hab‘s nur einfach nicht auf‘s Pferd geschafft. Dein Code sieht jetzt nicht so aus, als dass ich da GamObjekte Verknüpfen muss, oder? Das wäre doch schon mal ein Schritt nach vorne. 
heute schaffe ich es nicht mehr, aber ich versuche das morgen mal einzubauen. Ich danke dir aber schon mal sehr 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Denke so müsste es auch gehen, dann kannst du dir das zusätliche Skript sparen. Im Inspektor verknüpfen musst du auch nichts.
Wenn ichs richtig verstanden habe, ist dein Cubemovement dein Prefab und dein Backside nur ein Skript auf der Camera.

Wenn du dein "bool Backsidebool" auf public static setzt, kannst du es direkt von anderen Skripts aus ansprechen, ohne das Skript verlinken zu müssen, soweit ich das weiss.

Cameraskript:

public class Backside : MonoBehaviour
{
    public static bool Backsidebool = false;


    private void OnCollisionEnter(Collision collision)
    {
        Backsidebool = true;
        Debug.Log("Backsidebool = true");
    }

    private void OnCollisionExit(Collision collision)
    {
        Backsidebool = false;
        Debug.Log("backsidebool = false");
    }
}

Prefabskript:

public class Cubemovement : MonoBehaviour
{
    private bool prefabBacksidebool;
    // Update is called once per frame
    void Update()
    {
        prefabBacksidebool = Backside.Backsidebool;
        Debug.Log(this.name + prefabBacksidebool);
    }
}

 

-------------------------------------------------------------

Edit:
Du kannst das auch anderst machen. Wenn du Prefabs Instanzierst, machst du das ja auch von einem Skript aus. Du kannst einmalig dein Backside Skript damit verknuepfen und dann beim instanzieren dem Prefab die Verknuepfung mitgeben.

Als Beispiel hat dein Cubemovement Skript weiterhin die Variable Backside und beim instanzieren holst du dir das Cubemovement Skript und setzt die Varibable Backside gleich der Backside Variable aus deinem Skript, welches das Prefab spawnt.

z.B. so:

Spawner:
 

public class SpawnSkript : MonoBehaviour

{
    public GameObject CubePrefab;
    public Backside backsideSkript;

    private void instantiate()
    {

        GameObject inGo = Instantiate(CubePrefab, transform.position, transform.rotation);
        Cubemovement cm = inGo.GetComponent<Cubemovement>();
        cm.bs = backsideSkript;

    }
}

Prefab:
 

public class Cubemovement : MonoBehaviour
{
    public Backside bs;

}

Denke das ist auch eher was du urspruenglich wolltest, die Prefabs einfach nur mit dem Backside Skript verknuepfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...