Rutschen
Lektion 4 von 20 im Kurs Unity-Spiel: Himmelsbahnen von Coddy.
Manche Hindernisse hängen zu hoch, um darüberzuspringen: Der Läufer rutscht darunter hindurch. Beim Rutschen ist der Läufer für einen Moment nur halb so groß.
Wenn du das Objekt verkleinerst, wird auch sein CharacterController kleiner, aber er wird um die Mitte herum verkleinert, sodass die Füße eine halbe Einheit über der Straße schweben würden. Bewege den Läufer um dieselbe halbe Einheit nach unten. Ein Controller muss deaktiviert sein, während du ihn von Hand bewegst, sonst macht sein nächster Move die Änderung rückgängig:
void Resize(float height)
{
controller.enabled = false;
transform.position += Vector3.up * (height - transform.localScale.y);
transform.localScale = new Vector3(1f, height, 1f);
controller.enabled = true;
}Ein Timer, slide, zählt die Rutschzeit herunter. Wenn sie abgelaufen ist, richtet sich der Läufer mit StopSlide wieder auf:
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}Aufgabe
Einfach- Füge
public float slideTime = 0.7f;undprivate float slide;hinzu. - Füge wie oben
ResizeundStopSlidehinzu. - Wenn am Boden S oder die Abwärtspfeiltaste gedrückt wird, setze
slide = slideTimeund rufeResize(0.5f)auf. - Ziehe in jedem Frame, wenn
slide > 0fist,Time.deltaTimedavon ab und rufeStopSlide()auf, sobald der Wert 0 erreicht. - Ein Sprung beendet ein Rutschen: Rufe
StopSlide()auf, wenn der Läufer springt.
Probier es selbst
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public float jumpHeight = 1.6f;
public float gravity = -40f;
public int lane;
private CharacterController controller;
private float fallSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
controller.Move(move);
}
}
Alle Lektionen in Unity-Spiel: Himmelsbahnen
Übe selbstständig: Unity-Playground