Tagebuch: Black Planet

Dafür ist eigentlich der Canvas-Scaler ganz gut geeignet (die Komponente ist standardmäßig bei deinem Canvas mit dabei). Bei mir schaut die so aus:

image

bei mir auch :slight_smile:

allerdings ist in der Demo-Version das mit dem Zahnrad (oben rechts, im Sol) schön zu erkennen. Der Anchor liegt auf der Ecke, aber bei 1024x768 ist das Zahnrad woanders als bei 1920x1080…

Der Link ist leider expired.

muss ich also doch erst runter laden -> x8games.de

Kann ich hier gerade schlecht nachprüfen. Würde jetzt aber für mich danach klingen, als ob du alles „absolut“ ausrichtest anstatt die Layout-Möglichkeiten mit Pivot-Point & Co zu nutzen. Da kannst du z.B. sagen: „klatsch das teil in die obere rechte Ecke des Containers“. Und dann ist das auch wirklich da.

ich habe jetzt nochmal ein Demo-Projekt aufgesetzt. Da funktioniert es so wie Du es machst bzw. die Anleitung es auch beschreibt. Muss mal ins eigentliche Projekt schauen, was da schief läuft. Die Pivot benutze ich eigentlich.

ich habe den Fehler gefunden - wie schon geschrieben, die Pivot-Punkte nutze ich eigentlich.

Ich habe ja pro Szene verschiedene Message-Boxen. Alle Elemente dieser Boxen sind unterhalb eines leerem GameObject. Dieses leere GameObject ist direkt als Kind des Canvas. Und das Canvas hat die passenden Einstellungen. Durch diese leere GO kann ich die einzelnen Boxen ein- und ausblenden.

Und das Problem ist eben dieses GO. Es hat nur eine feste Größe von 100x100 und passt sich nicht automatisch dem Screen an. Bisher waren die Boxen immer in der Mitte angeordnet und damit fiel das Problem nicht auf. Erst im Sonnensystem war das Zahnrad oben rechts angeordnet, entsprechend mit Pivot. Nur hat sich das GO nicht angepasst und damit war das Zanhrad unterschiedlich je nach Auflösung.

Das leere GO mus auf Auto-Size gesetzt werden - dann klappt auch alles.

sooo … ich sitze im Moment wieder am Reißbrett, aber

Das Positive zu Erst. Ich habe endlich raus gefunden wie ich zu Laufzeit Planetenoberflächen selber erstellen kann. Man kann ja eine Texture einfach bemalen. Zwar recht simpel nur die einzelnen Pixel, aber es ist auch möglich sich dann passende Funktionen zu basteln. Damit bin ich an der Stelle nicht mehr auf fertige Texturen/Prefabs angewiesen und kann das Sonnensystem mehr an meinen Wunsch orientieren.

Nun zum Reißbrett. Ich bin mir nicht sicher ob ich, wie im Demo, die Planeten stehen lasse - auf einer Seite der Sonne. Ob ich sie auf der Seite ein bisschen schwanken lasse. Oder ob ich die Planeten generell einmal um die Sonne kreisen lasse. Und gerade um Letzteres geht es. Ich muss mir einmal ernsthaft Gedanken machen, wie das Fliegen von Planet zu Planet genau passieren soll. Es bringt nichts wenn man ein 10+ Runden warten muss, bis das Raumschiff auf den äußeren Planeten angekommen ist. Wenn es aber innerhalb einer brauchbaren Zeit passiert, dann würde ich mich nämlich schon gerne für ein realistischeres Sonnensystem entscheiden.

OpenGL und DirectX bieten Beide die Möglichkeit den Frame Buffer bzw. das Render Target auf eine Textur zu wechseln. Das nutze ich bei mir um das Raumschiff einmalig in eine Textur dynamisch zu prerendern (als wie wenn ich das auf den Bildschirm rendern würde) und zeichne dann nur noch die fertige Textur als Quad auf den Bildschirm.

Das lässt sich in Unity doch bestimmt auch irgendwie bewerkstelligen. Dann kannst du auch direkt Shader einsetzen.

ja - man muss nur die API dazu finden :slight_smile:

Die Kamera kann man ja direkt auf eine Plane rendern zu lassen. Ist nur doof, da ich im Sonnensystem nicht die Planetenoberflächen habe. Also kann ich das erstmal vergessen. Also war der Gedanke die Textur selber zu berechnen und ein paar Pixel/Rechtecke/Linien/Kreise zu Zeichen (Texture 32x32 oder so). Nur bietet Unity kein System.Drawing.Image…

Also Google bemüht und selbst mit dem Schlüsselwort „runtime“ kamen da (erstmal) nur Vorschläge wie „in die Hierachy ziehen“ - unter „runtime“ verstehe ich anscheinend was anderes. Irgendwann habe ich eine Erweiterungsmethode in Unity zum Laden von PNG etc. gefunden. Das wird dann direkt in einen Textur geladen. Theoretisch perfekt, nur fehlt die Möglichkeit eine Image zu zeichen. Scheint die Mono-Variante von Unity gestrichen zu haben.

Nun habe ich die Wahl mit Texture.SetPixel() alles einzeln zu malen oder ich lasse auf dem Server die Textur zeichenen und schicke sie an den Client. Wobei letzteres würde ich ungern machen, ich wollte eigentlich soviel Rechenleistung wie möglich auf den Client verlagern.

Moin, kleiner Zwischenbericht,

im Moment bin ich am Ausarbeiten für die Sonnensysteme, also wie sie ungefähr mit den einzelnen Planetentypen “besiedelt” werden. Es gibt inzwischen sechs verschiedene Planetentypen, die eine eine gewissen Häufigkeit im Abstand zu Sonne haben. Ziemlich weit draußen mehr Eisplaneten, während im inneren eher Lavaplaneten auftauchen.

Als Grundlage für die Verteilung habe ich Gauß aus Grundlage genommen und ein bisschen mit den einzelnen Kennwerten rum gespielt. Die dicken Linien sind die gewünschte Verteilung der einzelnen Planeten im Sonnensystem. Die gepunkteten die reale Verteilung im Zusammenhang mit den anderen Planeten.

image

Mein aktueller Planetengenerator. Ich bin von der Idee weg, die generierte Oberfläche (Regionen) als Textur zu erstellen. 16x16 Pixel sehen einfach “bescheiden” aus.

so …

im Moment scheint der Crash am Treiber in Linux zu liegen. Nicht mal das LWRP-Demo Projekt ließ sich starten (da ist Unity gleich abgestürzt). Im Projekt selber scheine ich einen Weg gefunden zu haben, um den Crash auszulösen.

Nun habe ich direkt von AMD den Treiber installiert und ich kann den Crash im Moment nicht mehr auslösen. Dafür spinnt jetzt Maxdome rum. Das klingt manchmal wie eine Schallplatte mit Sprung. Da wird alles im Sekundentakt wiederholt (gerade wenn irgendwie die Grafikkarte mehr benötigt wird).

Ich schau mal ob ich so weiter arbeiten kann…

okay … die Crashs scheine ich erstmal unter Kontrolle zu haben (Desktopeffekte deaktiviert) … die Zwillinge schlafen schon, kein Mittagsschlaf macht doch was aus :smiling_imp: … ich bin etwas motiviert

Ich werde mal jetzt mich daran machen was ein Planet alles haben muss (Mond, Asteroiden, …) und mir dazu mal ein oder zwei DB-Tabellen einfallen lassen. Dann wie ein Sonnensystem aussehen kann und noch ein bisschen mehr DB-Tabellen ausdenken. Also wieder erstmal Theorie und Fahrplan erstellen. Dann Werde ich meinen Planeten-Tester überarbeiten (siehe oben)

:crazy_face: VS Code missing UnityEngine.UI - Unity Answers

Nett. Das erinnert mich ein wenig an Populous The Beginning.
Nebenfrage: Was waren das für Geräusche am Anfang? :smiley:

wenn ich das wüsste - hatte eigentlich keine Audioaufnahme vorgesehen :grin:

Himmel-Herr-Gott-Nochmal, finde den Fehler:

    void OnMouseUpAsButton() {
        if (EventSystem.current.IsPointerOverGameObject()) return;
        if (SHOWDEBUG) Debug.Log("Mouse3DHandler -> Clicked()");
        listener?.OnObjectDown(gameObject, null);
    }
    void OnMouseDown()  {
        if (SHOWDEBUG) Debug.Log("Mouse3DHandler -> Down()");
        listener?.OnObjectClicked(gameObject, null);
    }
    void OnMouseUp() {
        if (SHOWDEBUG) Debug.Log("Mouse3DHandler -> Up()");
        listener?.OnObjectUp(gameObject, null);
    }
    void OnMouseEnter() {
        if (SHOWDEBUG) Debug.Log("Mouse3DHandler -> Enter()");
        listener?.OnObjectEnter(gameObject, null);
    }
    void OnMouseExit() {
        if (SHOWDEBUG) Debug.Log("Mouse3DHandler -> Exit()");
        listener?.OnObjectExit(gameObject, null);
    }

Aus meine Klasse die die Mouse-Events für die 3D-Mesh abfängt. Der Fehler sorgt natürlich dafür das man ein UI-Element anklickt und das 3D-Objekt hinter dem UI-Element. Ick will aber nur das UI-Element.

Kann man schon mal ein paar Tage suchen -.-

Hatte so ein ähnliches Problem bei meinem Tower Defender glaub auch gehabt. Ich habs glaub mittels RayCasts gelöst. Damit solltest du ja ganz gut mitbekommen, welches Objekt geklickt wurde. Ist es ein UI-Layer, dann ignoriert das 3D-Objekt die Eingabe

Moin,

das MonoBehavior liefert für die Mouse automatisch die Events: Enter, Down, UpAsButton (Click-Event), Up und Exit. Also eine eigene Klasse die den ganzen Kram abfängt und einen Listener dazu um es weiter zu reichen. Beim Testen wollte ich nur das Click-Event verwenden um die Animation für die Kamera zu starten. Aber beim Klick auf den „Zurück“-Button (war direkt über dem Planeten) kamen dann die Probleme.

Nach einigem Suchen habe ich auch schnell die eigentliche Lösung gefunden:

if (EventSystem.current.IsPointerOverGameObject()) return;

Also die Zeile schnell in OnMouseUpAsButton gebaut um zu testen ob es funktioniert. Leider funktionierte es nicht. Nach einigen Tagen (da ich hier nur ca. 1h Abends was machen kann) habe ich den Fehler gefunden. OnMouseAsButton reiche ich als Down weitere und das Down-Event als Click-Event…

void OnMouseUpAsButton() {
    ...
    listener?.OnObjectDown(gameObject, null);
}
void OnMouseDown()  {
    ...
    listener?.OnObjectClicked(gameObject, null);
}