Jump to content
Unity Insider Forum

Player sliden lassen


MoinPeter

Recommended Posts

Hi,

ich möchte bei einem 2D Sidescroller den Player aus dem Stand sliden lassen. Allerdings hab aber keine Ahnung wie ich das script-technisch lösen soll. Ich habe schon versucht mit Lerp oder SmoothDamp die velocity zu beeinflussen, hab es aber noch nicht hinbekommen. Der Player muss sozusagen bei kurzem Druck auf eine Taste einen kleinen Schubs bekommen und dann langsam in die Richtung sliden, bis er wieder zum Stehen kommt (als ob der Boden aus Eis wäre).

Hat jemand eine Idee, wie ich das machen kann?

Viele Grüße

MP.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hat dein Spieler einen Rigidbody2D und wenn ja, warum fügst du dem RB nicht eine Kraft hinzu in die Richtung die du haben möchtest?
https://docs.unity3d.com/ScriptReference/Rigidbody2D.AddForce.html

Zusätzlich kann man einem RB2D ein Material zuweisen, welches das Verhalten seines 2D-Colliders in Bezug auf den "Boden" (Collider des Bodens) definiert:
https://docs.unity3d.com/ScriptReference/PhysicsMaterial2D-friction.html

Ein Wert von 0 entspricht einer Oberfläche aus Eis. Die Materialeigenschaften des Bodens wird hier natürlich noch mit verrechnet. Allerdings sollte die kombinierte Reibung hier wieder 0 betragen (0 * Bodenreibung = 0):
https://answers.unity.com/questions/790289/how-do-2-physics-material-2d-interact-with-each-ot.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, danke für die Antwort. Leider benutze ich keinen Rigidbody sondern Raycasts für den Player. Ich hab es jetzt erstmal so gemacht:

void Update() {
if (slide) {
            velocity.x = 20 - value;
            value = value + 0.3f;
        }
if(Input.GetKeyDown(KeyCode.E)){
            if (facingRight) {
                slide = true;
                StartCoroutine(WaitforSlide());
            }
}
 
public IEnumerator WaitforSlide(){
        yield return new WaitForSeconds(1f);
        slide = false;
        value = 0;
    }

Allerdings kommt mir das ganze noch etwas undynamisch und unkontrollierbar vor. Vorallem kann man den Slide nicht mehrere Male hintereinander einsetzen während man sich gerade in einem befindet, man muss erst warten, bis der aktuelle abgeschlossen ist. Hat jemand noch Verbesserungsvorschläge/ eine Idee für eine bessere Methode?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine recht simple Möglichkeit wäre folgende:

using UnityEngine;

public class PlayerSlide : MonoBehaviour {
	float veloX=0;
	float timer=0;
	float direction=1;

	//Inspector values
	public float power=5;
	public float timeTillBreak=1;

	void Update() {
		Push();
	}

	void FixedUpdate() {
		Slide(direction);
	}

	void Push() {
		if(Input.GetKeyDown(KeyCode.E)) {
			veloX=power;
			timer=timeTillBreak;
			direction=1;
		} else if(Input.GetKeyDown(KeyCode.Q)) {
			veloX=power;
			timer=timeTillBreak;
			direction=-1;			
		}
	}

	void Slide(float direction) {
		if(timer>0) {
			Vector3 pos=transform.position;
			transform.position=new Vector3(Mathf.MoveTowards(pos.x, pos.x+direction, veloX*Time.deltaTime), pos.y, 0);

			timer-=Time.deltaTime;
			veloX=Mathf.Lerp(0, power, timer);
		}		
	}
}

Das hängt natürlich davon ab, was dein Player noch alles können soll und in welchem Kontext der Slide auftritt. Wenn du beispielsweise kontrollieren möchtest, welche Strecke beim Slide zurückgelegt werden soll, würde ich das eher mit Mathf.Lerp als Mathf.MoveTowards umsetzen.

Aber zumindest müsstest du die beiden Methoden erweitern können.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...