Jump to content
Unity Insider Forum

Objekte befinden sich außerhalb des Sichtbereichs


Heiner Müller

Recommended Posts

Hallo,

Ich plage mich jetzt seit einigen Tagen mit meinem Problem herum und suche nun hier Hilfe.

Zunächst sei gesagt, dass ich über Grafikerstellung und -bearbeitung nahezu kein Wissen verfüge.
Daraus resultierend ergibt sich, dass ich nicht weiss, wonach ich suchen muss, da mir die Begrifflichkeiten fehlen.

Mein Problem besteht darin, dass sich von mir im C#-Code instantierte Objekte immer außerhalb des Sichtbereichs befinden.
Ich schaffe es nur, bei laufendem Programm, in der UNITY-Szenen-Ansicht die Kamera - den Viewport? - zu verschieben, so dass das Objekt auch in der "Game-View" erscheint.

Hierzu nun zwei Fragen:
Wie kann ich Objekte im sichtbaren Bereich erzeugen oder dorthin bewegen?
Wie kann ich die Kamera oder den sichtbaren Bereich so verschieben/verändern, dass das Objekt in der "Game-View" erscheint.

Ich verzweifle wirklich an dieser Trivialität und hoffe sehr auf Ihre Hilfe.

Bitte keine Tips der Art "lies das liebe Handbuch", ich habe in den letzten Tagen soviel gelesen, dass es mir die Brille beschlägt.

 

Unbenannt.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Ganz so pauschal lässt sich das leider nicht sagen, da es auch etwas von den Anforderungen abhängt. Wann soll welches Objekt verfolgt werden bzw. wo auf dem Bildschirm sichtbar sein?

Aber was man allgemein sagen kann ist folgendes:

  • Die Kamera (Camera-Klasse in C#) hat Methoden um Pixel- oder Viewport-Koordinaten in Welt-Koordinaten umzurechnen. Die untere linke Ecke hat die Pixel-Koordinate (0,0). Soll nun ein Szenen-Objekt an die Pixel-Koordinate (50,50) des Bildschirms platziert werden, kann folgender Code verwendet werden:
    Camera cam = gameObject.GetComponent<Camera>();
    Vector2 pixelCoords = new Vector2(50f, 50f);
    Vector3 worldCoords = cam.ScreenToWorldPoint(pixelCoords);
    someGameObject.transform.position = worldCoords;

    Auf die gleiche Weise können auch neue Objekte an den gewünschten Pixel-Koordinaten erstellt werden mit Instantiate().

  • Die einfachste Möglichkeit, dass die Kamera ein Objekt verfolgt, ist das Kamera-Objekt einfach als Kind an das zu verfolgende Objekt anzuhängen. Das geht auch im Code, indem transform.parent der Kamera auf das zu verfolgende Objekt (Transform) gesetzt wird. Die Kamera muss dann einfach etwas hinter dem Objekt sein, damit sie das Objekt sehen kann.

  • Ansonsten gibt es soviel ich weiss bereits in den Standard Unity-Packages - die man über Menu Assets > Import Package importieren kann - Scripts, die an eine Kamera angehängt werden können. Oder wenn nicht dort, dann in den Standard Assets die es gratis im Asset Store gibt. Bei diesen Scripts kann man meist nur ein Objekt als Ziel festlegen und dieses wird dann verfolgt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Danke für die schnelle Antwort.

Sie haben mir schon geholfen, ein kleiner Schubser in die richtige Richtung.


In bin als Startpunkt von der Screen-Koordinate 0,0 - links oben - ausgegangen und dachte, sie wäre immer automatisch im sichtbaren Bereich der Kamera.

Offensichtlich ist dem nicht so.

Kann man diesen Sichtbereich  manipulieren? Falls ja, wie?

Das Transform--Objekt der Kamera liefert mir die Position der Kamera in der Szene, oder?


Was genau bedeuetet Viewport?

Ich weiss darüber, dass er relativ zum Parent-Objekt ist und von 0,0 links oben bis 1,1 rechts oben geht.


Mir muss da etwas grundsätzliches entgangen sein.

Egal welche Auflösung ich einstelle, die Objekte sind nicht zu sehen.

In der Szenenansicht befinden sie sich jetzt bei Programmstart - bei 300x300 Pixel Auflösung - in der Mitte, sind in der Game-View nicht zu sehen.

Nun gehe ich bei selektierter Kamera in die Menüleiste auf GameObject -> "Align with view" oder "Move to view" und die Objekte sind sichtbar in der Game-View.
Kann man diese Funktion auch im Programm aufrufen?

Vor Align.png

Nach Align.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Viewport-Koordinaten sind im Prinzip nur Prozentangaben bezogen auf das von der Kamera gerenderte bzw. angezeigte Bild. (0,0) entspricht 0% und befindet sich wie bei den Screen/Pixel-Koordinaten unten links. (1,1) ist je 100% für X und Y und somit oben rechts. Man kann damit also unabhängig von der Auflösung arbeiten. (0.1, 0.1) wäre z.B. 10% der X-Auflösung von linken Rand entfernt und 10% der Y-Auflösung vom unteren Rand entfernt.

Ich denke jedoch, was Sie benötigen, sind die UI-Elemente von Unity. Mir war zuerst nicht klar was das für Objekte sind, aber es sieht nach 2D-Bildern aus, daher sind die UI-Elemente vermutlich am besten geeignet.

Um die Bilder für die UI zu nutzen, müssen diese nicht als Texturen sondern als Sprites importiert werden. Dies kann bei den entsprechenden Bildern im Inspektor festgelegt werden.

Danach wird ein Canvas benötigt. Das ist sozusagen die Oberfläche auf welcher die GUI-Elemente angeordnet und angezeigt werden. Das Canvas kann per Menu Game Object > UI > Canvas erstellt werden. Dieses ist standardmässig bereits auf Screen Space eingestellt, was bedeutet, dass es in jedem Fall immer bezogen auf den Bildschirm zeichnet.

Anschliessend können Sie mit dem Menu Game Object > UI > Image ein Bild-Objekt erstellen. Falls dieses nicht innerhalb des Canvas-Objekts erstellt wurde, sollten Sie es nachträglich mit der Maus dort rein ziehen. Beim Image können Sie das entsprechende Sprite bzw. Bild auswählen das angezeigt werden soll.

Das wichtigste am UI-System ist, dass jedes UI-Objekt ein RectTransform anstatt ein Transform hat. Mit dem RectTransform lässt sich definieren, ob ein Objekt bezogen auf eine bestimmte Ecke des Canvas/Bildschirms oder des übergeordneten Objekts positioniert werden soll.

Ausserdem gibt es noch Layout-Komponenten, z.B. die Komponente GridLayoutGroup, welche automatisch ein Gitter/Tabellen-Layout erstellen kann, ohne dass Sie die Elemente manuell anordnen müssen. Dazu erstellen Sie ein leeres neues GameObject, ziehen es in das Canvas und fügen manuell die Komponente GridLayoutGroup hinzu. Dort können Sie dann einfach die Zellengrösse und den Abstand zwischen den einzelnen Zellen definieren (sowie maximale Spalten pro Zeile) und dann einfach Image-Objekte als Kinder hinzufügen. Diese werden automatisch gemäss Zellendefinition angeordnet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

nochmal vielen Dank für Ihre Mühe.

Ich vergass zu erwähnen, dass es sich um 2D-Objekte handelt.

Der Canavs war es. So etwas einfaches und so viel Ärger.
Ihrer Erklärung gemäß ist es auch absolut einleuchtend warum man diesen benötigt.

Ein, zwei Fragen seien mir bitte noch erlaubt, danach werde ich Sie nicht mehr behelligen:
Ich erstellte zwei Objekte
1. spriteContainer =
    GameObject + Canvas + SpriteRenderer + scriptSprite.cs
2. gameContainer =
    GameObject + Canvas + scriptCanvas.cs mit Verweis auf Prefab spriteContainer

Ich stellte fest, dass ich bei dem gameContainer das GameObject weglassen kann.
Welche der beiden Möglichkeiten wäre die bessere?

In dem gameContainer würde ich gerne eine Image als Hintergrund benutzen, diese verdeckt jedoch meine Sprites.
Kann ich dies über Layer lösen?
Oder sollte ich die Hintergrund-Image außerhalb des gameObjects als eigenes Objekt nutzen?

Das waren jetzt schon drei Fragen...

GridLayoutGroup ist das Element meiner Wahl, es erspart mir einiges an Aufwand.

Das kommt dabei heraus, wenn man sich nach vielen Jahren Windows-Programmen und Datenbanken in die Welt der Grafikerstellung begibt.
Mein erster großer Grafikkracher wird noch lange auf sich warten lassen:

Danke vielmals, Sie haben mir ein ganzes Stückchen weitergeholfen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo, gern geschehen ;)

Ich bin mir nicht ganz sicher ob ich die Frage richtig verstanden habe.

Ein weiteres Canvas pro Bild/Sprite ist nicht unbedingt nötig. Im Zusammenhang mit Canvas arbeitet man normalerweise eher mit Image-Komponenten (UI > Image), statt mit SpriteRenderern (aber es funktioniert vermutlich auch damit). Somit könnte das Prefab nur gerade aus einem GameObject mit einer Image-Komponente + RectTransform bestehen. Das Prefab wird dann innerhalb des Canvas instantiiert, indem als Parent das Canvas gesetzt wird (was vermutlich Ihrer Variante 2 entspricht).

Für die Sortierung gibt es nebst den normalen Layern - die eher für Kollision etc. verwendet werden - neu auch sogenannte Sorting Layers. Jedes UI-Element und auch der SpriteRenderer haben im Inspektor eine Eigenschaft Sorting Layer, wo der entsprechende Sorting Layer ausgewählt werden kann. Es ist auch möglich nur mit dem Default Sorting Layer zu arbeiten, indem Sie bei der Eigenschaft "Order in Layer" die Zahl entsprechend anpassen. Nach dieser Zahl wird innerhalb eines Sorting Layers sortiert. Haben mehrere Objekte den gleichen Layer und die gleiche Zahl, so sortiert Unity die Grafiken in der Regel nach der Objektreihenfolge in der Szene. Ausserdem kann zur Sortierung auch die Z-Position von Objekten genutzt werden, vorausgesetzt die Kamera rendert die XY-Ebene.

Das heisst, der Hintergrund und die Sprites können alle im selben Canvas sein, müssen aber nicht. Es ist auch denkbar den Hintergrund als simplen SpriteRenderer ausserhalb des Canvas zu haben (mit dem entsprechenden Sorting Layer oder Z-Position).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,


Mein Sprite-Prefab, besser wäre die Bezeichnung Tile-Prefab, besteht nun aus einem Image-Objekt in der Hierarchie-Ansicht nebst einem Script.
Das war auch beim Verfassen meines letzten Posts so, ich hatte mich nur verschrieben.
Bei UI-Elementen verwendete man Images, nicht SpriteRenderer, das weiss doch jeder...

Mein Game-Container ist nun einfach ein Canvas in der Hierarchie-Ansicht mit dem Hauptscript ohne ein umfassendes GameObject.
Hinzugefügt habe ich eine GridLayoutGroup und einen Content Size-Fitter.

Endlich funktioniert es so wie seit Tagen gewünscht: ich lese aus einer Datei die Level-Daten ein, erzeuge Tiles im Grid und weise diesen die entsprechende Bilddatei zu.
In der GameView kann ich das Grid bestaunen, die Tiles besitzen die gewünschte Größe.
Fabelhaft.

Jetzt würde ich nur noch gerne in Erfahrung bringen, wie ich einzelne Elemente oder alle aus der GridLayoutGroup entfernen kann.
Ich habe die instantierten Objekte in einer Liste gespeichert und lösche diese vor dem Neuaufbau des Grids mittels foreach -> Destroy(obj).
Die GridLayoutGroup scheint davon unberührt zu sein, da sich anschließend die doppelte Anzahl an Elementen darin befindet.

Man stelle sich nur vor, dies geschähe zehn- hundert- oder gar tausendfach - der ganze Speicher wäre vollgemüllt mit diesen Tiles.

 

Dann würde ich gerne noch in Erfahrung bringen, welches Tile angeklickt wurde.
In dem Tile-Script:
void Update ()
    {
        if(Input.GetMouseButtonDown(0))
        {     
            GameObject selObj = EventSystem.current.currentSelectedGameObject;
            if (selObj == null) return;
            if (selObj.gameObject.tag == "TILE")
                mainScript.tileClicked(selObj.GetComponent<scriptTileUI>().id);
        }
    }
 
selObj ist immer = null.

Können Sie mir sagen, woran das liegt?


Immer wieder Danke für Ihre Geduld mit mir...

Nachtrag:

void Update ()
    {
        if(Input.GetMouseButtonDown(0))
        {
            GameObject.FindGameObjectWithTag("MAIN").GetComponent<scriptMain>().tileClicked(this.id);
            return;

}

}

ruft für jedes vorhandene Element die Funktion tileClicked() auf. Wie kann ich dieses auf das tatsächlich aufgerufene Element beschränken?

 

Nachtrag Nummer zwei:

Die Elemente in dem Grid lassen sich löschen, die Invasion der Tiles konnte verhindert werden.

Ich suche nur noch nach einer Möglichkeit, das angeklickte Tile zu bestimmen.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Das EventSystem reagiert bereits selbständig auf Klicks und andere Inputs. Es gibt diverse Interfaces wie z.B. IPointerClickHandler, IPointerEnterHandler etc.. Das Tile-Script kann eines oder mehrere dieser Interfaces implementieren um auf die gewünschten Events zu reagieren. Dabei wird automatisch die Bild- bzw. Collider-Grösse und Form berücksichtigt.

In der Dokumentation hat es ein Beispiel. Auf der linken Seite sehen Sie auch die restlichen Interfaces die es gibt: https://docs.unity3d.com/ScriptReference/EventSystems.IPointerClickHandler.html

Die Methode wird nur bei dem Sprite ausgeführt, welches angeklickt wurde. Diesen Klick können Sie wie bisher z.B. an das Main-Script weiterleiten.

Da Sie von Tiles sprechen, möchte ich nun doch noch anmerken, dass es in Unity seit kurzem auch Tilemaps gibt. Dort werden aber wiederum Sprites verwendet und die Kamera muss selber so bewegt werden, dass die gewünschten Tiles auf dem Bildschirm zu sehen sind. Der Vorteil ist, dass es bei sehr vielen Tiles (hunderte) wesentlich optimierter ist. Tilemaps sind daher optimal für Sidescroller- oder Top-Down-Games.

Bisher sah es für mich so aus, als möchten Sie eine fixe Anzahl Sprites/Tiles auf dem Bildschirm haben, ohne Scrolling, daher habe ich das UI empfohlen. Falls Scrolling benötigt wird, liesse sich das sicher auch mit UI lösen, indem die GridLayoutGroup nochmal ein Parent-GameObject hat, welches dann einfach mit einem Offset aus dem Bildschirm heraus geschoben wird. Bei sehr vielen Tiles könnte aber die Performance gegenüber einer Tilemap schlechter sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

man mag es kaum glauben, aber jetzt funktioniert es.

 

In einem Anflug von Verzweiflung ersetzte ich die Image-Tiles durch Button-Tiles.

Ich hege jedoch den Verdacht, dass die Ursache woanders lag, nämlich bei mir, ich muss da etwas wichtiges übersehen haben.

 

Ich erstellte zuerst ein Projekt mit Button-Tiles in einer GridLayoutGroup.

Dort funktionierte  alles.

Dann übernahm ich alles in das eigentliche Projekt und darin funktionierte wieder das Aufrufen der OnClick-Methode nicht.

Ich habe alles mehrfach geprüft, ich kann den Fehler nicht finden. Es muss einer vorliegen, jedoch kann ich ihn einfach nicht finden.

 

Egal, jetzt klappt alles, was ich zu großen Teilen Ihnen zu verdanken habe.

Zur Zeit habe ich keine weiteren Fragen.

Falls doch noch welche auftauchen sollten, dürfte ich diese Ihnen hier in diesem Thread stellen?

 

Danke sehr für Ihre Hilfe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Jetzt quält mich doch wieder etwas seit längerer Zeit.

Meine Szene besteht aus einem Canvas mit zwei Paneln als Child-Objekte darunter, auf dem Screenshot zu sehen als linker und rechter Teil.
Jedes Panel hat ein eigenes Script und benutzt einen eigenen Button-Prefab mit jeweils eigenem Script, also P1 -> S1 und PF1 mit PFS1, P2 -> S2 und PF2 mit PFS2.

Ich schaffe es, im rechten Teil Drag and Drop zu benutzen, also z.B. die Glühbirne im rechten Teil - rechten Objekt - zu verschieben.
Desgleichen funktioniert im linken Teil mit den linken Objekten.

Was ich absolut nicht bewerkstelligt bekomme ist ein Bewegen eines Objekts aus der rechten Seite zu der linken oder andersherum.
Ich möchte z.B. die stylische Glühbirne rechts nacht links ziehen - das funktioniert - und dort droppen mit dem Effekt, dass das betroffende Feld zu einer Glühbirne wird.

Ich weiss, dass ich diese Mutation des Feldes im Script lösen muss und habe auch schon eine entsprechende Funktion nebst Variablen.

Mein Problem ist nun, dass auf der linken Seite der IDropHandler nicht aufgerufen wird.

Haben Sie eine Idee, woran das liegen könnte?
Wonach muss ich suchen?

 

Szene.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Vermutlich liegt es daran, dass für das Drop nur das erste mögliche Objekt in betracht gezogen wird. Die darunterliegenden Objekte erhalten dann keine Benachrichtigung mehr.

Dem kann abgeholfen werden, indem beim GameField-Objekt bei der Image-Komponente das Häkchen "Raycast Target" deaktiviert wird. Somit kommt das GameField nicht mehr für Maus-Eingaben in Frage, nur noch die darunter liegenden Buttons. Falls zwischen GameField und den Buttons nochmal ein Objekt ist, müsste dort das "Raycast Target" ebenfalls deaktiviert werden.

Wenn Die Buttons auch von links nach rechts gezogen werden können, dann müsste beim ToolField das gleiche gemacht werden.

Ansonsten könnte es noch an der Reihenfolge liegen. Beim OnDrag müsste evtl. das gezogene Objekt ganz nach vorne gebracht werden (z.B. via Z-Position oder in der Szene ganz nach unten verschieben, indem das Objekt während dem Draggen direkt als letztes Child des Canvas eingefügt wird, auf der gleichen Ebene wie GameField und ToolField.)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

Wiederholt einen schönen Dank für Ihre Hilfe.

Es lag tatsächlich an dem Raycast-Target.

Ich meine zwar, es damit versucht zu haben, bin mir aber dessen nicht mehr sicher.

In einem Testprojekt funktioniert es jetzt wie gewünscht, in meinem Zielprojekt jedoch noch nicht, ich hatte allerdings noch keine Zeit für eine nähere Betrachtung. Vermutlich werde ich das Layout umstellen müssen, was bei einem solchen Miniprojekt keine allzu große Herausforderung darstellen dürfte.

...Spricht der UNITY-Senior-Master-Composer...

Ich kann jetzt Objekte zwischen zwei Panels verschieben, wobei mir klar wurde, dass ich die gewünschte Anordnung/Abtrennung der Elemente auch auf andere Art bewerkstelligt bekommen kann. Mal sehen, wie ich das handhabe.

Wenn man weiss, wo oder wonach man schauen muss, dann ist Unity eine wirkliche Schatztruhe an Helfern. Gefällt mir immer besser.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Guten Morgen,

Nun stellt mich UNITY wieder vor ein Rätsel.

Ich erzeuge im laufendem Programm im Script ein Objekt aus einem Prefab.

Dieses Objekt ist in der Szenenansicht sichtbar, in der Gameansicht jedoch nicht.

Das Objekt interagiert in der Gameview mit seiner Umwelt - Schläger, welcher einen Ball schlägt - ist aber dort nicht zu sehen.

Wenn ich dieses Objekt im Editor aus dem Assetordner in die Szene ziehe, ist es in der Gameview sichtbar.

Das Objekt setzt sich zusammen aus SpriteRenderer, Box-Collider 2D, Rigidbody 2D nebst einem Script.

 

Ich habe den Sortinglayer überprüft, die Z-Order, GetComponent<Renderer>().enabled = true, xxx.setActive(true), das Objekt bleibt hartnäckig unsichtbar.

Es funktioniert aber, also ist es da, nur unsichtbar.

 

Was habe ich nun wieder übersehen?

Bitte erleuchten Sie mich...

 

 

 

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein kurzer Nachtrag, bitte.

Ich habe immer noch auftauchende Probleme mit den Koordinaten-Systemen.

Ich möchte z.B. die Größe des Objekts auf 16x8 Pixel ändern und versuche es folgendermaßen:

SpriteRenderer rend = g.GetComponent<SpriteRenderer>();

Vector2 vs = new Vector2(16, 8);
vs = Camera.main.ScreenToWorldPoint(vs);
 rend.size = vs;

 

...und das Objekt ist riesengroß.

 

Was mache ich falsch?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

Wenn ein Objekt per Script erstellt wird, dann hat es standardmässig kein Parent (ausser man gibt dieses bewusst an). Beim manuellen in die Szene ziehen, haben Sie es evtl. in das Canvas hinein gezogen? Das gleiche müsste auch per Script gemacht werden (parent = Canvas bzw. Grid oder sonst ein Container innerhalb des Canvas).

Wenn mit Canvas gearbeitet wird, ist es besser Images zu verwenden und nicht SpriteRenderer, vor allem wegen dem Layout und dem Koordinatensystem. Normalerweise sollte das Canvas automatisch so skaliert werden, dass die Einheiten innerhalb des Canvas einem Pixel entsprechen. Somit muss manuell nichts mehr umgerechnet werden. Die Höhe/Breite im RectTransform entspricht dann ebenfalls Pixeln.

Bei SpriteRenderer.size kommt es auf die Import-Einstellungen des jeweiligen Sprites an: "Pixels Per Unit". Diese ist normalerweise 100 Pixel pro Einheit. Das bedeutet eine Grösse von Vector2(1, 1) ist 100px * 100px. Somit müsste es funktionieren, wenn Sie die Werte einfach durch 100 teilen: new Vector2(0.16f, 0.08f).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Tag,

 

ich wollte Ihnen gestern mit einer Antwort zuvorkommen, versäumte es aber.

 

Endlich habe ich verstanden, was und wie wichtig PPU sind.

Ich konnte zuerst nichts damit anfangen, schob das Thema zu Seite und quälte mich mit diesen ominösen UNITY-Units.

Nun ist mir einiges klarer, ich stochere nicht mehr so sehr im Dunkeln herum.

Meine letzten Posts sind mir jetzt regelrecht peinlich, unwissendes Anfänger-Gebrabbel...

 

>> ... dass die Einheiten innerhalb des Canvas einem Pixel entsprechen. << Danke für den Tip, war mir nicht bewusst.

 

Das jetzige Projekt arbeitet mit Sprites, ohne Canvas.

Das Problem mit dem Objekt wurde durch eine negative Z-Position durch meine Unachtsamkeit verursacht.

Ich liess einen Vector durch ScreenToWorldPoint(v) umrechnen und Z war danach -9.

Ich war mir sicher, dies überprüft zu haben.

 

Ich werde mich die nächste Zeit mit dem Thema Skalierung beschäftigen müssen.

Ich weiss nicht genau, wie ich das Bild/die Szene an die entsprechende Auflösung anpasse.

Ich fürchte, da wird die eine oder andere Frage meinerseits and Sie auf zukommen...

 

Tausend Dank für Ihre Zeit. Und Ihre Geduld.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Hallo und guten Tag,

Nun bin ich wieder auf ein - höchstwahrscheinlich selbst verbrochenes - Kuriosum gestoßen.

 

Auf dem Screenshot sehen Sie links mein aus vier Sprites - Blöcken - bestehendes, im Inspector selektierten Objekts.

Ich fügte die Blöcke auf dem Bildschirm zusammen, erstellte im Inspector ein leeres GameObject, verschob die vier Blöcke dort hinein und erstellte ein Prefab.

...und wunderte mich bei der Benutzung im Script über eine seltsame Positionierung der aus den Prefabs instantierten Objekten.

 

Unten rechts sehen Sie die zu diesem Objekt gehörigen Elemente des Move-Tools, welches sich normalerweise über der Mitte des Objekts befindet, oder?

Dieser Punkt stimmt überein mit der gewünschten Position der Blöcke auf dem Bilschirm.

 

Es wurde wohl der Mittelpunkt/Ankerpunkt/Pivotpunkt verschoben oder falsch positioniert, richtig?

Wie kann so etwas geschehen?

Wie kann ich diesen Zustand verändern?

Wie wird dieser Punkt richtig bezeichnet?

 

Vielen Dank im voraus für Ihre Hilfe.
 

 

Unbenannt.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

Wird ein neues Empty-Objekt erstellt, befindet sich dieses meistens an einer eher zufälligen Position oder aber bei 0,0,0. Wenn nun andere Objekte in das Empty gezogen werden, dann behalten diese ihre absolute Welt-Position bei, werden aber relativ zum Empty positioniert (da es nun untergeordnete Objekte sind).

Das Empty stellt somit den Pivot-Punkt dar (was den Namen angeht habe ich schon alles mögliche gehört, in Unity wird es offiziell Pivot point genannt, zumindest heisst der Button oben in der Toolbar so, mit welchem zwischen Pivot-Punkt und Mittelpunkt gewechselt werden kann).

Zum Beheben des Problems, können die untergeordneten Objekte nochmal aus dem Empty/Parent heraus gezogen werden (ohne die Position zu verändern). Anschliessend kann das Empty dorthin verschoben werden wo sich der Pivot-Punkt eigentlich befinden sollte. Werden die 4 Blöcke nun wieder in das Empty hinein gezogen, dann müsste der Pivot-Punkt stimmen.

Ich hoffe das hilft ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

 

Ich habe nochmal ein Empty erstellt und zum ersten Mal gesehen, dass dieses tatsächlich eine Position auf dem Screen einnimmt, nur halt eben leer.

Asche über mein Haupt und die Batterien meiner Tastatur entfernt...

Ich hielt Emptys vorher für auf dem Screen nicht vorhanden, erst beim - und durch das - Hinzufügen von Objekten.

Ich habe Emptys allerdings bisher nicht so verwendet wie in diesem Projekt, einem Tetris-Klon, in welchem ich die einzelnen Objekte benötige und nicht das gesamte Objekt.

Ihr Tip funktioniert erwartungsgemäß tadellos.

 

Jetzt habe ich zunächst einen Block in den Inspector gezogen und die anderen Blöcke als Children dieses Blocks.

Mal sehen, welche Vorgehensweise die für mich bessere ist.

 

Danke sehr für Ihre Hilfe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

Guten Morgen,

 

Ich versuche vermutlich wieder das Unmögliche oder das Unnötige und benötige einen kleinen Stupser in die richtige Richtung...

 

Ich möchte über einem Sprite einen mitgehenden Infokasten bestehend aus einem Panel nebst Buttons und Text-Elementen.

Mit anderen Sprites funktioniert es, mit einem Panel jedoch nicht.

Können Sie mir sagen, weshalb das Panel sich nicht mitbewegt? Ist das überhaupt möglich?

 

Danke sehr.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...