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

Garzec

Members
  • Content count

    222
  • Joined

  • Last visited

  • Days Won

    1

Garzec last won the day on February 2

Garzec had the most liked content!

Community Reputation

5 Neutral

About Garzec

  • Rank
    Advanced Member

Recent Profile Visitors

911 profile views
  1. Spielergesteuerte rotierende Tür

    @Zer0Cool was möchtest du denn alles überarbeiten Kommt dir das gesamte Script völlig falsch vor? Deine ersten Vorschläge konnte ich problemlos anpassen.
  2. Spielergesteuerte rotierende Tür

    Wenn ich das mache, rotiert er auf 90 Grad und rotiert dann von 180 Grad zurück auf 0.
  3. Spielergesteuerte rotierende Tür

    Stimmt. Habe deinen Weg getestet. Jetzt macht die Tür bei jeder Interaktion etwas. Das Öffnen funktioniert korrekt, das Schließen noch nicht. Öffnet sich die Tür auf 90 Grad, so schließt sie sich von 180 Grad auf 90 Grad. Danach öffnet sie sich von 90 auf 180 Grad und schließt sich von 270 auf 180. usw.
  4. Spielergesteuerte rotierende Tür

    Achso, ja könnte man auch schreiben. Aktuell zähle ich diesen ja einfach beim Öffnen hoch und beim Schließen wieder runter.
  5. Hallo, aktuell baue ich Scripte für verschiedene Türen zusammen. Dabei habe ich noch ein Problem mit einer rotierenden Tür, die vom Spieler geöffnet / geschlossen wird. Der Spieler kann also mit der Tür interagieren und diese öffnet / schließt sich. Falls eingestellt, öffnet diese sich immer vom Spieler weg, je nachdem, ob er nun vor oder hinter ihr steht. Wie eine Saloon-Tür quasi. [SerializeField] Vector3 targetRotation; // Die Zielrotation beim geöffneten Zustand [SerializeField] float duration; // Rotationsdauer [SerializeField] bool isClosable; // kann man die Tür wieder schließen? [SerializeField] Vector3 pivotPosition; // Position des Pivotpunktes [SerializeField] bool opensAwayFromPlayer; // Saloon Tür? bool isActive = false; // Tür momentan "beschäftigt"? Transform doorPivot; Transform playerTransform; bool isOpen = false; // Tür Status void Start() // Pivotpunkt setzen { playerTransform = Globals.GetPlayerObject().transform; doorPivot = new GameObject().transform; doorPivot.position = pivotPosition; transform.SetParent(doorPivot); } IEnumerator DoorRotation() // Tür öffnen oder schließen { if (isActive) // Solange die Tür sich öffnet oder schließt nichts machen yield break; isActive = true; float counter = 0; // aktueller Rotationstimer Vector3 defaultAngles = doorPivot.eulerAngles; // die Rotation im geschlossenen Zustand Vector3 desiredRotation = targetRotation; // Ziel Rotation geöffnet if (opensAwayFromPlayer && PlayerIsBehindDoor(transform, playerTransform)) // Rotation umdrehen, falls der Spieler hinter der Tür steht desiredRotation = -desiredRotation; Vector3 openRotation = transform.eulerAngles + desiredRotation; // Die tatsächliche Rotation if (!isOpen) // Tür öffnen, falls geschlossen { while (counter < duration) { counter += Time.deltaTime; LerpDoorRotation(doorPivot, defaultAngles, openRotation, counter, duration); yield return null; } if (!isClosable) // Script zerstören, da es nicht mehr benötigt wird -> Tür ist nicht verschließbar Destroy(this); } else // Tür schließen { while (counter > 0) { counter -= Time.deltaTime; LerpDoorRotation(doorPivot, defaultAngles, openRotation, counter, duration); yield return null; } } isOpen = !isOpen; // Tür Status umschalten isActive = false; } bool PlayerIsBehindDoor(Transform door, Transform player) // Prüfen, ob der Spieler hinter der Tür steht { Vector3 doorTransformDirection = door.forward.normalized; Vector3 playerTransformDirection = (player.position - door.position).normalized; return Vector3.Dot(doorTransformDirection, playerTransformDirection) < 0; } void LerpDoorRotation(Transform doorPivot, Vector3 defaultAngles, Vector3 targetRotation, float counter, float duration) // Rotationsbewegung { doorPivot.eulerAngles = Vector3.Lerp(defaultAngles, targetRotation, counter / duration); } Aufrufen tue ich das Ganze über eine Methode namens `Interact()`. Diese startet eine Coroutine mit `DoorRotation()`. Steht der Spieler nun vor der Tür, so rotiert diese nach vorne, also +90 Grad. Möchte ich die Türe wieder schließen, so passiert beim nächsten Aufruf von `Interact()` nichts. Danach rotiert die Tür nicht zurück, sondern weiter, also auf 180 Grad. Danach passiert wieder nichts und danach weiter zu 270 Grad usw. Hat jemand eine Idee? Ich schätze es hat etwas mit der Zeile if (opensAwayFromPlayer && PlayerIsBehindDoor(transform, playerTransform)) desiredRotation = -desiredRotation; zu tun, aber ich brauche diese, damit die Rotation richtig berechnet wird, falls der Spieler hinter der Türe steht.
  6. Rotation um einen Pivotpunkt

    Hallo, für die Vollständigkeit würde ich mal das finale Script hier lassen, vielleicht kann es ja jemand gebrauchen. Vielleicht findet auch jemand Verbesserungen. Mit dem Script ist es jetzt ebenfalls möglich, die Tür so einzustellen, dass sie immer vom Spieler weg rotiert. Beispielsweise eine Saloon Tür. [SerializeField] private Vector3 targetRotation; [SerializeField] private float duration; [SerializeField] private bool closeAgain; [SerializeField] private float waitInterval; [SerializeField] private Vector3 pivotPosition; [SerializeField] private bool opensAwayFromPlayer; private Vector3 defaultRotation; private bool isActive = false; private Transform doorPivot; private Transform playerTransform; private void Start() { playerTransform = Globals.GetPlayerObject().transform; doorPivot = new GameObject().transform; doorPivot.position = pivotPosition; transform.SetParent(doorPivot); defaultRotation = doorPivot.eulerAngles; } private IEnumerator DoorRotation() { if (isActive) yield break; isActive = true; float counter = 0; Vector3 defaultAngles = doorPivot.eulerAngles; if (PlayerIsBehindDoor()) targetRotation = -targetRotation; Vector3 openRotation = transform.eulerAngles + targetRotation; while (counter < duration) { counter += Time.deltaTime; LerpDoor(defaultAngles, openRotation, counter); yield return null; } if (!closeAgain) Destroy(this); yield return new WaitForSeconds(waitInterval); while (counter > 0) { counter -= Time.deltaTime; LerpDoor(defaultAngles, openRotation, counter); yield return null; } isActive = false; } private void LerpDoor(Vector3 defaultAngles, Vector3 targetRotation, float counter) { doorPivot.eulerAngles = Vector3.Lerp(defaultAngles, targetRotation, counter / duration); } private bool PlayerIsBehindDoor() { Vector3 doorTransformDirection = transform.TransformDirection(Vector3.forward); Vector3 playerTransformDirection = playerTransform.position - transform.position; return Vector3.Dot(doorTransformDirection, playerTransformDirection) < 0; } public void Interact() { StartCoroutine(DoorRotation()); } Die Einstellungen im Inspector sind sehr überschaubar. Zusätzlich muss man die Tür nicht unbedingt um ihre y-Achse drehen. Man kann sie drehen und winden, wie man möchte.
  7. Rotation um einen Pivotpunkt

    da gebe ich dir ja Recht. Ich bin prinzipiell aber ein Freund von "ich nehme nur dieses Objekt, ziehe es rein und alles funktioniert". Die Sache mit dem GO ist in Ordnung, aber 1x im Start den Pivotpunkt zu verschieben fände ich am besten.
  8. Rotation um einen Pivotpunkt

    Aber es würde prinzipiell auch per Code gehen? Mit dem GO ist es einfach, aber das wäre wieder extra Zeugs, nur damit die Tür einen Drehpunkt hat :/ Wäre ziemlich cool, wenn die Tür das auch ohne weiteres Objekt machen könnte.
  9. Rotation um einen Pivotpunkt

    Hast du jetzt einfach mal meine Lösung genommen und nochmal hingeschrieben? Dann hätte ich eigentlich nur noch die Frage, ob ich den Pivotpunkt der Tür im Script setzen kann, oder ein Empty GO als Vater nehmen muss und dieses dann rotiere.
  10. Rotation um einen Pivotpunkt

    @Sascha wenn du magst kann ich dir ein Video oder Gif erstellen. Oder du erstellst ein Projekt, nimmst einen Würfel und kopierst den Code drauf. Edit: Speichere ich mir die eulerAngles vor der Schleife zwischen, also private IEnumerator RotateDoor(Vector3 newRotation) { float counter = 0; Vector3 defaultAngles = transform.eulerAngles; // Zwischenspeichern while (counter < duration) { counter += Time.deltaTime; transform.eulerAngles = Vector3.Lerp(defaultAngles, newRotation, counter / duration); yield return null; } } funktioniert das Ganze.
  11. Rotation um einen Pivotpunkt

    Hmm.. also ich habs jetzt mal mit verschiedenen Werten getestet. Nehme ich den Wert 1, ist die Rotation natürlich schon in 1 Sekunde fertig. Nehme ich den Wert 10, dauert es ca. 2 Sek. Bei 50 ca. 4 Sek. usw. Also die Rotation wird schon langsamer, aber sie ist eben sehr viel schneller als die eigentliche Dauer.
  12. Rotation um einen Pivotpunkt

    ok super, Frage 2 gelöst Zu Frage 1: Ich nehme mal als Duration den Wert 5. Die Rotation der Tür ist bereits in unter 2 Sekunden fertig. Die `RotateDoor` Funktion selbst benötigt aber die vollen 5 Sekunden, da der Counter dann erst bei 5 Sekunden ankommt und die while-Schleife verlässt. Ich möchte im Prinzip mit der Duration angeben, wie lange die Rotation dauern soll. Würde ich nämlich beispielsweise bei der Duration 20 setzen, wäre die Rotation nach ca. 3 Sekunden fertig aber der Counter muss ca. 20 Sekunden lang hochzählen, bis es weiter geht.
  13. Ich möchte eine Tür um beispielsweise 90 Grad öffnen, danach soll diese beispielsweise 3 Sekunden warten und sich wieder schließen. Für die Rotation der Tür würde ich einen Pivotpunkt setzen. Für den Beginn der Rotation rufe ich im Spiel die Methode "Interact()" auf. public class RotatingDoor : Door, IInteractable { [SerializeField] private Vector3 targetRotation; // Rotation, wenn offen [SerializeField] private float duration; // Geschwindigkeit [SerializeField] private bool closeAgain; // Tür wieder schließen oder offen lassen? [SerializeField] private float waitInterval; // Wartezeit bis zum Schließen private Vector3 defaultRotation; // Ursprungsrotation bei Start private bool isActive = false; // Tür grade "beschäftigt" ? private void Start() { defaultRotation = transform.eulerAngles; } private IEnumerator DoorRotation() { if (isActive) // Abbrechen, wenn sich die Tür bereits öffnet / schließt yield break; isActive = true; yield return StartCoroutine(RotateDoor(targetRotation)); // Tür öffnen if (!closeAgain) // Script zerstören, falls die Tür nicht geschlossen werden muss Destroy(this); yield return new WaitForSeconds(waitInterval); // X Sekunden warten yield return StartCoroutine(RotateDoor(defaultRotation)); // Tür zur Ursprungsrotation schließen isActive = false; } private IEnumerator RotateDoor(Vector3 newRotation) // Tür rotieren { float counter = 0; newRotation = transform.eulerAngles + newRotation; while (counter < duration) { counter += Time.deltaTime; transform.eulerAngles = Vector3.Lerp(transform.eulerAngles, newRotation, counter / duration); yield return null; } } public void Interact() { StartCoroutine(DoorRotation()); // Tür öffnen und anschließend wieder schließen } } Dabei habe ich zwei Probleme: 1. Setze ich im Inspector eine niedrige Dauer, so rotiert die Tür sehr schnell. Setze ich also einen größeren Wert ein, rotiert sie zwar langsamer aber der Counter innerhalb der Methode benötigt dann eben auch X Sekunden, bis er bei dieser Dauer angekommen ist. Obwohl er bei einer Rotationsdauer von 3 Sekunden nach 3 Sekunden größer als Dauer sein sollte. 2. Die Tür rotiert zwar auf, aber nicht mehr zu. Es wird zwar die Coroutine aufgerufen, wieder zurück zu rotieren, aber die Tür bleibt starr. Rotiere ich die Tür danach noch einmal, rotiert sie natürlich erstmal weiter von 90 bis 180 Grad, da sie ja nicht zurück rotiert ist. Hilfe wäre super
  14. Text auf Sprites schreiben

    Ich erzeuge mir ein Grid mit "Zellen", die ich hinterher anklicken kann, mit denen weiterarbeiten kann etc. Ich war mir nicht sicher, ob ich da jetzt ein Canvas mit Buttons nehme oder einfach wirkliche Sprites, die ich mit `void OnMouseDown()` anklicke. Also der Code funktioniert problemlos.
  15. Text auf Sprites schreiben

    Ja, die Texte stehen auf 0,0,0. @Life Is Good wie würdest du denn nach der Textkomponente suchen, außer ein Feld im Inspektor anzulegen? Ich habe jetzt folgendes gemacht: Beim Canvas den Render Mode auf "World" gesetzt. Dem Canvas eine Breite und Höhe von 1 gegeben (damit es genauso groß ist, wie die Zelle) und die Position des Canvas auf 0,0,0 gesetzt. Ich bekomme es aber nicht hin, den Text so einzustellen, dass innerhalb des Canvas eine lesbare Zahl steht. Aktuell befindet sich dort nur ein schwarzer massiv verschwommener Fleck. Edit: Um den Text passend anzuzeigen, musste ich die Breite und Höhe des Textes ebenfalls auf 1 setzen. Dann noch "Best Fit" aktivieren und die Maximale Größe auf 1 setzen. Beim Canvas musste ich noch "Dynamic Pixels per Unit" auf 50 setzen, dann wird alles ordentlich angezeigt.
×