Jump to content
Unity Insider Forum

Sprinten und Ducken (3D)


uumli

Recommended Posts

Hallo Leute,

ich wollte heute zum ersten mal einen PlayerController, für einen 3D Player schreiben. 

Das hat im weitesten Sinne auch geklappt. 2 Dinge fehlen mir aber noch, bzw. sind mir nicht gelungen. 

Zum einen möchte ich, dass der Wert "MoveSpeed" beim Drücken der Sprinttaste verdoppelt wird. (Habe einfach den Doppelten Wert eingetragen) Leider hat das aber nicht geklappt. Die Geschwindigkeit wurde nicht erhöht. 

Des Weiteren nutze ich das Component "Character Controller". Der hat eine Höhe von "2". Beim Drücken von "c" wollte ich den Wert übers script auf "0.5" verändern lassen und beim loslassen, wieder zurück auf "2". Ich weiß aber nicht, wie ich diesen Wert ansprechen kann. 

Ich lege hier einmal das Script bei. Den fehlgeschlagenen Versuch, die Geschwindigkeit zu erhöhen, lasse ich einmal drin. Vielleicht fällt euch da ja was auf. Bin ja noch ein ziemlicher Anfänger.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

	private float MoveSpeed = 15f;
	private float JumpHeight = 10f;
	private float gravity = 30f;
	public float MouseSensitivity = 0.5f;
	private Vector3 moveDir = Vector3.zero;

	// Use this for initialization
	void Start () {
		
	}

	void FixedUpdate () {
		

		float rotY = Input.GetAxis ("Mouse X") * MouseSensitivity;
		transform.Rotate (0, rotY, 0);

	}
	
	// Update is called once per frame
	void Update () {

		CharacterController controller = gameObject.GetComponent<CharacterController> ();

		if (controller.isGrounded) {
			moveDir = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical"));
			moveDir = transform.TransformDirection (moveDir);
			moveDir *= MoveSpeed;

			if (Input.GetButtonDown ("Jump")) {
				moveDir.y = JumpHeight;

				if (Input.GetButtonDown ("Sprint")) { //Hier der Versuch, die Geschwindigkeit beim Drücken von  "Sprint" zu erhöhen.
					MoveSpeed = 30f;
	}
}
		}

		moveDir.y -= gravity * Time.deltaTime;
		controller.Move (moveDir * Time.deltaTime);
	}
}

Danke für eure Hilfe :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh, ja. Jetzt sehe ich es auch. Danke :)

Ich habe den jetzt weiter nach "unten" verlagert. Ein Problem bleibt dort dennoch bestehen. Wenn ich die Taste loslasse, bleibt die Geschwindigkeit so hoch. Sie soll aber dann wieder auf "15f"zurück wechseln.

if (Input.GetButtonDown ("Sprint")) {
			MoveSpeed = 30f;
		}

Dann fehlt mir jetzt nur noch die Höhenveränderung des Character Controllers.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe jetzt mal romprobiert, komme aber einfach nicht auf meinen Fehler.

Das Sprinten klappt jetzt, doch hört er nicht mehr auf zu Sprinten, wenn der Button losgelassen wird.

Weiß da jemand, was ich falsch gemacht habe?

 

if (Input.GetButtonDown ("Sprint")) {
			MoveSpeed = 30f;
		}
		else if(Input.GetButtonDown ("Sprint")) {
			MoveSpeed = 15f;
		}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde statt der Änderung von MoveSpeed eine kleine Abfrage einbauen, ob man gerade sprintet oder nicht. Davon abhängig wird dann der jeweils richtige Wert auf deinen Vektor multipliziert.

moveDir *= sprinting ? sprintSpeed : moveSpeed;

sprinting wird da gesetzt, wo du jetzt MoveSpeed überschreibst:

if(Input.GetButtonDown ("Sprint"))
{
	sprinting = true;
}

 

Zu deinem Fehler: Du fragst zwei mal dasselbe ab.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, Abfrage ist drin. Das Problem aber leider nicht nicht gelöst. Immer noch der selbe Fehler, dass die Geschwindigkeit nicht wieder normal wird, wenn die Sprintentaste losgelassen wird. Hier das komplette "neue" Script. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

	private float MoveSpeed = 15f;
	private float JumpHeight = 10f;
	private float gravity = 30f;
	public float MouseSensitivity = 0.5f;
	public float SprintSpeed = 30f;
	private bool sprinting;
	private Vector3 moveDir = Vector3.zero;

	// Use this for initialization
	void Start () {

	}

	void FixedUpdate () {


		float rotY = Input.GetAxis ("Mouse X") * MouseSensitivity;
		transform.Rotate (0, rotY, 0);

	}

	// Update is called once per frame
	void Update () {

		CharacterController controller = gameObject.GetComponent<CharacterController> ();

		if (controller.isGrounded) {
			moveDir = new Vector3 (Input.GetAxis ("Horizontal"), 0, Input.GetAxis ("Vertical"));
			moveDir = transform.TransformDirection (moveDir);
			//moveDir *= MoveSpeed;//
			moveDir *= sprinting ? SprintSpeed : MoveSpeed;

			if (Input.GetButtonDown ("Jump")) {
				moveDir.y = JumpHeight;


			}
		}

		moveDir.y -= gravity * Time.deltaTime;
		controller.Move (moveDir * Time.deltaTime);

		if(Input.GetButtonDown ("Sprint"))
		{
			sprinting = true;
		}
		else {
			sprinting = false;
		}
	
	}
}

Ich glaube ich verstehe da noch nicht ganz, wie so etwas auszusehen hat. Danke für die Mühen.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein Button hat mehr als nur 2 Zustände. GetButtonDown ist nur dieser eine Moment, wenn der Button runter gedrückt wird. ButtonUp ist der eine Moment, wenn der Button wieder losgelassen wird und Button ohne Up oder Down ist eine art Dauerfeuer. Nur hier wird dauernd true gegeben, solange der Button gedrückt ist.

Du kannst jetzt also die Momente der Zustandswechsel abfragen und immer dabein eine Variable verändern, da musst du aber up UND down abfragen.

Oder mit if - else den Button alleine abfragen.

If(Input.GetButton){
sprinting=true;
}
else{
sprinting=false;
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dankeschön, dass kannte ich nicht nicht so. Jetzt hat das mit dem Sprinten einwandfrei geklappt. Ich habe das jetzt genau wie beschreiben gemacht:

if(Input.GetButton ("Sprint")) //nicht GetButtonDown
		{
			sprinting = true;
		}
		else {
			sprinting = false;
		}

Das Ducken habe ich jetzt schon alleine herausgefunden. War eigentlich sogar ziemlich unkompliziert. 

if(Input.GetButton ("Sneak"))
		{
			controller = GetComponent<CharacterController>();
			controller.height = 0.5F;
		}

Für die Nachwelt ;)

Vielen Dank für die Hilfe :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Den Code kann man in der aktuellen Form auch stark kürzen. Die extra-Variable "sprinting" habe ich erwähnt, weil ich irgendwie dachte, dass du diese Art von Sprint haben willst, die nach dem Drücken der Shift-Taste nicht mehr aufhört, bis man W loslässt. Wie in Borderlands z.B.

Es ginge hier allerdings

var sprinting = Input.GetButton("Sprint");

wohlgemerkt mit sprinting als lokaler Variable, die am Anfang gesetzt wird.

 

Um die Höhe des CC zu ändern, musst du einfach mal schauen, welche Eigenschaften er hat. Dabei hilft die Scripting Reference: CharacterController

Es dürfte dir direkt ins Auge springen ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...