Jump to content
Unity Insider Forum
  • Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011

All Activity

This stream auto-updates     

  1. Past hour
  2. Hiho, ich habe ein kleines Problem, wobei mir hoffentlich helfen kann. Ich habe ein Raumschiff im Weltraum, mit dem ich hin und her Fliegen kann. Allerdings will ich jetzt nicht, dass ich nur gradeaus schießen kann, sondern in einem bestimmten Radius, vom Schiff ausgehend in andere Richtungen. (Schiff und Kamera sind nicht unbedingt in gleicher Rotation). An diesem Punkt (wohin ich schieße) füge ich dann Quasi noch ein Crosshair hinzu. Aber die Frage ist, wie, bzw womit kann ich das hinbekommen? Vielen Dank schonmal. Gruß Noxen
  3. Today
  4. C# Klasse oder Objekt? Verständnisproblem

    Sehe ich hier aber nicht: https://docs.unity3d.com/ScriptReference/Input.html
  5. C# Klasse oder Objekt? Verständnisproblem

    Danke, mit dem Hinweis auf statische Klassen ist auf einmal vieles klar. Was es mit statischen Elementen auf sich hat, war mir schon klar (von C++ her). aber ich bin einfach nicht drauf gekommen, dass die Input-Klasse etwas damit zu tun hat. Sorry. Was die Kritik an der Bezeichnung Property betrifft: Warum soll eine Klasse keine untergeordnete Klasse enthalten, in der wichtige Merkmale und Methoden festgelegt sind? In der Unity-Scripting-Referenz wird zur Input-Klasse unter der Rubrik "properties" u.a. "transform" aufgelistet. Mag sein, dass der Begriff nur in englischen Dokumentationen gebraucht wird. Ach ja, und Klugscheißer hin - Klugscheißer her, für mich sind nun mal Referenzen über Klassen und deren Strukturen die aussagekräftigsten Dokumentationen. Ich werden nun verstärkt auf das "static" achten.
  6. @Zer0Cool Perfekt! Danke für die Tipps, werde heute Abend alle Deine Vorschläge ausprobieren Merci
  7. destroying game objects in array

    Hi, i would use a fifo queue and not an array for this: https://msdn.microsoft.com/de-de/library/system.collections.queue(v=vs.110).aspx Here you add a new object by: https://msdn.microsoft.com/de-de/library/system.collections.queue.enqueue(v=vs.110).aspx and you get the "oldest" object by: https://msdn.microsoft.com/de-de/library/system.collections.queue.dequeue(v=vs.110).aspx
  8. Du solltest eine Auflösung finden, die die Auflösungen deiner Zielgeräte möglichst breit repräsentiert. Die modernen Smartphones haben eine Auflösung von "1920 × 1080". Wie gesagt, laut meinen Tests ist folgende Einstellung ziemlich positionsgetreu auch bei verschiedenen Auflösungen: "Canvas Scaler" = "Scale With Screen Size" "Reference Resolution" würde ich mal "1920x1080" nehmen (damit ist man auch bei modernen Smartphones mit dabei) "Screen Match Mode" = "Match Width or Height" Match = 1
  9. Vielen dank für die Antwort. Wenn ich das Ganze auf die Auflösung "meines/eines" Smartphones ausrichte, dann berücksichtige ich doch nicht alle Anderen, oder? Meine Reference Resolution ist der Default(800x600), den habe ich nicht verändert
  10. Hey folks, I want to create a stream of game objects by destroying the first object after a given time is reached and then instantiating a new one. I attached the following script to my object manager: public GameObject boidPrefab; public static int z = 0; private float InstantiationTimer = 0.2f; public static int numBoids = 10; public static GameObject[] allBoids = new GameObject[numBoids]; public static int limits = 30; void Update () { InstantiationTimer -= Time.deltaTime; if (InstantiationTimer <= 0) { if(z < numBoids) { Vector3 pos = this.transform.position + new Vector3(Random.Range(-limits, limits), Random.Range(-limits, limits), Random.Range(-limits, limits)); Debug.Log("INSTANTIATE"); allBoids[z] = Instantiate(boidPrefab, pos, Quaternion.identity); Debug.Log(z); z++; } else { Debug.Log("DESTROY"); Destroy(allBoids[0].gameObject); z--; } InstantiationTimer = 0.2f; } } Unfortunately, the objects keep being created, although Debug.Log shows me the objects are being instantiated and destroyed afterwards. I guess the problem is in the destroying of the game objects but i can't figure it out. I would very much appreciate an answer, cheers, Simon
  11. Du solltest die Auflösung deines Smartphones kennen und diese bereits beim Testen im Editor einstellen (Game Mode). Zudem würde ich empfehlen, du stellst beim Canvas Scaler "Scale With Screen Size" ein und trägst bei "Reference Resolution" die Auflösung deines Smartphones ein. Bei "Screen Match Mode" würde ich "Match Width or Height" einstellen und den Slider ganz nach rechts schieben (= Match Height), hier habe ich oft die besten Ergebnisse erzielt. Du kannst aber auch einmal testen, wie es auf deinem Smartphone aussieht, wenn du den Slider ganz links lässt (nur einen Wert dazwischen würde ich nicht empfehlen). Dies sollte die Position zumindest für dein Smartphone auf den gewünschten Positionen halten, sollte das Seitenverhältnis einer anderen Auflösung stark von ""Reference Resolution"" abweichen, werden sich die Positionen ggf. leider wieder verschieben, aber das lässt sich denke ich nicht verhindern, hier müsste man die Buttons an den Objekten in der 3D-Szene ausrichten. Die "Anchors" der Buttons auf 0.5 / 0.5 / 0.5 / 0.5 und den Pivot auf 0.5 / 0.5 lassen! Andere Anchors führen zu dynamischen Verschiebungen, die in deinem Fall nicht gewünscht sind.
  12. Klasse als Array im Inspector

    Eine Kurzfassung der Möglichkeiten: [System.Serializable] public class Klassenname sowie [System.Serializable] public struct Structname erzeugen wobei man sich immer die Frage stellen sollte, ob eine Klasse oder ein Struct sinnvoller ist. In den meisten Fällen, in denen man einfach nur eine Menge von Werten im Editor darstellen will, sind Structs wesentlich praktischer. Ansonsten gibt es noch public class Klassenname : Object wobei Object UnityEngine.Object ist und nicht System.Object. Man beachte auch, dass das Attribut nicht mehr gebraucht wird. Das erzeugt: Und das Objekt kann nur noch durch reinziehen referenziert werden. Es muss also woanders erzeugt werden, z.B. durch erben von ScriptableObject. TL;DR: Wenn das Objekt als Foldout im Editor sein soll, von nichts erben und [System.Serializable] drüber packen.
  13. Eigene Sound Effekte

    Hab's mal verschoben - im "Assets, Prefabs und Tools"-Bereich finden Leute, die nach Ressourcen suchen, den Post eher
  14. C# Klasse oder Objekt? Verständnisproblem

    <Klugscheißer an> (aber nur, weil ich das Gefühl habe, dass du das gerne hättest ) alle ein Objekt der Klasse "Transform" - eine Klasse gibt es nämlich immer nur einmal, aber "Objekte der Klasse" in der Regel beliebig viele Property ist hier das falsche Wort. Bei GameObjects kann man gerne sagen "hat eine XY-Komponente", aber genau genommen referenziert das GameObject die Komponente nur. "Property" ist für Eigenschaftsfelder von Objekten, wie das Feld "Transform.position". <Klugscheißer aus> Die eigentliche Frage hat @Helishcoffe ansonsten schon ganz gut beantwortet.
  15. #DEV-Log: Einblick in Dev-Life

    Heyo am Wochenende bin ich auf eine spannende Architecture gestoßen, die ein Spiel gut Configurable macht. Wo ich mit Hilfe dieses Flow später gut neuen Content hinzustöpseln kann oder Änderungen ohne Probleme vornehmen kann. Der Ansatz für ein solches System liegt im "ScriptableObject". Man mag es gar nicht auf den ersten Blick glauben, aber dieses kleine Schmuckstück erleichtert dir in vielen Hinsichten das Dev.-Leben und auch das abändern von Value geht super schnell von der Hand. Doch wie sieht das ganze aus? Auf den ersten Blick mag diese Grafik unverständlich sein bzw. man kann sich schwer was darunter Vorstellen deshalb gehen wir kurz durch jedes einzelne Element durch und klären deren Funktion und anschließend wen wir wieder zurück zu dieser Grafik springen wird sie einem hoffentlich besser schlüssig. Fangen wir mit einer Generellen Frage an: Was sind Models und Components Models Sind reine Daten-holder sie halten in unserem Beispiel eine Card die von uns Definiert wird: CardModel: - Type <- Eine definition welche Type es ist (Block/Trigger) - Cost <- Die kosten um diese Card zu erzeugen... - BattleObjectStates <- Wichtige Informationen über das Object (Health/Damage) - DisplayContent <- Ein Bundle an Display Information (Rendermesh/Name) - Rarity <- Ebenfalls eine defintion welche Rarity diese Card hat (Common, Rare, Epic, Legendary) - Ability <- Eine Ability die wir jeweils der Karte geben können (z.B. Verlangsamt Units um 15%) - ObjectBehaviours <- Hier können wir jeweils defenieren was die Card alles kann (Shooten, Movement...) Components Sind jeweils Elemente die für uns Information halten oder auch Behaviour. Was genau bedeutet das? Greifen wir wieder das Card Beispiel auf wir besitzen im CardModel eine Field das nennt sich ObjectBehaviours. Dieses Field in eine Collection von Behaviours die wir der Card hinzufügen können. Ein ObjectBehaviour ist eine Component wo wir definieren können wie sich jeweils diese Card verhält. Wen diese Karte ein bestimmtes Behaviour haben sollte erstellen wir dieses Behaviour unabhängig von dieser Card damit wir ggf. dieses Behaviour wo anderes wiederverwenden können. Im Grund das gleiche Component Prinzip von Unity, nur ein wenig spezifizierter. Ein Beispiel wäre dafür ein Shoot-Behaviour das in einem Regelmäßigen Intervall ein Schuss in eine Richtung abgibt. //... public class ObjectBehaviour : ScriptableObject, IObjectBehaviour { public virtual void Execute() { //... } } //... //... public class ShootDirectionComponent : ObjectBehaviour { IFloatComponent Time { get { return _time; } } VectorDirection Direction { get { return _direction; } } [SerializeField] FloatComponent _time; [SerializeField] VectorDirection _direction; public override void Execute() { base.Invoke(); //... Here we invoke the default Behaviour that for example track actions or log something //... execute ShootDirection Behaviour } //... Die Idee ist dabei diese Shoot-Behaviour (ObjectBehviour) später auch einer Unit zu verweisen ohne direkt für die Unit nochmal das Ganze zu schreiben. Die Frage ist inwiefern dieses Konstrukt einem Hilft in Verbindung mit ScriptableObject sein Game gut Configurable zu machen. Die Lösung sitzt direkt in dem ScriptableObject-Prinzip mit diesem ich in der Lage bin mir jeweils verschiedene Variationen anzulegen und diese jeweils weiter zu verwenden. Let's jump in Code: Wir haben jeweils hier das ICardModel-Interface dieses wir an die Außenwelt geben womit andere Klassen damit arbeiten können. namespace Pwhh.Game.Model { public interface ICardModel : IModel { IConstantIntComponent Cost { get; } //... } } Hier haben wir jeweils die Base Implementation wir extends jeweils vom ScriptableObject und von dem ICardModel. Wichtig: Da Unity nicht mit Interface-Typen (Getter und Setter) im Inspector umgehen kann benutzen wir jeweils hier einen Trick. Wir nutzen die Base Implementation von unserem gewünschten Objekt und setzen dieses jeweils auf private damit wir keinen Zugriff von außen drauf haben und weisen das jeweils dem Getter von dem Interface zu. Zu guter Letzt setzten wir über das private Field das [SerializeField]-Attribute das uns erlaubt im Editor diese Value zu verändern. namespace Pwhh.Game.Model { [CreateAssetMenu(menuName = "Models/Player/Card", fileName = "Card")] public class CardModel : ScriptableObject, ICardModel { public IConstantIntComponent Cost { get { return _cost; } } [SerializeField] private ConstantIntComponent _cost; } } Hier sehen wir noch ein Use-Case wo wir jeweils das ICardModel verwenden. Das gute ist das wir nur mit dem jeweiligen Interface arbeiten können ohne eine direkte Verbindung zum Objekt. So ist es im Grunde egal welche Version wir verwenden es bleibt immer gleich, aufgrund des interfaces. namespace Assets.Source.Serivces.CardLoader { public class CardLoader : IService { public void Load(ICardModel[] cards) { SetupUICard(cards); //... } //... ( Unity Training | Unity Docu ) Advantages Technics Da ScriptableObjects im Inspector angezeigt werden und wir mit dem SerializeField einfach im Editor values abändern oder hinzufügen können ist das schon mal ein großer Vorteil. Um diesen Vorteil noch zu vergrößern und die Benutzbarkeit des System so einfach wie möglich zu gestalten kann man auf [CustomeEditor(typeof(type)] zurückgreifen. Wie sieht das ganze aus? Dazu möchte ich gerne ein Situation aufgreifen womit ich am Wochenende konfrontiert wurde. Ich hatte jeweils anhand dieses design-flow den wir oberhalb besprochen haben mein GameSession aufgebaut. Diese beinhaltet alle relevanten Daten die wichtig sind für meine Levels. Das bedeutet wen ich ein neues Level hinzufügen möchte erstelle ich ein GameSession Object (ScriptableObject) und konfiguriere jeweils meine Level. Für uns ist jetzt speziell der Wave Aspekt interessant anzuschauen. Hier ist ein Überblick über den Aufbaue meines GameSession Objektes: Zu Erklärung was Wave sind: Ein Level besteht aus eine Anzahl aus Unit Wave die kommen und du musst jeweils diese Waves bekämpfen. Eine Wave hat jeweils eine bestimmte Zeit und jeweils Angaben zu welcher Zeit welche Units in dieser Wave spawnen. IWaveModel - Time <- Ist jeweils dauerer diese Wave bis die nächste Wave kommt - UnitSpawnComponent <- Beinhaltet welche Unit und zu welcher Zeit diese gespawnt wird So jetzt stellt sich nur folgende Frage wen ich jeweils in meiner Liste mehrere Wave Objecte reingezogen habe habe ich leider kein Überblick darüber wie lang die ganze GameSession dauert. Hier kommt unser CustomeEditor zum Einsatz mit dem ich jeweils die ganze Liste durchgehen kann und mir die GameSession Zeit zusammenrechnen kann. [CustomEditor(typeof(GameSessionModel))] public class GameSessionModelEditor : Editor { private int _totalGameSessionTime; private void OnEnable() { _totalGameSessionTime = GetTotalWaveTime(); } public override void OnInspectorGUI() { base.OnInspectorGUI(); EditorGUILayout.LabelField("Total Game-Wave Time:" + _totalGameSessionTime); } //... ( Unity Training | Unity Docu ) Mit dieser Hilfe kann mit sich ein sehr gutes Inspector-UI-System zusammenbasteln das einen schnell Information darüber gibt was alles abgeht ohne sich durch die ganzen ScriptableObjects zu clicken und sich diese heraus zu suchen. Ebenfalls ein Überlegung für später ist ggf. sich die Units per Icon in der GameSession anzeigen zu lassen um ein schnellen Überblick zu bekommen welche Units in dieser Session verwendet werden. Ich hoffe ihr habt ein Einblick bekommen in den Flow mit ScriptableObject und vll. für euch ein Use-Case entdeckt. Mfg. -John
  16. C# Klasse oder Objekt? Verständnisproblem

    Der Unterschied ist, dass du bei Input keine Instanz hast die du ansprichst. Input.GetKey ist eine statische Methode die nicht von einem Objekt abhängt und deswegen von überall aus zugreifbar ist. public static void GetKey(...) { } das "static" macht den Unterschied. Damit hast du eine Methode definiert, die du mit dem Klassennamen ansprechen kannst und kein Objekt davon instanziieren musst. Ohne das "static" müsstest du ein Objekt erzeugen und dann die Methode aufrufen. Da du mit einer statischen Methode kein Objekt hast, kannst du somit aber auch nicht auf Objektvariablen innerhalb einer statischen Methode zugreifen. Statische Methoden machen also nur Sinn, wenn du genau weißt, dass du etwas haben möchtest was unabhängig von einem Objekt ist und in jedem Script zugreifbar ist. Deswegen sind Input.GetKey und Debug.Log statisch. Der Programmierer soll schließlich von überall aus einen Key abfragen können und in jedem Ort des Scriptes einen Log schreiben können ohne ein Objekt zu kennen auf welchem die Methode definiert ist. Man kann aber auch Variablen definieren die statisch sind.
  17. Hallo, Als Unity-Neuling bin ich dabei, die ersten Schritte im Scripting zu tun. Mir liegt viel daran, die Dinge nicht einfach nach Rezept anzuwenden, sondern zu durchschauen. Im Fall der Transform-Komponente ist das zum Beipiel klar und durchschaubar. Alle (oder die meisten) GameObjekte haben eine Transform-Klasse als Property eingebunden, die bei der Instantiierung des GameObjekts ebenfalls instantiiert wird, mit Zugriff über transform (klein geschrieben). So weit, so klar - hoffe ich. Was ist nicht durchschaue, ist zum Beispiel der Zugriff auf Input. Input ist in der Dokumentation als Klasse ausgewiesen und beschrieben. Der Zugriff erfolgt direkt über den Klassennamen, z.B. Input.GetKey (...). Wie geht das? Ich war der Meinung, dass man nur auf Instanzen zugreifen kann, und die werden in Unity verabredungsgemäß klein geschrieben. Bei Debug und wahrscheinlich vielen anderen Klassen dürfte es ähnlich sein. Vermutlich habe ich noch Verständnisprobleme mit C#. Kleiner Hinweis, um mir auf die Sprünge zu helfen?
  18. Hallo zusammen, habt ihr eine Idee wie man z.b. Buttons auf einer fixen Position(unabhängig von Resoultion oder Screen size) setzt? In dem Beispiel-Foto seht ihr die Buttons, die exakt dort sein müssen wo sie sind. Ich habe soviel mit Ankern und verschiedenen Einstellungen ausprobiert und die Buttons verschieben sich sobald ich das Ganze auf meinem Smartphone teste...
  19. Wie es ausschaut gibt es in Unity keine Möglichkeit beide Canvas-Typen gleichzeitig zu nutzen. D.h. sie können zwar gleichzeitig genutzt werden, dürfen sich aber nicht überlappen. Der Overlay-Canvas scheint immer die höhere Priorität zu haben. Und wenn, wie in meinem Fall, ein UIElement über dem 3D-Objekt liegt, wird in den dahinter liegenden Objekten kein Hit mehr ermittelt. Die Sort-Order der Canvas-Objekte hat scheinbar hier keine Wirkung. D.h. ich muss in meinem Fall sicherstellen, dass der Hit über dem 3DObjekt nicht blockiert. Das kann ich auf 2 Arten erreichen: Deaktivieren des Raycasters am Overlay Canvas (Bringt mir nichts, da ich ja noch die UIElemente im Overlay nutzen will) Hinzufügen einer Canvas-Gruppe auf dem überdeckenden UI-Element und hier explizit das Blocking der Raycasts deaktivieren Durch den 2ten Schritt erreiche ich, dass die unter dem Overlay liegenden UIElemente am WorldCanvas auf die Events reagieren, nun muss ich halt zusätzlich, klassisch am 3D-Objekt ein Eventhandler einbauen um hier auf Click-Ereignisse reagieren zu können, damit ich mein Objekt rotieren kann ...
  20. Yesterday
  21. Hallo, Habe heute einen Müllcontainer erstellt. Wer möchte kann in kostenfrei benutzen. Container.unitypackage Gruß Jog
  22. Klasse als Array im Inspector

    Hier mal ein Beispiel: http://catlikecoding.com/unity/tutorials/editor/custom-data/ PS: Nimm bei deiner Klasse mal die Vererbung von Editor weg. Ich denke dann sollte es auch ohne Customeditorklasse gehen: [System.Serializable] public class TextToMesh { public string charstring; public GameObject Gameobject; public float Heightoffset; }
  23. Klasse als Array im Inspector

    Mhh ich glaube da müsstest du dir zur not ein eigenes EditorScript für den Inspector schreiben
  24. Moinsen, Ich habe eine Klasse [System.Serializable] public class TextToMesh : Editor { public string charstring; public GameObject Gameobject; public float Heightoffset; } diese möchte ich jetzt in einer anderen Klasse als public TextToMesh[] Test; einfügen. Nun kann ich aber leider nicht im Inspector auf die einzelnen Attribute aus der Klasse TextToMesh zugreifen. Möchte halt einfach ein Array haben wo ich im Editor die einzelnen Attribute setzen kann. Bei einem Object ist das ja kein Problem nur wenn ich die Objecte in ein Array schmeiße kann ich nur solche Objekte einfügen aber kann nicht auf die Attribute zugreifen. Habt ihr da eine Idee?
  25. TileMap AlphaBlending

    Die Probleme gingen bei mir erst los, sobald man Treppen und Ecken im Testmuster hat. Nur die vertikalen und horizontalen Übergange zu betrachten führt zu falschen Lösungsansätzen. Ich hab dir ja eine Mail geschrieben, wie man das Ganze umsetzen kann. Man benötigt entweder eine Blendmaske je Textur (diese Maske geht dann über alle Tiles) oder man macht es ohne Blendmasken und verwendet einen Blendshader der über die Vertexcolors (und UV2, UV3) geht. So hier nun beispielhaft das Ergebnis des Lösungsansatzes 2. Die Texturen der Tiles werden als Vertexfarben codiert. Zusätzlich wurde der UV2-Kanal mit verwendet. Insgesamt kann man so nun 6(7) Texturen überblenden. Diese Technik kann die Probleme mit den Treppen und Kanten elegant lösen. Jeder Pixel des Originalbildes ist ein Tile und wird gleichmäßig überblendet. Man kann diese Lösung auf beliebig viele Texturen erweitern, dazu muss man allerdings ein Array an den Shader mit Texturdaten je Vertex übergeben. Folgende Eckdaten der Technik: keinerlei Blendmasken es werden alle 8 Nachbarn beachtet Verwendung der Vertexfarben des Meshes und UV2 der Shader ließt alle Texturen im Fragmentshader aus und vermischt diese anhand der Vertexfarben und UV2 (Performanceimpact sehr gering) Nachteile: Überblendung erfolgt immer Linear keine spezielle Überblendungsmaske zwischen 2 Texturen möglich Ergebnis mit "echten Texturen": Aus der Nähe:
  26. TileMap AlphaBlending

    Hallo zusammen, hier ist mal ein kurzes Update von mir was ich aktuell hinbekomme. Die vertikalen Balken kommen noch durch eine nicht optimale BlendMaske. Aber das soll ja hier nicht das Problem sein. Jetzt geht es ans optimieren und verbessern von dem ganzen. Folgende Punkte gilt es noch zu betrachten: Aktuell nur 1 BlendMaske für die ganze Tile Map möglich. Es werden aktuell nur die Nachbarn (Rechts, links, oben und unten) betrachtet, jedoch nicht die diagonalen. Der Ansatz benötigt noch zu viel Ressourcen ( Alle 4 UV Kanäle). Da dafür 3 Kanäle (2 für UVs, 1 für Nachbartexturen) für die Berechnung der richtigen Blendmaske benötigt werden, hoffe ich das man diese Berechnungen evtl. irgendwie im Shader durchführen kann. Da bin ich aber noch am experimentieren. Sobald ich eine Lösung für die Punkte gefunden habe schreibe ich hier wieder. Falls jemand dazu Ideen hat gerne einen Kommentar hier lassen. Danke und einen schönen Sonntag. Stefan
  27. Hallo, Ich hoffe das ich hier richtig bin. Habe noch einige Sounds die ich selbst erstellt habe die ich kostenlos zur Verfügung stelle. Nichts großartiges aber falls sie jemandem gefallen kann er sie gerne benutzen. Hier 2 beispiele. Mysterie_Backround.wav War_Backround1.wav Gruß Jog
  28. Ich habe aktuell das Problem, dass meine WorldSpace Canvas UI-Objekte nicht auf Events reagieren, solange ich im parallel verwendeten ScreenSpaceOverlay-Canvas den Raycaster nicht deaktiviere. Ich muss jedoch beide Canvas parallel betreiben können, da ich über die WorldSpace-Canvas Objekte Menüs, die im ScreenSpace-Overlay angezeigt werden sollen, triggern muss. Folgendes habe ich laut Google schon probiert, alles ohne Effekt: Unterschiedliche Sorting Order in den Canvas Objekten (WorldSpace 0, Overlay 1) Unterschiedliche Layer und Tags WorldSpace-Event-Camera (Eigentlich eigene) auf MainSpace gesetzt und vice versa. Canvas Groups für beide Canvas hinzugefügt Blocking Masks in beiden Raycastern auf Nothing gesetzt Ich habe mal Screenshots meiner aktuellen Konfiguration der Canvas-Objekte und der Objekthierarchie hinzugefügt (Der Raycaster im WorldSpace ist inzwischen wieder aktiviert, das war nur ein Test). Habt Ihr evtl. noch Ideen, wie ich beide zusammen zum Laufen bekomme?
  1. Load more activity
×