Jump to content
Unity Insider Forum

verschiedene transparente Images/Layer dynamisch generieren


Darktower

Recommended Posts

Hallo erstmal!

Meine Ausgangslage bzw was ich eigentlich erreichen will:

Ich habe vor, ein Strategiebettspiel (ähnlich wie Risiko) in Unity umzusetzen. Dabei haben die Regionen keine einheitlichen Größen (wie auch bei Risiko). Um die verschiedenen Regionen anzusprechen, habe ich einen mehrschichtigen (mehrere Layer übereinander) Aufbau des Spielbretts vor. Im untersten Layer befindet sich ein Image wo für jede Region eine eigene Farbe ist. Mittels dieser für jede Region einzigartigen Farbe, kann die Region an einer beliebigen Position ermittellt werden. Im 2.Layer befindet sich der eigentliche Spielplan. Danach hätte ich einen transparenten leeren Layer (um Diesen geht es bei meinem Problem). Und als letzten Layer habe ich nochmals den Spielplan mit einer geringen Transparenz. 

Was ist mein Ziel?:

Ich will, wenn man z.b. mit er Maus auf eine Region geht, die Region leicht grün oder rot (je nachdem, ob man dort eine Aktion ausführen darf) aufleuchtet. Meine Idee wäre, in dem 3 transparenten Layer ein Image dynamisch zu erzeugen, welches eine rote/grüne Fläche überall dort erstellt, wo der Farbcode mit der Region identisch ist. Nur habe ich keine Ahnung wie das genau funktionieren soll, bzw. ob das überhaupt so einfach möglich ist. Oder gibt für mein Problem andere, bessere Lösungen?

Danke im Vorraus für eure Hilfe! 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nachdem hier keine Antworten kommen, nehme ich an, dass ich mein/e Problem/Frage nicht verständlich genug beschrieben habe oder, dass ich den Eindruck vermittelte, dass ich hier nach ner fertigen Lösung bzw Code frage, was nicht der Fall ist.

Ich programmiere, speziell mit C# schon einige Jahre (hobbymäßig), habe mich aber bis vor ein paar Tagen noch nie mit Unity3D und ähnlichen Engines auseinander gesetzt. Darum tute ich mir noch ziemlich schwer, Lösungswege für für verschiedene Probleme, speziell im Grafik/3D-Bereich zu finden.

Mein Hobbyprojekt ist langfristig (bis zu gut 2 Jahren) angelegt. Es geht um eine Umsetzung eines Strategiebrettspieles (ne Art Risiko mit erweiterten Regeln) für den Computer. Das Ganze soll in einer 3D-Umgebung umgesetzt werden. Wobei die Entscheidung für 3D viel mehr optische als spielerische Gründe hat. Der komplette Ablauf bzw. Regeln des Spiels sind vorhanden. Auch eine ziemlich genaue Vorstellung WAS das Game für Features hat und wie es zu bedienen sein soll. In der jetzigen sehr frühen Projektphase, geht es mir einmal primär darum, die einzelnen Features grob zu durchdenken und zu schauen, wie ich Diese in Unity3D umsetzen kann. Zu den meinsten Themen habe ich schon genügend Informationsquellen gefunden, wie welches Feature sinnvoll verwirklicht werden kann.

Es ist ein hochaufgelöstes Image (ca. 300MB) des Spielbrettes vorhanden. Dieses würde ich auch gerne im Game als sichtbaren Untergrund verwenden. Und hier beginnt schon mein Problem, wo ich auch nach stundenlagem googeln keine Lösungswege gefunden habe. Zuerst einmal. Wie sollte ich das Image des Spielbretts am besten in die 3D-Umgebung integrieren? Ist das in Verbindung mit einem Terrain oder besser in einem gewöhnlichen Cube zu machen oder gibt es da überhaupt andere Werkzeuge, welche für Images besser geeignet sind? Weiters muss ich natürlich auch wissen, in welcher Region sich meine Truppen gerade befinden. Wie schon im ersten Post geschrieben, sind die Regionen in ihrer Form und Größe unregelmäßig. Hierzu wäre meine Idee gewesen, einen weiteren unsichtbaren Layer direkt unter dem Spielbrett-Image anzulegen, wo jede Region eine individuelle Farbe hat. Die Maus kann dann auf diesen Layer zugreifen und anhand des RGB-Codes die Region ermitteln. Das wäre eine Lösung, wahrscheinlich nicht die Beste. Weiters will ich auch jede Region farblich herausheben können, wenn man die Maus oder Truppen in eine Region bewegt. Hier kam meine Idee ins Spiel, für jede einzelne Region ein transparentes GameObjekt bzw. Cube zu haben, welcher seine Farbe gegebenenfalls ändert, sodass eine farbliche Heraushebung einer Region erreicht wird (der sichtbare Layer des Spielbretts müsste dann natürlich leicht transparent sein). Ich habe aber keine Ahnung wie ich diese einzelnen GameObjects für meine Regionen generieren kann. Und auch hier wieder, dass ist eine Idee für eine Lösung, aber wahrscheinlich auch nicht die Beste. Wie würdet ihr dieses Problem angehen. Mit welchen Funktionen von Unity oder etwa auch Blender muss ich mich dafür auseinander setzen? Weiss wer Tutorials für ähnliche Dinge?

 Ist mein Problem immer noch nicht klar, bitte fragt mich, was nicht klar ist. Danke ;) 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi.
Also fangen wir mal am Anfang an. Du hast mehrere Regionen, die unterschiedlich aussehen und wahrscheinlich auch unterschiedliche Formen haben, und möchtest mit diesen Regionen interagieren. Also wenn die Maus über einer dieser Regionen ist, soll sie sich einfärben, wenn es die Regel zulässt.
Dieses Problem ist recht leicht zu lösen, denn es gibt die Möglichkeit einen Ray von der Camera aus in Richtung Mauszeiger (und darüber hinaus) zu senden. Suche mal in der Unity Scripting Hilfe nach Physics.Raycast.
Dieses Beispiel sthet da etwas weiter unten:

using UnityEngine;

public class ExampleClass : MonoBehaviour
{
    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, 100))
            print("Hit something!");
    }
}

In der Hilfe siehst du auch, dass mit diesem Raycast ganz viel Info zurück kommen kann, die dir bei der Auswertung helfen werden.

Der Ansatz, dass du eine Grafik im Untergrund hast, und darüber unsichtbare Objekte für jede Region ist gut. Denn du musst ja irgendwie Grenzen schaffen. Also solltest du für jede Region ein 3D Objekt haben, was den Grenzverlauf der Region folgt, also z.B. wie Australien aussieht. Dieses Objekt bekommt einen Meshcollider und liegt genau über der entsprechenden Region.
Ob nun dieses Objekt dann eine Farbe annimmt oder ob dafür dann ein Extra Grafikobjekt genutzt wird, ist ne Designfrage. Probiere einfach mal diverse Ansätze aus.
Ich würde jetzt nicht den Farbcode des Untergrundes ermitteln wollen um somit zu erkennen auf welcher Region man ist. Das ist viel zu kompliziert und Fehleranfällig, denn wer weiß ob jedes Pixel in der Region wirklich die gleiche Farbe hat. Kompressionen können da schon mal probleme Verursachen.

Was ich nicht so ganz verstehe. Willst du jetzt ein erhabenes3D Spielfeld haben, wo echte Berge zu erkennen sind? Oder ist es flach?
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Abend,

leider sind letzte Zeit sehr wenig Experten aktiv hier,  über 50% meiner Fragen sind auch unbeantwortet worden 😭

Daher liegts nicht immer an unverständlichen Fragestellungen.

Ich bin selbst noch noob, aber ich schreibe mal wie ich das angehen würde.

Wie Malzbie schon geschrieben hat und du erwähnt hast, kannst du jedem Region andere Farbe zuweisen und in einem Container Farben mit entsprechenden Regionnamen, stationierte Truppen und weitere Dinge abspeichern. Mit Raycast kriegst du dann die Farbe raus und durchsuchst den Container zur welchen Region das gehört. Diese Lösung grenzt dich aber stark aus, da du immer noch ein Sprite hast das du nicht manipulieren kannst.

Zitat

Wie sollte ich das Image des Spielbretts am besten in die 3D-Umgebung integrieren

Hier wäre vielleicht die alternative Lösung hilfreich.

Du erstellst mit 3D-Grafiksuite  z.b Blender ein 4eck Polygon, machst das Image als Textur drauf und schneidest einzelne Regionen aus, dann kannst du am Ende noch 3D-Fläche daraus extrudieren, damit sie wie echte Erdflächen aussehen und exportierst die Regionen als einzelne Objekte nach Unity. Jetzt kannst du sie manipulieren wie du willst. Du kannst beim ausgewählten Region, andere langsam unsichtbar machen, oder die Grenzen des Regions mit Farben abgrenzen und animieren lassen. Auch Farbe des Regions kann problemlos geändert werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

einmal Danke für eure schnellen Antworten!

@malzbie Deine Youtube-Serie zu den Unity-Grundlagen war mein erstes Tutorial zu Unity, welche mir wirklich weiter geholfen hat, bzw. mein Verständnis zu Unity wirklich verbessert hat. Äußerst kompetent und gut verständlich, großes Lob!

vor 18 Stunden schrieb malzbie:

Also fangen wir mal am Anfang an. Du hast mehrere Regionen, die unterschiedlich aussehen und wahrscheinlich auch unterschiedliche Formen haben, und möchtest mit diesen Regionen interagieren. Also wenn die Maus über einer dieser Regionen ist, soll sie sich einfärben, wenn es die Regel zulässt.

Exakt das will ich erreichen

 

vor 18 Stunden schrieb malzbie:

Dieses Problem ist recht leicht zu lösen, denn es gibt die Möglichkeit einen Ray von der Camera aus in Richtung Mauszeiger (und darüber hinaus) zu senden. Suche mal in der Unity Scripting Hilfe nach Physics.Raycast.

Diesen Ansatz werde ich verfolgen. Danke für den Tipp!

 

vor 18 Stunden schrieb malzbie:

Ich würde jetzt nicht den Farbcode des Untergrundes ermitteln wollen um somit zu erkennen auf welcher Region man ist. Das ist viel zu kompliziert und Fehleranfällig, denn wer weiß ob jedes Pixel in der Region wirklich die gleiche Farbe hat. Kompressionen können da schon mal probleme Verursachen.

Dieser Ansatz wäre schon eindeutig, da ich ein zweites Image mit den exakten Maßen des Orginalspielbretts erstellen würde und jede Region mit einer eindeutigen Farbe anpinseln würde. Diese Farbwerte könnte ich dann mit einem Ray, wie oben von dir vorgeschlagen abfragen und den jeweiligen Regionsscripten zuordnen. Aber da dieser Lösungsansatz noch in keinster Weise mein Problem mit dem einfärben der einzelnen Regionen löst, ist dieser Ansatz wohl nicht zu empfehlen.

 

vor 18 Stunden schrieb malzbie:

Was ich nicht so ganz verstehe. Willst du jetzt ein erhabenes3D Spielfeld haben, wo echte Berge zu erkennen sind? Oder ist es flach?

Das Spielfeld wäre flach und man würde nur das (hochaufgelöste) Image des Spielbretts sehen. Würde ich Berge/Bäume usw. in 3D einbauen, hätte ich eventuell Schwierigkeiten Platz für meine Truppen (diese werden 3D sein) zu finden. Außerdem würde wohl die Übersicht darunter leiden. So sehe ich das zumindest derzeit, lasse mich aber gerne eines Besseren belehren.  

 

vor 17 Stunden schrieb TheOnlyOne:

Du erstellst mit 3D-Grafiksuite  z.b Blender ein 4eck Polygon, machst das Image als Textur drauf und schneidest einzelne Regionen aus, dann kannst du am Ende noch 3D-Fläche daraus extrudieren, damit sie wie echte Erdflächen aussehen und exportierst die Regionen als einzelne Objekte nach Unity. Jetzt kannst du sie manipulieren wie du willst. Du kannst beim ausgewählten Region, andere langsam unsichtbar machen, oder die Grenzen des Regions mit Farben abgrenzen und animieren lassen. Auch Farbe des Regions kann problemlos geändert werden.

Dies klingt schon einmal sehr gut. Mit Blender habe ich mich überhaupt noch nie auseinander gesetzt. Ich habe da jetzt keine Ahnung, wie ich da aus so einem 4eck-Polygon am einfachsten die Regionen rausschneiden kann. Da würde ich ja so eine Art freihändige Schere brauchen, welche mir in der Draufsicht senkrechte Schnitte durch das Polygon macht (also so stelle ich mir das zumindest vor). Nach welchen Blender-Werkzeugen bzw. Stichworten/Keywords muss ich da suchen? Google bringt mich da nicht wirklich weiter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 49 Minuten schrieb Darktower:

Nach welchen Blender-Werkzeugen bzw. Stichworten/Keywords muss ich da suchen? Google bringt mich da nicht wirklich weiter.

Mit knife tool geht das. Gibt zig Videos darüber auf Youtube.

Zudem solltest du lernen eine UV-Map zu erstellen, damit deine Karte richtig auf einzelnen Mesh Teilen sitzt.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...