Jump to content
Unity Insider Forum

Rigidbody und Character Controller


RiseBasti

Recommended Posts

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

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

Ich hätte erhofft es gäbe eine einfach Einstellung dazu, habe jedoch erwartet dass es selbst programmiert werden muss :rolleyes:

 

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 :blink:

 

Oder gibt es da eine Möglichkeit?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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 :huh:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Es hat sich soeben noch ein neues Problem aufgetan welches mich ein wenig verwirrt :blink:

 

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...