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

KaBau

Members
  • Content count

    8
  • Joined

  • Last visited

Community Reputation

0 Neutral

About KaBau

  • Rank
    Newbie

Profile Information

  • Gender
    Male
  • Location
    Hildesheim
  1. GameObject.Find

    Hallo, Danke für diesen Satz. Folgendes klappte bei mir nicht (Wenn mein Player zerstört wurde und kurz darauf ein Prefab mittels Instantiate und dem unten stehenden Script erstellt wurde erhielt ich immer die Fehlermeldung: "NullReferenceException: Object reference not set to an instance of an object"): private Transform ply; public float moveSpeed = 0.1f; void Start() { ply = GameObject.Find("Player").transform; } void FixedUpdate() { if (ply) { transform.LookAt(ply); } transform.Translate(Vector3.forward * moveSpeed); } In der Fehlermeldung wurde auf die Zeile in der Start-Funktion verwiesen, in der ich den Player (oder besser gesagt seine Transform-Komponete) suchte. So hatte ich es in verschiedenen YouTube Tutorials gesehen. Aber wie oben geschrieben: es lief nicht richtig wenn der Player schon weg war. Folgendes klappte: private GameObject ply; public float moveSpeed = 0.1f; void Start() { ply = GameObject.Find("Player"); } void FixedUpdate() { if (ply) { transform.LookAt(ply.transform); } transform.Translate(Vector3.forward * moveSpeed); } Hier habe ich nun erst den Player gesucht und später in der FixedUpdate-Funktion die Transform-Komponente ausgewählt.
  2. Ich habe für die vertikale Richtung die Variable "plyMouseSpeedVertical" eingesetzt um bei meinem hochkant angeordneten Spiel die Bewegung der Maus auf dem Untergrund kleiner zu halten. Eine Bewegung nach Links bzw. Rechts kann vom Spieler einfacher getätigt werden als nach Oben bzw. Unten. Somit wollte ich für Oben und Unten die Playerbewegung erhöhen.
  3. So, und zum Abschluss mein gesamtes Script, falls jemand seinen Player so ähnlich bewegen möchte: using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlyMove : MonoBehaviour { float plyMoveHorizontal; float plyMoveVertical; float plyXMin = -9f; float plyXMax = 9f; float plyZMin = -6.0f; float plyZMax = 23.5f; float plyMoveSpeed = 17f; float plyMouseSpeed = 1.2f; float plyMouseSpeedVertical = 1.5f; // damit bei einen hochkant liegenden Spielbereich die Maus sich noch schneller bewegt. private void Update() { // Eingabeabfrage Maus, ansonsten Tastatur. if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0) { plyMoveHorizontal = Input.GetAxis("Mouse X") * plyMouseSpeed; plyMoveVertical = Input.GetAxis("Mouse Y") * plyMouseSpeed * plyMouseSpeedVertical; } else { plyMoveHorizontal = Input.GetAxis("Horizontal"); plyMoveVertical = Input.GetAxis("Vertical"); } } void FixedUpdate() { // Abfrage Bewegungsrichtung und ob Lage Player kleine/größer als Max/Min Werte, dann Bewegung in eigener Methode. if ((plyMoveHorizontal > 0 && transform.position.x <= plyXMax) || (plyMoveHorizontal < 0 && transform.position.x >= plyXMin)) { PlyTransformHorizontal(); } if ((plyMoveVertical > 0 && transform.position.z <= plyZMax) || (plyMoveVertical < 0 && transform.position.z >= plyZMin)) { PlyTransformVerical(); } } void PlyTransformHorizontal() { Vector3 plyMovement = new Vector3(plyMoveHorizontal, 0.0f, 0.0f); transform.Translate(plyMovement * plyMoveSpeed * Time.deltaTime); } void PlyTransformVerical() { Vector3 plyMovement = new Vector3(0.0f, 0.0f, plyMoveVertical); transform.Translate(plyMovement * plyMoveSpeed * Time.deltaTime); } } Im Anhang ein kleiner Eindruck, wie es nun aussieht. Das zu sehende Ruckeln kommt wohl von der 24er Bildrate beim Aufnehmen. Das Rotieren des Schiff ist in einem eigenen Script ausgelagert, ebenso wie die Bewegung der Kamera. Zuerst die Bewegung mit Tasten, danach die Bewegung mit der Maus. Später werde ich mich noch mit der Touchbewegung auseinandersetzten. Aber ersteinmal kommt das Leveldesign dran. PlayerBewegung.mp4
  4. Es darf auch gerne eine gleichzeitige schräge Bewegung erfolgen. Ich habe dein Script ausprobiert (sorry das ich mich wiederhole: ich finde deinen Einsatz klasse): dabei gibt es bei einer gleichzeitigen Bewegung nach schräg oben (als Beispiel) eine Art "Treppeneffekt". Der Player macht immer eine mini Bewegung nach links und dann eine mini Bewegung nach oben kurz hintereinander. Ich kenne mich übrigends noch nicht mit den "Mathf" Funkionen aus. Zu Dabei passiert folgendes: der Player bewegt sich immer etwas über die Min / Max Werte hinaus. Nun bleibt der Player hier stecken, weil er nicht mehr zwischen dem im Script genannten Min / Max Bereich ist. Ich habe es ausprobiert, wer selber eine solche Lösung für sich nutzen möchte sollte folgendes eingeben: void PlyTransformHorizontal() { if ((plyMoveHorizontal > 0 && transform.position.x <= plyXMax) || (plyMoveHorizontal < 0 && transform.position.x >= plyXMin)) { Dabei kann der Player etwas ausserhalb der Min Max Grenze kommen und kann dann doch wieder zurück bewegt werden.
  5. Die Kamera hat ein komplett eigenes Script, welches genauso aufgebaut ist wie das Player Script. Nur habe ich die Vertikalbewegung weggelassen und die Grenzen und Bewegungsgeschwindigkeiten etwas geringer gesetzt. Die Kamera bewegt sich nicht vertikal, da der Hintergrund sich bewegt. Dadurch habe ich ein leichtes Hin- und Herwandern der Kamera und den Player, welcher sich in dem Sichtfeld bewegt. Im 3D ergeben sich somit schöne Effekte durch die Objekte im Hintergrund, welche verschieden weit von der Kamera weg sind.
  6. Ich hatte eben zu schnell geantwortet: "return;" muss raus, da ansonsten bei der kleinsten Bewegung Horizontal die Vertikalbewegung gar nicht mehr erfasst wird. Die Mausgeschwindigkeit habe ich nun wie folgt umgesetzt: plyMoveHorizontal = Input.GetAxis("Mouse X") * plyMouseSpeed; plyMoveVertical = Input.GetAxis("Mouse Y") * plyMouseSpeed *1.5f; Mit einem Wert der Variable "plyMouseSpeed" von 2f ist die Bewegung für mich gut. Zur Antwort von Zer0Cool: Mit "Time.deltatime" ist die Bewegung ersteinmal irre langsam. Ich habe die Variable "plyMoveSpeed" von 0.35f auf 17f erhöht. Dann läuft es wieder flüssig. Grundsätzlich an alle die hier mitmachen (ist mein erstes eigenes Thema): DANKE. Toll wie ihr so einem Anfänger wie mich unterstützt.
  7. Wow, superschnelle Antwort. Danke. Ich habe die Abfragen in die Update-Methode geschoben. Es ruckelt noch immer. Inzwischen ist mir foldender Gedanke gekommen: Maus und Vector3.right ... verträgt sich eventuell nicht, weil dabei nur das Versetzten um eine Einheit erfolgt, aber nicht das Erreichen einen neuen Ziel, welches in der FixedUpdate-Methode mit Zwischenschritten ermittelt wird (weis ich nicht, rate ich aber mal). Somit habe ich die eigendliche Bewegung etwas umgeschrieben. Zusammenfassung: - Variablen wie bisher - Abfrage Eingabe Maus oder Tastatur wie von Zer0Cool geschrieben in die Update-Methode - Abfrage Bewegungsrichtung und Lage Player wie bisher - Bewegung in zwei eigene Methoden ausgelagert: 1x für Horizontal, 1x für Vertical - die eigendliche Bewegung nicht mehr mit "Vector3.right ...", sondern durch Angabe eines Vector3 Zielpunkt. Script (ohne Variblen, die sind geblieben): private void Update() { // Eingabeabfrage Maus, ansonsten Tastatur. if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0) { plyMoveHorizontal = Input.GetAxis("Mouse X"); plyMoveVertical = Input.GetAxis("Mouse Y") * plyMouseSpeedVertical; } else { plyMoveHorizontal = Input.GetAxis("Horizontal"); plyMoveVertical = Input.GetAxis("Vertical"); } } void FixedUpdate() { // Abfrage Bewegungsrichtung und ob Lage Player kleine/größer als Max/Min Werte, dann Bewegung. if (plyMoveHorizontal > 0 && transform.position.x <= plyXMax) { PlyTransformHorizontal(); return; } if (plyMoveHorizontal < 0 && transform.position.x >= plyXMin) { PlyTransformHorizontal(); return; ; } if (plyMoveVertical > 0 && transform.position.z <= plyZMax) { PlyTransformVerical(); return; // transform.Translate(Vector3.forward * plyMoveSpeed); } if (plyMoveVertical < 0 && transform.position.z >= plyZMin) { PlyTransformVerical(); return; } } void PlyTransformHorizontal() { Vector3 plyMovement = new Vector3(plyMoveHorizontal, 0.0f, 0.0f); transform.Translate(plyMovement * plyMoveSpeed); } void PlyTransformVerical() { Vector3 plyMovement = new Vector3(0.0f, 0.0f, plyMoveVertical); transform.Translate(plyMovement * plyMoveSpeed); } Ich musste die Horizontale und Verticale Bewegung trennen, weil ansonsten der Player doch aus dem Bild verschwindet, wenn beide Richtungen gleichzeitig eingegeben werden. Ob das "return;" notwendig ist, weis ich nicht. Grundsätzlich bewegt sich der Player nun wie von mir gewünscht, ich muss nur noch die Mausgeschwindigkeit erhöhen. Danke.
  8. Hallo, ich programiere ein Spiel als Top-Down Shooter. Der Player soll entweder über Maus, oder Tastatur gesteuert werden. Die Grenzen des Spielfeld haben ich mit Max und Min Werte eingestellt. Anbei ein Auszug aus dem Script: float plyMoveHorizontal; float plyMoveVertical; float plyMouseHorizontal; float plyMouseVertical; public float plyXMin = -9.5f; public float plyXMax = 9.5f; public float plyZMin = -6.0f; public float plyZMax = 23.5f; public float plyMoveSpeed = 0.35f; public float plyMouseSpeedVertical = 1.5f void FixedUpdate() { // Eingabeabfrage Maus, ansonsten Tastatur. Anmerkung: Maus ruckelt noch. if (Input.GetAxis("Mouse X") != 0 || Input.GetAxis("Mouse Y") != 0) { plyMoveHorizontal = Input.GetAxis("Mouse X"); plyMoveVertical = Input.GetAxis("Mouse Y") * plyMouseSpeedVertical; } else { plyMoveHorizontal = Input.GetAxis("Horizontal"); plyMoveVertical = Input.GetAxis("Vertical"); } // Abfrage Bewegungsrichtung und ob Lage Player kleine/größer als Max/Min Werte, dann Bewegung. if (plyMoveHorizontal > 0 && transform.position.x <= plyXMax) { transform.Translate(Vector3.right * plyMoveSpeed); } .... die anderen Achsen / Grenzen werden entsprechend der letzten if Abfrage behandelt. Mein Problem: bei der Mausbewegung haben ich gegenüber der Tastaturbewegung ein Ruckeln. Wie kann ich das unterbindnen?
×