• 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

    125
  • Joined

  • Last visited

  • Days Won

    1

Garzec last won the day on February 2

Garzec had the most liked content!

Community Reputation

4 Neutral

About Garzec

  • Rank
    Advanced Member
  1. Morgen, jap, das weiß ich, da du aber darauf hingewiesen hattest, AddForce eh nicht für Sprünge zu verwenden, habe ich das Ganze mal zurückgebaut, mit VerticalVelocity. private void Start() { movementData = new PlayerMovementData(); movementData.DistanceToGround = GetComponent<Collider>().bounds.extents.y + movementData.GroundCheckSpacing; movementData.CanDoubleJump = false; } private void Update() { movementData.IsGrounded = Physics.Raycast(transform.position, Vector3.down, movementData.DistanceToGround); if (movementData.IsGrounded) { movementData.VerticalVelocity = -movementData.Gravity * Time.deltaTime; if (Input.GetButtonDown("Jump")) { movementData.VerticalVelocity = movementData.JumpPower; movementData.CanDoubleJump = true; } } //else if (!movementData.IsGrounded && movementData.CanDoubleJump) //{ // movementData.VerticalVelocity = -movementData.Gravity * Time.deltaTime; // if (Input.GetButtonDown("Jump")) // { // movementData.VerticalVelocity = movementData.JumpPower; // movementData.CanDoubleJump = false; // } //} else { movementData.VerticalVelocity -= movementData.Gravity * Time.deltaTime; } } private void FixedUpdate() { Vector3 forward = movementData.CameraObject.transform.forward; Vector3 right = movementData.CameraObject.transform.right; forward.y = 0; Vector3 newDirection = forward * movementData.InputVertical + right * movementData.InputHorizontal; newDirection.y = movementData.VerticalVelocity; movementData.MovementDirection = newDirection; if (movementData.MovementDirection.magnitude != 0) transform.rotation = Quaternion.LookRotation(transform.forward + new Vector3(movementData.MovementDirection.x, 0, movementData.MovementDirection.z) * movementData.SmoothRotation); movementData.PlayerRigid.velocity = movementData.MovementDirection * movementData.MovementSpeed; } So funktioniert es bei mir problemlos. VerticalVelocity wird unten dann nur noch hier gesetzt newDirection.y = movementData.VerticalVelocity; Ich versuche noch den auskommentierten Doppelsprung ordentlich reinzubringen und dann hoffe ich, dass es klappt
  2. So ich habe die gesamte Klasse mal angepasst, in der Hoffnung, so hattest dus dir vorgestellt: public class PlayerMovementController : PlayerCommonController { float movementSpeed = 25; Vector3 movementDirection = Vector3.zero; bool isGrounded; bool canDoubleJump = false; float jumpPower = 15; float smoothRotation = 7; float inputHorizontal = 0; float inputVertical = 0; private void Update() { inputHorizontal = Input.GetAxis("Horizontal"); inputVertical = Input.GetAxis("Vertical"); isGrounded = Physics.Raycast(transform.position, Vector3.down, GetComponent<Collider>().bounds.extents.y + 0.1f); if (isGrounded && Input.GetButtonDown("Jump")) { rigid.AddForce(Vector3.up * jumpPower); canDoubleJump = true; } else if (!isGrounded && canDoubleJump && Input.GetButtonDown("Jump")) { rigid.AddForce(Vector3.up * jumpPower); canDoubleJump = false; } } private void FixedUpdate() { Vector3 forward = CameraObject.transform.forward; Vector3 right = CameraObject.transform.right; forward.y = 0; Vector3 newDirection = forward * inputVertical + right * inputHorizontal; newDirection.y = rigid.velocity.y; movementDirection = newDirection; if (movementDirection.magnitude != 0) transform.rotation = Quaternion.LookRotation(transform.forward + new Vector3(movementData.MovementDirection.x, 0, movementData.MovementDirection.z) * smoothRotation); rigid.velocity = movementDirection * movementSpeed; } } Jetzt sieht der Code schonmal schlanker aus, es treten aber immer noch Probleme durch die Sprungmechanik auf. Nun fällt die Figur extrem schnell auf den Boden, ebenso springt sie extrem schnell hoch, im Inspektor taucht auch eine Warnung auf. Ich lade mal ein Video davon hoch: 2017-03-19 21-14-45.flv Bzw. hier als Link, falls man sich das Video nicht runterladen möchte https://sendvid.com/c1hvs2sh
  3. Danke, so viel hatte ich schon in der Doku rausgefunden, wie du an meinem 2. Post siehst, finde ich das Script aber mittlerweile sehr unsauber. Also movementData.MovementDirection = new Vector3(movementData.InputHorizontal, movementData.VerticalVelocity, movementData.InputVertical); movementData.MovementDirection = forward.normalized * movementData.MovementDirection.z + right.normalized * movementData.MovementDirection.x; movementData.MovementDirection = new Vector3(movementData.MovementDirection.x, movementData.VerticalVelocity, movementData.MovementDirection.z); Gefällt mir gar nicht. Aber es war die Lösung der Probleme.
  4. Wenn ich die Klasse wie folgt aufbaue, funktionierts public class PlayerMovementController : PlayerCommonController { PlayerMovementData movementData; private void Start() { movementData = new PlayerMovementData(); movementData.DistanceToGround = GetComponent<Collider>().bounds.extents.y + movementData.GroundCheckSpacing; } private void Update() { movementData.IsGrounded = Physics.Raycast(transform.position, Vector3.down, movementData.DistanceToGround); if (movementData.IsGrounded) { movementData.VerticalVelocity = -movementData.Gravity * Time.deltaTime; if (Input.GetButtonDown("Jump")) movementData.VerticalVelocity = movementData.JumpPower; } else movementData.VerticalVelocity -= movementData.Gravity * Time.deltaTime; } private void FixedUpdate() { Vector3 forward = movementData.CameraObject.transform.forward; Vector3 right = movementData.CameraObject.transform.right; forward.y = 0; movementData.MovementDirection = new Vector3(movementData.InputHorizontal, movementData.VerticalVelocity, movementData.InputVertical); movementData.MovementDirection = forward.normalized * movementData.MovementDirection.z + right.normalized * movementData.MovementDirection.x; movementData.MovementDirection = new Vector3(movementData.MovementDirection.x, movementData.VerticalVelocity, movementData.MovementDirection.z); if (movementData.MovementDirection.magnitude != 0) transform.rotation = Quaternion.LookRotation(transform.forward + new Vector3(movementData.MovementDirection.x, 0, movementData.MovementDirection.z) * movementData.SmoothRotation); movementData.PlayerRigid.velocity = movementData.MovementDirection * movementData.MovementSpeed; } } Was mir aber gar nicht daran gefällt, sind diese 3 Zeilen movementData.MovementDirection = new Vector3(movementData.InputHorizontal, movementData.VerticalVelocity, movementData.InputVertical); movementData.MovementDirection = forward.normalized * movementData.MovementDirection.z + right.normalized * movementData.MovementDirection.x; movementData.MovementDirection = new Vector3(movementData.MovementDirection.x, movementData.VerticalVelocity, movementData.MovementDirection.z);
  5. Hallo, ich habe eine 3D Adventure Plattformer Steuerung gebastelt für Spiele, wie Super Mario 64, Banjo Kazooie, Sypro (PS1) etc., die alten N64 Spiele eben Nun habe ich es geschafft, dass sich der Spieler relativ zur Kamera bewegt. So wie es sein soll... Nun fällt dieser aber sehr langsam und kann zudem nicht mehr springen. Hier mal mein Code: public class PlayerMovementData : PlayerCommonData { public float MovementSpeed { get { return 25; } } public float InputHorizontal { get { return Input.GetAxis("Horizontal"); } } public float InputVertical { get { return Input.GetAxis("Vertical"); } } public Vector3 MovementDirection { get; set; } public bool IsGrounded { get; set; } public float JumpPower { get { return 1; } } public float Gravity { get { return 3; } } public float VerticalVelocity { get; set; } public float DistanceToGround { get; set; } public float SmoothRotation { get { return 7; } } public float GroundCheckSpacing { get { return 0.1f; } } } PlayerMovementData movementData; private void Start() { movementData = new PlayerMovementData(); movementData.DistanceToGround = GetComponent<Collider>().bounds.extents.y + movementData.GroundCheckSpacing; } private void Update() { movementData.IsGrounded = Physics.Raycast(transform.position, Vector3.down, movementData.DistanceToGround); } private void FixedUpdate() { Vector3 forward = movementData.CameraObject.transform.forward; Vector3 right = movementData.CameraObject.transform.right; forward.y = 0; if (movementData.IsGrounded) { movementData.VerticalVelocity = -movementData.Gravity * Time.deltaTime; if (Input.GetButtonDown("Jump")) movementData.VerticalVelocity = movementData.JumpPower; } else movementData.VerticalVelocity -= movementData.Gravity * Time.deltaTime; movementData.MovementDirection = new Vector3(movementData.InputHorizontal, movementData.VerticalVelocity, movementData.InputVertical); movementData.MovementDirection = forward.normalized * movementData.MovementDirection.z + right.normalized * movementData.MovementDirection.x; if (movementData.MovementDirection.magnitude != 0) transform.rotation = Quaternion.LookRotation(transform.forward + new Vector3(movementData.MovementDirection.x, 0, movementData.MovementDirection.z) * movementData.SmoothRotation); movementData.PlayerRigid.velocity = movementData.MovementDirection * movementData.MovementSpeed; } Ich bin mir nicht ganz sicher, WAS genau Vector3 forward = movementData.CameraObject.transform.forward; speichert, daher konnte ich noch keine passende Bezeichnung finden. Kommentiere ich movementData.MovementDirection = forward.normalized * movementData.MovementDirection.z + right.normalized * movementData.MovementDirection.x; aus, fällt er wieder ganz normal, kann aber immer noch nicht springen. Ebenfalls vermute ich einen Fehler beim Anfang des FixedUpdates, wo ich schreibe forward.y = 0; Hat jemand eine Idee?
  6. Kanns hier an der Arbeit leider nicht testen, aber ich werde es wohl so abändern: // Die erzeugende Klasse: protected void CreatePopup(float value, Color popupColor) { PlayerChangeValueData changeData = new PlayerChangeValueData(); bool isNegativeValue = value < 0; GameObject popup = Instantiate(changeData.PopupTextObject, changeData.PlayerPosition, changeData.PopupTextObject.transform.rotation); popup.GetComponent<PopupController>().InitPopup( changeData.PopupTextUI, isNegativeValue ? value.ToString() : "+"+value, popupColor, isNegativeValue ? Vector2.down : Vector2.up); } // Die Klasse des Popups: PopupData popupData; public void InitPopup(Text text, string textValue, Color color, Vector2 direction) { popupData = new PopupData(text, textValue, color, direction); // Awake transform.SetParent(GameObject.FindGameObjectWithTag("PlayerUI").transform, false); // Start popupData.PopupText.color = popupData.TextColor; StartCoroutine(Fade()); } Sollte ich Gefahr laufen, dass die Update-Methode in der Klasse des Popups schon vorher beginnt, muss ich wohl einen bool setzen, damit das Update auf die Init-Methode wartet..
  7. Ja, so eine Initmethode hatte ich auch im Sinn. Da habe ich aber das Problem der Aufrufreihenfolge. Ich glaube, dass Awake und Start nach dem Erzeugen des Objektes vor der Init Methode aufgerufen werden. Das ist die einzige Barriere für mich Es sei denn .. ich schmeiße die Awake und Start Methode raus und packe den Code ebenfalls in diese Init-Methode, das ginge natürlich. Aber ist denn tatsächlich sichergestellt, dass erzeugtesObjekt.GetComponent<Script>().Init(); direkt nach Instantiate IMMER vor den Methoden im Script des erzeugten Objektes aufgerufen werden? Also hier mal als Beispiel: // Die erzeugende Klasse void ErzeugePrefab() { GameObject go = Instantiate(prefab); go.GetComponent<Prefabklasse>().Init(); } // Die Klasse des Prefabs public Class Prefabklasse : Monobehaviour { public Init() { // Daten füllen // Awake Aufrufe // Start Aufrufe } void Update() { // 1x pro Frame } } Ich bin mir unsicher, ob ich mir sicher sein kann (tolles Wortspiel), dass Update nicht schon beginnt, bevor die 2. Zeile in der erzeugenden Methode aufgerufen wird.
  8. Nein nein, genau das weiß ich ja Aber wenn ich mit Instantiate ein Objekt erzeuge, dann möchte ich genau von diesem Objekt den Konstruktor aufrufen. Also quasi GameObject go = Instantiate(prefab); // Erzeugte Objekt Script instance = new Script(); // Der Aufruf des Konstruktors von go Das fehlt mir noch. Also die Verbindung zwischen erzeugtem Objekt und beigefügten Script. Dort hat die Variable "go" mit "instance" ja nichts miteinander zu tun. Ich kann ja schreiben go.GetComponent<Script>(); aber ich muss beim Erzeugen noch Daten mitgeben. Also den Konstruktor des neu erzeugten Objektes aufrufen .. :/
  9. Guten Abend, ich tue mich grade ein wenig schwer mit C# und Unity. Ich nutze Datenklassen, die nicht von Monobehaviour erben und Controllerklassen, die auf den Objekten liegen. Ich erzeuge einen komplett gescripteten PopupText über diese Methode: protected void CreatePopup(float value, Color popupColor) { PlayerChangeValueData changeData = new PlayerChangeValueData(); // Referenz zu den Spielerdaten GameObject popup = Instantiate(changeData.PopupTextObject, changeData.PlayerPosition, changeData.PopupTextObject.transform.rotation); // Der erzeugte Text bool isNegativeValue = value < 0; // Verliert der Spieler etwas oder bekommt er etwas hinzugefügt? PopupController popupController = new PopupController( // Rufe den Konstruktor des Objektes auf und setze die Werte changeData.PopupTextUI, // das eigentliche Textelement isNegativeValue ? value.ToString() : "+"+value, // Text zusammensetzen popupColor, // die Farbe des Textes isNegativeValue ? Vector2.down : Vector2.up); // + fährt nach oben - fährt nach unten } Nun bin ich grade komplett überfragt, wie ich zu diesem erzeugten Popup den Konstruktor anhänge. Bzw die Daten mitgeben kann. Vielen Dank für Hilfe
  10. Ja sauber sollte der Code schon sein
  11. Hm okay ... gibt's nen Grund? Oder soll man sich "wegen so nem Einzeiler" nicht übers Update Gedanken machen?
  12. Ich darf davon ausgehen, für das sekündliche Updaten der Bar eine Coroutine zu nehmen anstatt Update? Ich denke, es macht einen Performanceunterschied aus oder? Weil jeden Frame updaten, das brauch ja kein Mensch. Eine Sekunde Zeit reicht ja. Aber mir geht es eher um die Performance
  13. Die Sonne liegt sowieso an einem Empty GO, weil ich dort die Scripte drangepackt habe
  14. Dadurch bleibt die Sonne aber doch an einem Punkt und rotiert nur um ihre eigene Achse. Eigentlich müsste sie doch um den Vector3.Zero rotieren, also eine Kreisbahn ablaufen. Zumindest hatte ich das so mit RotateAround() gemacht. Oder macht man das nicht? So bleibt die Sonne ja fix, der Mond fällt dann weg, weil er ja nicht mehr mit der Sonne um die Erde rotiert. Edit: Also vielen Dank, das klappt wunderbar Ich wollte nur noch fragen, so zur Information quasi
  15. Wie toll und episch der Zyklus sein soll, so weit bin ich ja noch gar nicht Also weshalb ich mich so schwer tue, ist, weil die Sonne und der Mond durch das LookAt(); eine Rotation auf der y-Achse von 180 (Sonne) und 0 (Mond) einnehmen. Sie rotieren auf X ja auch nie bis 360 oder 180 Grad. Hier mal ein wundervolles Gemälde von mir ... Da ich jetzt erstmal @MarcoMeters Vorschlag umsetzen wollte, habe ich geschrieben private void Update() { TimeProgressSlider.value = timeData.CurrentTime; } wobei public float CurrentTime { get { return ??? / 360; } } Und durch meine Überlegungen oben, weiß ich nicht, ob das so passen wird und 2. weiß ich auch nicht so recht, welchen Winkel man genau benötigt. Ich könnte ja die Rotation übers Transform holen Sun.transform.rotation.x oder mit einem Quaternion oder die lokale Rotation oder ... Zb. Das ist das, wobei ich Hilfe bräuchte :S