Jump to content
Unity Insider Forum

Jomnitech

Members
  • Content Count

    289
  • 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. Du könntest z.B. Sprite Mask verwenden, welche dann dein Nebel-Sprite an der bereits erkundeten Stellen ausschneidet?
  2. 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.
  3. Alles klar, viel Spass noch bei deinem Projekt.
  4. 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.
  5. @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
  6. 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.
  7. @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
  8. @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.
  9. @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.
  10. @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 🙃
  11. @Sascha 😛 Ja ich weiss, gute Wortwahl. Ich denke da einfach an Dinge wie Gegner respawn usw.
  12. Ich schmeiss mich mal ungefragt in die Runde. Ich arbeite derzeit selber an einem Spiel wo man Gebäude betreten kann und habe auch alles in einer Scene, weils einfach praktisch ist, weil man so Game Manager dingens nicht Scene übergreifend machen muss. Also ich handhabe das so, dass ich den Innenbereich einfach weit weg von der eigentlichen Map platziere und mich dann beim betreten entsprechend mit den Koordinaten dort hin versetze. Wie schon erwähnt setze ich ein trigger im Innenbereich der den ganzen schnörkel krims krams aktiviert, damit wenn ich nicht da bin, nicht zu viel berechnet werden muss. Klappt mit SetActive ganz gut! Einfach ein Parent Objekt erstellen wo der ganze Innenbereich drin ist und gut ist. Den Übergang gestalte ich mit einer einfachen animation via Sprite im Canvas. Damit verdekt man den ruckartigen wechsel der Position ganz gut. Ich würde in deinem Fall nicht für jeden Innenbereich eine einzelne Scene machen. Viele Spiele verwenden alles mögliche in einer Scene, damit man nur eine Ladesequenz hat, z.B. ist in gta5 der ganze Prolog immer im game vorhanden..
  13. Hab das jetzt noch nie verwendet, aber müsstest du wenn du den String abfragst, den text nicht noch in einen String convertieren? string.IsNullOrEmpty(TMPPlayerNameText.text.ToString())
  14. Sieht für mich aus als ob das Mesh der Brücke von unten offen ist, oder du einen Plane als Collider benutzt. Ist in dem Fall normal das man von einer Seite durch kann.
  15. Jomnitech

    Iso Cammera.

    Ich denke du brauchst dann eher die X und Z Koordinaten und die Y Achse ist dann der Abstand von der Kamera zum Spieler. Es sei denn es ist in 2d aufgebaut. Aber ist ja im Prinzip egal welche Werte du verwendest. Du musst hier nichts gross Variablen aus deinem Playerscript an das Kamerascript senden. Du kannst ein kleines Skript erstellen und einmalig den Player als Referenz einfügen, das reicht dann auch schon. z.B.: using UnityEngine; using System.Collections; public class CameraController : MonoBehaviour { public Transform player; public float distance = 5f; void LateUpdate () { transform.position = new Vector3(player.position.x, distance, player.position.z); } } Kannst dann einfach dieses Skript bei der Kamera einfügen. Im Inspektor ziehst du dann den Player in das Feld player und bei distance kannst du den abstand einstellen. Die Kamera selbst stellst du über den Inspektor und deren Rotation einmalig auf isometrische Ansicht ein.
×
×
  • Create New...