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

    266
  • Joined

  • Last visited

  • Days Won

    1

Garzec last won the day on February 2 2017

Garzec had the most liked content!

Community Reputation

5 Neutral

About Garzec

  • Rank
    Advanced Member

Recent Profile Visitors

1,126 profile views
  1. Habe es gekürzt bekommen, die Rotationen stimmen aber nicht. public class InterferometricCube : MonoBehaviour { [SerializeField] private Projectile projectileLeft; [SerializeField] private Projectile projectileRight; private void OnCollisionEnter(Collision collision) { HandleProjectile(collision); } private void HandleProjectile(Collision collision) { GameObject collidingObject = collision.gameObject; Projectile projectileComponent = collidingObject.GetComponent<Projectile>(); if (projectileComponent) { Vector3 hitNormal = collision.contacts.First().normal; Vector3 other = Vector3.Cross(hitNormal, collidingObject.transform.up); SpawnProjectile(projectileRight, other); SpawnProjectile(projectileLeft, -other); SpawnProjectile(projectileComponent, -hitNormal); } } private void SpawnProjectile(Projectile projectile, Vector3 direction) { Vector3 spawnPoint = direction + transform.position; projectile.InitProjectile(spawnPoint, Quaternion.Euler(direction)); /* -- InitProjectile -- transform.position = startPosition; transform.rotation = startRotation; currentMovementDirection = transform.forward; */ } } Ich verwende eine TopDown Sicht Egal, von welcher Seite ich auf den Würfel schieße, ein Projektil fliegt immer "nach oben". Das Projektil "nach unten" bleibt im Würfel stecken, da muss ich wohl für die Projektile noch einen Abstand für ihre Achse einberechnen. Das Projektil, mit dem ich auf den Würfel schieße, fliegt idR ebenfalls "nach oben". Hat jemand eine Idee?
  2. Hallo, schieße ich mit einem Projektil auf einen Würfel, so sollen über die getroffene Seite folgende Mittelpunkte berechnet werden: gegenüberliegenden Seite linke Seite rechte Seite Die drei neuen Punkte dienen mir danach als Grundlage für Spawnpositionen. Ich habe schon einmal den Code vorbereitet: public class InterferometricCube : MonoBehaviour { [SerializeField] private Vector3 cubeScale; // Größe des Würfels private const float SPAWN_SPACING = 1.5f; // Abstand zum Würfel private void OnCollisionEnter(Collision collision) { CheckProjectile(collision); } private void CheckProjectile(Collision collision) { Projectile projectileComponent = collision.gameObject.GetComponent<Projectile>(); if (projectileComponent) // ist das kollidierende Objekt ein Projektil? { Vector3 contactPoint = collision.contacts.First().normal - transform.up; Vector3[] directions = null; if (contactPoint == new Vector3(0, -1, -1)) // transform.forward // vorne { Vector3[] targetDirections = { -transform.forward, transform.right, -transform.right }; directions = targetDirections; } else if (contactPoint == new Vector3(0, -1, 1)) // -transform.forward // hinten { Vector3[] targetDirections = { transform.forward, transform.right, -transform.right }; directions = targetDirections; } else if (contactPoint == new Vector3(1, -1, 0)) // -transform.right // links { Vector3[] targetDirections = { -transform.forward, transform.right, transform.forward }; directions = targetDirections; } else if (contactPoint == new Vector3(-1, -1, 0)) // transform.right // rechts { Vector3[] targetDirections = { -transform.forward, transform.forward, -transform.right }; directions = targetDirections; } if (directions != null) { SpawnProjectiles(directions); } } } private void SpawnProjectiles(Vector3[] directions) { for (int i = 0; i < directions.Length; i++) { Vector3 currentDirection = directions[i]; // Spawnrotation Vector3 spawnPoint = currentDirection + transform.position + cubeScale; // Spawnposition spawnPoint *= SPAWN_SPACING; // Abstand setzen Debug.Log(spawnPoint); } } } Innerhalb von CheckProjectile berechne ich anhand der Normalen die anderen drei Seiten. Leider springt mir dort der doppelte Code ins Gesicht und möglicherweise kann man dies ja viel einfacher berechnen. Wäre super, falls mir jemand ein wenig mit Mathe aushelfen könnte, falls es einfacher gehen sollte
  3. Projektil reflektieren

    Ich habe es erstmal hinbekommen mit public void ReflectProjectile() { RaycastHit hit; Ray ray = new Ray(transform.position, currentMovementDirection); if (Physics.Raycast(ray, out hit)) { currentMovementDirection = Vector3.Reflect(currentMovementDirection, hit.normal); } }
  4. Projektil reflektieren

    Hallo, beim Abfeuern eines Projektiles verwende ich erstmal folgenden Code private Rigidbody rigid; private Vector3 currentMovementDirection; private void FixedUpdate() { rigid.velocity = currentMovementDirection; } public void InitProjectile(Vector3 startPosition, Quaternion startRotation) { transform.position = startPosition; transform.rotation = startRotation; currentMovementDirection = transform.forward; } Dabei verwende ich InitProjectile als Startmethode, weil ich die Projektile nicht zerstöre sondern recycle (Renderer disablen). Sobald das Projektil auf ein Objekt trifft, das dieses Projektil reflektieren kann, soll das Projektil reflektiert werden. Unity scheint dafür bereits etwas zu haben, https://docs.unity3d.com/ScriptReference/Vector3.Reflect.html Wenn die Collision also getriggert wird private void OnTriggerEnter(Collider other) { if (other.gameObject == projectile) { projectileComponent.ReflectProjectile(); } } Soll das Projektil seine Richtung und Rotation ändern. public void ReflectProjectile() { // Vector3.Reflect(... , ...); } Leider verstehe ich nicht so recht, welche Parameter dort übergeben werden müssen. Ich habe es auch mal auf anderem Wege probiert, indem ich die Velocity mit -1 multipliziere, logischerweise wird dann aber einfach die Bewegungsrichtung umgekehrt. Wäre super, wenn mir jemand mit der Reflektion helfen könnte
  5. Animierter SceneFader

    Oh, ja also die Fledermäuse habe ich, die hat ja unser Grafiker bereits erstellt. Ich baue jetzt erstmal nen 0815 SceneFader rein
  6. Animierter SceneFader

    Hm schade, ich hatte auf ein Partikelsystem oder sowas gehofft :/
  7. Animierter SceneFader

    Hallo, also wie ich einen SceneFader baue, der zb am Ende einer Szene das bild abdunkelt und beim Start einer Szene aufhellt weiß ich. Aber mich würde mal interessieren, ob es möglich ist, sowas zu bauen: https://www.youtube.com/watch?v=Bwj3Ki9jh3A&feature=youtu.be&t=36s Wie könnte man sowas in Unity machen? Ist das ein Gif? Eine Animation? Ein Partikelsystem? Vielleicht kann man solch einen Fader ja sogar so weit durch Code ausbauen, dass ein Schwarm unterschiedliche Start- und Endpunkte hat?
  8. Ne, genau das wundert mich, die Szene ist ja komplett unabhängig von allem. Das heißt ihr müsste es ja eigentlich egal sein, von wo sie geladen wird. Ich muss das nochmal debuggen ..
  9. @Sascha Ich habe noch ein interessantes Problem entdeckt .. Ich habe eine Levelauswahl und eine Weltenauswahl. Da beide bei mir technisch gesehen identisch sind, nutzen sie den gleichen Code. Starte ich das Spiel vom Hauptmenü aus, kann ich problemlos auf die Karte der Welten, dort eine Welt auswählen und dann zur Levelauswahl der Welt. Dort funktioniert die Steuerung problemlos. Starte ich das Spiel innerhalb eines Levels, gehe ins Ingame Menü, wähle "zurück zur Map", dann gelange ich zur Levelauswahl, aber der Spieler kann nicht mehr sliden, sondern bewegt sich gar nicht und beim zweiten Key dann instant. Gehe ich von dort zur Weltenauswahl, ist der Fehler auch dort anzutreffen. Gehe ich von dort zum Hauptmenü und dann wieder zur Weltenauswahl, bleibt der Fehler bestehen. Also starte ich das Spiel ordentlich vom Hauptmenü aus funktioniert es aber starte ich aus einem Level heraus und lade die "Weltenauswahl"-Szene, funktioniert das Sliden nicht mehr. Der restliche Code funktioniert aber. Nur die Coroutine möchte nicht ..
  10. Zu deiner letzten Frage: Weil dieses Script die Karte ist. Die Karte verwaltet die ganzen Punkte und sagt dem Spieler nur "beweg dich da hin". Der Spieler selbst hat dann das ganze Movement Zeug und soll später auch seine Animationen verwalten. Aber was die Punkte betrifft, liegt das bei der Karte. Natürlich müsste man den Input eigentlich bei dem Spieler abfragen, ja. Und zu deiner vorletzten Frage: Nein, ich war dumm Dankeschön.
  11. @Sascha Also ich bewege mich innerhalb eines Arrays von Index zu Index. Mit dem Index komme ich an das Objekt und somit auch an die Position des Objektes. Nun ist es so, dass dein Code fast funktioniert. Ich kann mich hin und her bewegen. Trotzdem gibt es ein paar Fehler, die Ausgangssituation ist, dass ich mich am letzten Element befinde, also der höchste Index ist aktiv. Bewege ich mich zurück und drücke schnell nochmal vorwärts, kann ich für einige Tastendrücke lang den Spieler gar nicht mehr bewegen. Ich habe deinen Code mal bei mir umgesetzt private void Update() { if (Input.GetKeyDown(KeyCode.A)) // nach links bewegen { MovePlayer(false); } if (Input.GetKeyDown(KeyCode.D)) // nach rechts bewegen { MovePlayer(true); } } private void MovePlayer(bool moveForward) { if (currentSmoothMovement == null) // kein SmoothMovement aktiv (1x) { bool validMovement = false; // kann sich der Spieler mit dem nächsten Index noch weiter bewegen? if (moveForward) // nächsten Index prüfen { if (currentPlaceIndex + 1 < places.Length) { currentPlaceIndex++; validMovement = true; } } else // vorherigen Index prüfen { if (currentPlaceIndex - 1 >= 0) { currentPlaceIndex--; validMovement = true; } } if (validMovement) // der Spieler darf sich noch bewegen { targetPlacePosition = places[currentPlaceIndex].PlacePosition; // die aktuelle Zielposition festlegen player.CurrentSmoothMovement = StartCoroutine(player.MoveSmoothlyToLevel(targetPlacePosition)); // Smooth Movement aktivieren forwardMovement = moveForward; } } else // SmoothMovement aktiv (2x) { if (moveForward == forwardMovement) { StopCoroutine(player.CurrentSmoothMovement); player.CurrentSmoothMovement = null; // SmoothMovement stoppen player.MoveInstantToLevel(targetPlacePosition); // "Teleport" } } } Ich vermute, ich habe forwardMovement = moveForward; noch nicht so ganz verstanden bzw. ich wende es falsch an.. ?
  12. jup, das hab ich schon alles der erste Code war einfach mal Pseudo, weil ich hier grad das Repo nicht hatte. Ich probiere es heut abend mal aus. Vielen Dank schonmal!
  13. So wie ich deinen Code grade lese, müsste ich nur noch if (Input.GetKeyDown(KeyCode.D)) { MoveButtonPressed(true); } angeben? Bzw. für Key "A" dann "MoveButtonPressed(false)"
  14. Hallo, ich habe eine Karte mit mehreren Leveln. Der Spieler kann sich auf dieser Karte von Level zu Level bewegen und dann das Level auswählen, auf dem er grade steht. Kann man sich vorstellen wie die Karte von Super Mario http://s1.dmcdn.net/TU6VI/1280x720-oPd.jpg Nun ist es so, dass ich mich mit zwei Tasten vorwärts (rechts) und zurück (links) bewegen kann. Drücke ich eine Taste 1x fängt der Spieler über Lerp an, sich von Level A zu Level B zu bewegen. Drücke ich die Taste nochmal bewegt er sich direkt zum Level, also instant. Nun bin ich das schonmal durchgegangen, private bool btnPressed; private bool btnPressedAgain; private void Update() { if (Input.GetKeyDown(KeyCode.A)) { if (!btnPressed) { Move(false, false); // smooth links btnPressed = true; } else if (btnPressed && !btnPressedAgain) { Move(false, true); // instant links btnPressedAgain = true; } } if (Input.GetKeyDown(KeyCode.E)) { if (!btnPressed) { Move(true, false); // smooth rechts btnPressed = true; } else if (btnPressed && !btnPressedAgain) { Move(true, true); // instant rechts btnPressedAgain = true; } } } private void Move(bool moveForwards, bool moveInstant) { // mit moveForwards die Zielposition (targetPosition) bestimmen if (moveInstant) { StopCoroutine(SmoothMovement(targetPosition)); // Lerp stoppen InstantMovement(targetPosition); // Direkt positionieren btnPressed = false; btnPressedAgain = false; } else { StartCoroutine(SmoothMovement(targetPosition)); // Lerp Bewegung btnPressed = false; } } Und habe 2 Probleme: 1. Starte ich in Move die Coroutine, darf btnPressed = false natürlich erst gesetzt werden, wenn diese fertig ist. 2. Während der Bewegung nach links, muss die Bewegung nach rechts blockiert werden. Würde ich nach links drücken und dann nach rechts, würde der Spieler sich instant nach links bewegen. Ebenso würde er durch die beiden unterschiedlichen Bewegungsrichtungen durcheinander kommen. Die Problematik scheint simpel aber irgendwie gerate ich immer mit der Logik durcheinander
  15. InvalidOperationException

    Ok, ich habe es grade herausgefunden. 1. Meine Objekte, die sich auch in Awake initialisieren, habe ich in "OnEnable" gepackt, dann liegen diese immer noch vor Start und die Datenbank kann sich in Awake aufbauen. 2. Der Fehler ist einfach nur ein Syntax Problem durch mein Verschulden gewesen, er hat über die Id 0 natürlich kein Level gefunden und das wollte mir der Fehler damit sagen..
×