RiseBasti Geschrieben 17. Februar 2017 Melden Share Geschrieben 17. Februar 2017 Hallo zusammen Ist es irgendwie möglich, dass ich mit einem Rigidbody meinen Charakter Controller verschieben kann durch seine Gravitation oder allgemein seiner Velocity? (Bsp.: Objekt fliegt waagrecht auf Spieler zu, trifft ihn und Spieler wird weggestossen) Wenn es nicht geht ist das auch egal, ich habe bisher leider nur die umgekehrte Variante gefunden (Rigidbody schieben). Danke schonmal für die Hilfe Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 17. Februar 2017 Melden Share Geschrieben 17. Februar 2017 Ein CharacterController ist ein besonderer Collider. Collider haben keine Idee von Bewegung, sondern stellen einfach nur eine Form dar. Man kann diese Form fragen, ob ein Ray oder eine andere Form damit kollidiert. Ein Rigidbody macht dann das ganze Gedöns mit Kräften und jeden fixed Timestep bewegen und kollision abfragen und so weiter. Ein CharacterController hat einfach nur die Move-Funktion. Sie ist wie transform.Translate, macht aber noch einen Kollisionscheck und wenn man irgendwo gegen kommt, wird die Bewegung des CCs verkürzt. Damit will ich sagen: Der CC bewegt sich nur dann, wenn du es ihm im Skript sagst. Quasi jedes CC-Skript hat daher einen Vector3, der in jedem (hoffentlich Fixed-)Update in Move reingeschmissen wird. Wenn ein Rigidbody gegen den CC fliegt, kannst du diesen Vektor so verändern, dass der CC anfängt wegzufliegen. Also wie üblich OnCollisionEnter und dann den Bewegungsvektor vom CC manipulieren. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RiseBasti Geschrieben 18. Februar 2017 Autor Melden Share Geschrieben 18. Februar 2017 Ich hätte erhofft es gäbe eine einfach Einstellung dazu, habe jedoch erwartet dass es selbst programmiert werden muss Aber wenn ich jetzt auf OnCollisionEnter den Bewegungsvektor manipulieren will, dann weiss ich nicht genau wie das gehen soll, denn ich kann ja nicht einfach eine Kraft zu der Velocity hinzufügen Oder gibt es da eine Möglichkeit? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mr 3d Geschrieben 18. Februar 2017 Melden Share Geschrieben 18. Februar 2017 Collision besitzt ja sogar einen "impulse" Wert.. Wenn du deinem Charakter jetzt noch eine velocity und masse gibst lässt sich relativ einfach eine simple Interaktion zwischen RigidBody und ChracterController erzeugen.. public float Mass; private Vector3 velocity; private CharacterController controller; void Awake() { controller = GetComponent<CharacterController>(); velocity = Vector3.zero; } void FixedUpdate() { velocity += Physics.gravity * Time.fixedDeltaTime; if (controller.isGrounded) { velocity.y = 0; } controller.Move(velocity * Time.fixedDeltaTime); } void OnCollisionEnter(Collision col) { velocity -= col.impulse / Mass; } ( bin nicht sicher ob das physikalisch 100% korrekt ist.. ) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 18. Februar 2017 Melden Share Geschrieben 18. Februar 2017 ich kann ja nicht einfach eine Kraft zu der Velocity hinzufügen Doch, genau das tust du Aber wie bei Mr 3ds Code zu sehen, ist das kein Feld, das Unity dir gibt, sondern das du selber erstellt hast - siehe Zeile 3. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RiseBasti Geschrieben 18. Februar 2017 Autor Melden Share Geschrieben 18. Februar 2017 Ok, das funktioniert soweit, diese Bewegung stoppt nun jedoch nicht mehr. Logisch: die Variable value wieder verkleinern. Gibt es jetzt dazu aber einen Befehl, welcher mir nur den Betrag des Vektors verkleinert? Ansonsten müsste ich ja für alle 3 Richtungen einzeln überprüfen, ob die nun positiv oder negativ sind und dementsprechend erhöhen oder verkleinern Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RiseBasti Geschrieben 18. Februar 2017 Autor Melden Share Geschrieben 18. Februar 2017 Soeben selber noch auf eine Idee gekommen (Weiss nicht ob die gut ist oder ob es einen Haken gibt) controller.Move(Vector3.ClampMagnitude(velocity,range) * Time.fixedDeltaTime); Dann wird dir range = velocity.magnitude gesetzt und anschliessend bis 0 verkleinert. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mr 3d Geschrieben 18. Februar 2017 Melden Share Geschrieben 18. Februar 2017 ich würde einfach eine Bodenreibung einführen.. ( Luftreibung dürfte zu vernachlässigen sein.. ) float friction = 3; .... if(controller.isGrounded){ float speed = velocity.magnitude; if (speed != 0) { float drop = speed * friction * Time.fixedDeltaTime; velocity *= Mathf.Max(speed - drop, 0) / speed; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RiseBasti Geschrieben 18. Februar 2017 Autor Melden Share Geschrieben 18. Februar 2017 Ja das sieht schon besser aus als meins Danke für eure Hilfe! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
RiseBasti Geschrieben 19. Februar 2017 Autor Melden Share Geschrieben 19. Februar 2017 Es hat sich soeben noch ein neues Problem aufgetan welches mich ein wenig verwirrt Wenn ich nun ein Objekt mit Rigidbody in meiner Szene habe und das auf mich zu fliegt und mich wegstösst, dann funktioniert alles wunderbar. Wenn ich jetzt aber aus diesem Objekt ein Prefab mache und es über ein Script instantiiere, dann zieht das Objekt mich heran beim zusammenstossen, es dreht irgendwie die Richtung von "collision.impulse". Wie kann das sein? Code: Instantiate(Hindernis1, new Vector3(posX, posY, transform.position.z + posZ), Quaternion.Euler(new Vector3(0, 0, 0))); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.