Jump to content
Unity Insider Forum

Jomnitech

Members
  • Content Count

    294
  • Joined

  • Last visited

  • Days Won

    14

Jomnitech last won the day on July 15 2019

Jomnitech had the most liked content!

Community Reputation

32 Excellent

About Jomnitech

  • Rank
    Advanced Member

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Habe auch daran gedacht alles in ein Array oder Liste zu speichern. Weiss aber nicht wie ich dann das entsprechende Object aus der Liste gelöscht bekomme wenn ich es manuell in der Scene lösche.
  2. Hallo Zusammen Ich erstelle derzeit einen Level Generator, der mir an zufälligen Position diverse Prefabs und Hintergründe einfügt. Da alles zufällig aus einer hand voll Prefabs ausgewählt wird, kommt es vor das zwei, drei mal das gleiche Asset nebeneinander liegt, oder es auch einfach so unschön aussieht. Diese lösche ich dann manuell aus der Scene raus, und genereiere sie neu. Dabei kommt es natürlich vor das er an einer Stelle wo schon etwas ist, erneut etwas spawnt. Nun zu meiner Frage: Gibt es eine möglichkeit abzufragen ob an der zu spawnenden stelle schon ein GameObject in der Scene ist?
  3. Das Problem bei der build in prozeduralen Skybox ist der Horizont. Kenne keine Möglichkeit den anders einzustellen. Falls du dich mit Shadern auskennst, ist hier der originale Code für den Unity Skybox Shader, kann man sicher irgendwie editieren, ich kanns nicht https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/DefaultResourcesExtra/Skybox-Procedural.shader Altenativ habe ich noch einen Lizenfreien Custom Shader ohne Horizont gefunden, finde da aber den Farbverlauf nicht so schick. https://github.com/PopThosePringles/Unity-Procedural-Skybox-Shader-No-Horizon Du kannst auch eine 6-Sided Skybox verwenden, dann hast du das Problem nicht, lizenfreie Bilder dafür findet man recht gut bei Google. Oder ganz simpel statt der Skybox einfach eine fixe Farbe (solid Color) verwenden. Kann man bei den Main-Camera Einstellungen einstellen was verwendet werden soll.
  4. Ich nehme an du meinst das fertige Spiel im Fenstermodus frei zu Skalieren? Das geht, dafür musst du unter Edit>Project Settings > Player; bei Resolution and Presentation das Häkchen bei Resizable Window setzen.
  5. Klingt für mich nach Tischbillard. Weiss aber nicht ob ich dein Problem richtig verstehe. Irgendwo in der Scene hast du doch dein Objekt "Tisch", ob da jetzt die Löcher teil des meshes sind ist doch wumpe. Du kannst entwerder deinem Tisch-Objekt Collider hinzufügen und diese dann über die center Werte an die Position setzen wo auch die Löcher sind Oder alternativ Kannst du deinem Tisch, neue Child Objekte hinzufügen(rechtsklick auf deinen Tisch und dann Create Empty), welche den Collider haben und diese dann über die Transform Komponente an die gewünschte Position schieben. Oder verstehe ich dein Problem falsch?
  6. Du könntest z.B. Sprite Mask verwenden, welche dann dein Nebel-Sprite an der bereits erkundeten Stellen ausschneidet?
  7. Wenn es einfach nur lila ist, hast du einen nicht kompatiblen Shader drauf. Um das zu ändern, klicke auf das entspechende Material, wähle oben bei Shader "Universal Render Pipeline" und dan z.B. den Lit Shader. Bedenke einfach das wenn du keinen 2d Shader verwendest, dein 3d Objekt nicht mit 2d Licht interagiert. Sprich, es sieht immer gleich aus, egal ob du das 2d Licht dimmst oder den Farbton änderst. Ob man sich dafür einen eigenen Shader im Shader-Graph basteln kann weiss ich nicht.
  8. Alles klar, viel Spass noch bei deinem Projekt.
  9. Auch gut :) Weiterhin viel Erfolg. Wäre natürlich noch interessant zu wissen, wie du es gelöst hast. Falls mal jemand das gleiche Problem hat und den Thread hier durchliest, für die Nachwelt und so.
  10. @xDeejox Der Rigidbody ist nur eine Komponente, ob du den für deine Bewegung verwendest, oder nur für das Triggerverhalten ist im Prinzip egal. Du kannst problemlos einen Rigidbody hinzufügen den auf Kinematic setzen und dein Spieler weiterhin über Udemy Script über die Transforms bewegen, dazu musst du nichts "umscripten". Wenn sich da nix tut, hätte ich gesagt das der Layer der dem Spieler zugewiesen ist und der Layer der dein Teleporter hat, in der Physic2d Einstellungen nicht miteinander reagieren. In dem Fall einfach mal schauen welcher Layer dem Spielder und welcher Layer dem Teleporter zugewiesen ist und ob die sich in den Einstellungen(Edit>Project Settings>Physic2d) kreuzen. ------------------------------------------------------------------------------------------------------------------------------------------- Variante 2 ------------------------------------------------------------------------------------------------------------------------------------------- Falls du aber gänzlich auf die Physic verzichten möchtest, kann man das auch tun. Dazu hat @Sascha mir mal was schickes geschrieben. Das funktioniert dann über eine Distanzabfrage. Nachteil hierbei, du kannst keinen beliebigen Bereich auswählen, sondern hald eben nur den Umkreis abfragen. Originalbeitrag findest du hier: Ich hab das mal auf 2d runtergebrochen, sieht dann etwa so aus: using System.Collections; using System.Collections.Generic; using UnityEngine; public class TeleportRadius : MonoBehaviour { [Header("Hier Zielort Teleporter einfuegen")] public GameObject otherTeleporter; // Im Inspektor den Zielteleporter hier einfuegen. [Header("Hier den Spieler einfuegen")] public Transform player; // Referenz zum Spieler ob er in der naehe ist. [Header("legt den Bereich fest ab wo der Teleporter funtioniert")] public float teleporterRadius = 1f; private TeleportRadius scrTeleport; [HideInInspector] public bool hasTeleportet = false; private void Start() { scrTeleport = otherTeleporter.GetComponent<TeleportRadius>(); } public static bool CheckIfCloserThan(Vector2 a, Vector2 b, float maxDistance) { var maxDistanceSquared = maxDistance * maxDistance; var distanceSquared = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y); return distanceSquared <= maxDistanceSquared; } private void FixedUpdate() { var isInside = CheckIfCloserThan(transform.position, player.position, teleporterRadius); if (isInside && !hasTeleportet) { OnEnterRange(); } else if (!isInside && hasTeleportet) { OnExitRange(); } } private void OnEnterRange() { scrTeleport.hasTeleportet = true; player.transform.position = otherTeleporter.transform.position; } private void OnExitRange() { hasTeleportet = false; } // Zeichnet einen Kreis der so gross ist wie der "Trigger" Bereich private void OnDrawGizmos() { Gizmos.DrawWireSphere(transform.position, teleporterRadius); } } In dieser Variante brauchst du weder Layer noch Rigidbodys noch sonst was. Alles was du brauchst ist zusätzlich zur Referenz zum anderen Teleporter, auch eine Referenz zum Spieler. Diesen einfach in das entsprechende Feld reinziehen. Je nach dem wie gross bzw. wie viele Teleporter du am Ende im Spiel hast, kann man das auch automatisieren, für den Anfang aber lassen wir das mal. Wichtig zu wissen ist auch, das erst dann teleportiert wird, wenn der Mittelpunkt deines Spielers im Kreis ist. DemoPackage findest du im Anhang. TopDownRangeTeleporter.unitypackage
  11. Ich würde dir sehr stark empfehlen, solche Bewegungen zu animieren. Unity hat einen sehr schickes Animationstool. Bewegungen zu coden macht in meinen Augen nur Sinn, wenn es Interaktiv sein soll (z.B. Playercontroller) oder Physikbasiert ist.
  12. @xDeejox Kann man alles machen Könnte dann so aussehen: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Teleporter : MonoBehaviour { [Header("Hier Zielort Teleporter einfuegen")] public GameObject otherTeleporter; // Im Inspektor den Zielteleporter hier einfuegen. private Teleporter scrTeleport; [HideInInspector]public bool hasTeleportet = false; private void Start() { scrTeleport = otherTeleporter.GetComponent<Teleporter>(); } private void OnTriggerEnter2D(Collider2D collision) { if(scrTeleport != null) { if (!hasTeleportet) // Checkt ob bereits teleportiert wurde. Falls ja wird erst wieder aktiv wenn der Triggerbereich verlassen wird. { scrTeleport.hasTeleportet = true; collision.transform.position = otherTeleporter.transform.position; // setzt den Spieler an den Ort des anderen Teleporter } } else { Debug.Log(this.name + "Teleporter fehlt"); //Fehlermeldung falls kein Teleporter im Inspektor eingefuegt wurde. } } private void OnTriggerExit2D(Collider2D collision) { hasTeleportet = false; // Setzt den Teleporter zurueck, wenn der Triggerbereich verlassen wurde. } } Hierfür benötigst du folgendes: - Ein Objekt mit einem 2dCollider. (Häkchen bei isTrigger nicht vergessen) - Das Obige Script auf diesem Objekt. Thats it. Kannst du dann z.B. als Prefab abspeichern (einfach aus der Scene unten in die Leiste ziehen.) In der Scene benötigst du dann mindestens zwei Teleporter Objekte, damit du dann auch wo hin kannst , du ziehst dann einfach den Zielort Teleporter in das freie Feld. Habe möglichst alles Kommentiert, damit du auch weisst was passiert, sollst ja auch was lernen 😛 Habe dir noch ein Demo Package angehängt, damit du besser verstehst wie es gedacht ist. Das Package unter Assets > Import Package importieren. Mach am besten ein neues Projekt und importier es dort, damit du dir das aktuelle Spiel nicht ev. verstellst. Hoffe das hilft dir weiter. Falls du Fragen hast, immer her damit. TopDownPackage.unitypackage
  13. @xDeejox Hab ich aber erwähnt 😛 pivot ist hald zentrum des Sprites, nicht zentrum des Objekts 🙃 Aber um nicht unnötig zu verkomplizieren, es gibt eine simple Lösung. Du kannst deine Pivots usw. alles auf 0 lassen und erstellst einfach noch ein unterobjekt unter dein TeleporterA(CubeA) und TeleporterB(CubeB ) Objekt, oder wie auch immer du die beiden genannt hast. Den Teleporter mit dem Trigger drauf schiebst du dann genau dort hin wo die Tür oder so ist. das Unterobjekt(nennen wirs TeleporterChildA und TeleporterChildB) davon, schiebst du dann dort hin wo man sein soll wenn man zurückkommt, also etwas ausserhalb des Trigger-Ojekts. (Man könnte auch das script erweitern das erst geschaut wird ob man den trigger verlassen hat bis man erneut portet, aber will das jetzt nicht verkomplizieren). Jetzt ziehst du in das Script(bei otherTeleporter) beim Teleporter A einfach das TeleporterChildB hinein und bei TeleporterB das TeleporterChildA. Nun sind dies die Punkte wo du landest wenn du den Teleporter Trigger betrittst.
  14. @xDeejox Die Cubes waren hier nur ein Beispiel. In 2d Spielen arbeitest du dann mit der 2d Physic, dort wären es dann BoxCollider2d. Ob das jetzt aber ein Box oder Circle oder gar ein Polygon Collider ist, ist völlig egal. Es definiert nur den Bereich der betreten bzw. verlassen werden muss, damit das OnTriggerEnter(bei 2d Physic wäre es dann OnTriggerEnter2D) Funktion ausgeführt wird. Wenn du ein Objekt hast, mit dem Script drauf und einem Collider(egal welcher Art), wird beim betreten des Colliders, das Event(OnTriggerEnter2D) im Script beim gleichen Objekt ausgeführt.
  15. @xDeejox Also ich habe das so gemacht: Für den Teleporter habe ich einmal ein EmptyGameobject, welches zwei Cubes als Child hat. Nennen wir sie CubeA und CubeB, jeder Cube hat einmal ein Collider und ist als Trigger und dazu noch das Script. Das kannst du dann später als PreFab verwenden und einfach CubeA und CubeB dort hin setzen wo du hin und her möchtest. Das Script kann eigentlich rechts simpel sein. z.B: public class Teleport : MonoBehaviour { public Transform otherTeleporter; private void OnTriggerEnter(Collider other) { other.transform.position = otherTeleporter.position; } } Wichtig ist dabei folgendes: 1. In die Transform referenz beim Script, ziehst du bei CubeA den CubeB rein und umgekehrt. 2. Das Teleporter Objekt auf ein Separates Layer setzen. Kannst ja ein erstellen das z.B. teleport heisst. In der Physikeinstellungen entprechend einstellen, das nur der Spieler mit dem Teleporter Layer interagieren kann, damit nicht alles mögliche teleportiert wird. Der Spieler sollte natürlich auch ein eigenes Layer (z.B. Player) haben🙃 3. Beim Teleporter Objekt setzt du den BoxCollider im Inspektor das Center ausserhalb des Meshes. Da dort der Mittelpunkt liegt, würdest du sonst beim teleportieren genau in den anderen trigger teleportiert werden und wirst somit unendlich hin und her geportet. Den Meshrenderer kannst du natürlich wenn alles passt deaktivieren, dient nur zur orientierung, oder du setzt dir ein Icon im Inspektor. 4. Wenn dein Spieler über keinen Rigidbody verfügt, musst du bei CubeA und CubB einen erstellen, sonst funktionieren die Trigger nicht. In dem Fall die Rigidbody einfach auf Kinematic setzen. Das ganze kannst du natürlich noch mit überblend-Animationen verschönern. ---------- Das mit dem Raum aktivieren und deaktivieren habe ich so gelöst, das der Raum selber einen BoxCollider hat. Dieser hat wiederum ein eigenes Script und aktiviert bei TriggerEnter alles was ich haben möchte und bei TriggerExit, deaktiviert er es wider. Dazu einfach ein emptyGameobjekt erstellen, und alles was im raum akti-deaktiviert werden soll da darunter setzen. Dem Raum selber dann den besagten Collider geben und ein kleines Script. Kann z.B. so aussehen: public class EnableDisableTrigger : MonoBehaviour { public GameObject target; private void OnTriggerEnter(Collider other) { target.SetActive(true); } private void OnTriggerExit(Collider other) { target.SetActive(false); } } bei Target dann einfach das EmptyGameobject reinziehen. ---- Hoffe ist halbwegs verständlich was ich meine 🙃
×
×
  • Create New...