Menambahkan Dukungan Lompat Ganda ke Pengontrol Karakter Platformer 2D di Unity
Dalam tutorial ini, kami akan meningkatkan pemain platformer 2D di Unity dengan memasukkan fitur lompat ganda.
Panduan modifikasi ini mengasumsikan Anda telah mengikuti tutorial berikut: Pengontrol Karakter 2D untuk Unity.
Langkah 1: Deklarasikan Variabel
Tambahkan variabel berikut ke skrip yang ada untuk mengelola fitur lompat ganda:
public int maxJumps = 2;
int jumpsRemaining;
Variabel ini akan melacak jumlah lompatan maksimum yang diperbolehkan 'maxJumps' dan lompatan sisanya 'jumpsRemaining'.
Langkah 2: Ubah Logika Melompat
Sesuaikan logika lompat pada metode 'void Update()' untuk mengimplementasikan fitur lompat ganda:
// Jumping
if (Input.GetKeyDown(KeyCode.W))
{
if (isGrounded || jumpsRemaining > 0)
{
r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
// Reset jumps when grounded
if (isGrounded)
{
jumpsRemaining = maxJumps;
}
jumpsRemaining--;
}
}
Modifikasi ini memungkinkan pemain untuk melakukan lompatan jika di-ground atau masih ada sisa lompatan.
Periksa skrip terakhir yang dimodifikasi di bawah ini:
'CharacterController2D.cs'
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(CapsuleCollider2D))]
public class CharacterController2D : MonoBehaviour
{
// Move player in 2D space
public float maxSpeed = 3.4f;
public float jumpHeight = 6.5f;
public float gravityScale = 1.5f;
public Camera mainCamera;
public int maxJumps = 2;
int jumpsRemaining;
bool facingRight = true;
float moveDirection = 0;
bool isGrounded = false;
Vector3 cameraPos;
Rigidbody2D r2d;
CapsuleCollider2D mainCollider;
Transform t;
// Use this for initialization
void Start()
{
t = transform;
r2d = GetComponent<Rigidbody2D>();
mainCollider = GetComponent<CapsuleCollider2D>();
r2d.freezeRotation = true;
r2d.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
r2d.gravityScale = gravityScale;
facingRight = t.localScale.x > 0;
if (mainCamera)
{
cameraPos = mainCamera.transform.position;
}
}
// Update is called once per frame
void Update()
{
// Movement controls
if ((Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) && (isGrounded || Mathf.Abs(r2d.velocity.x) > 0.01f))
{
moveDirection = Input.GetKey(KeyCode.A) ? -1 : 1;
}
else
{
if (isGrounded || r2d.velocity.magnitude < 0.01f)
{
moveDirection = 0;
}
}
// Change facing direction
if (moveDirection != 0)
{
if (moveDirection > 0 && !facingRight)
{
facingRight = true;
t.localScale = new Vector3(Mathf.Abs(t.localScale.x), t.localScale.y, transform.localScale.z);
}
if (moveDirection < 0 && facingRight)
{
facingRight = false;
t.localScale = new Vector3(-Mathf.Abs(t.localScale.x), t.localScale.y, t.localScale.z);
}
}
// Jumping
if (Input.GetKeyDown(KeyCode.W))
{
if (isGrounded || jumpsRemaining > 0)
{
r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
// Reset jumps when grounded
if (isGrounded)
{
jumpsRemaining = maxJumps;
}
jumpsRemaining--;
}
}
// Camera follow
if (mainCamera)
{
mainCamera.transform.position = new Vector3(t.position.x, cameraPos.y, cameraPos.z);
}
}
void FixedUpdate()
{
Bounds colliderBounds = mainCollider.bounds;
float colliderRadius = mainCollider.size.x * 0.4f * Mathf.Abs(transform.localScale.x);
Vector3 groundCheckPos = colliderBounds.min + new Vector3(colliderBounds.size.x * 0.5f, colliderRadius * 0.9f, 0);
// Check if player is grounded
Collider2D[] colliders = Physics2D.OverlapCircleAll(groundCheckPos, colliderRadius);
//Check if any of the overlapping colliders are not player collider, if so, set isGrounded to true
isGrounded = false;
if (colliders.Length > 0)
{
for (int i = 0; i < colliders.Length; i++)
{
if (colliders[i] != mainCollider)
{
isGrounded = true;
break;
}
}
}
// Apply movement velocity
r2d.velocity = new Vector2((moveDirection) * maxSpeed, r2d.velocity.y);
// Simple debug
Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(0, colliderRadius, 0), isGrounded ? Color.green : Color.red);
Debug.DrawLine(groundCheckPos, groundCheckPos - new Vector3(colliderRadius, 0, 0), isGrounded ? Color.green : Color.red);
}
}
Langkah 3: Uji Game Anda
Jalankan game Anda di Unity dan uji fitur lompat ganda. Karakter tersebut harus bisa melompat dua kali di udara setelah meninggalkan tanah.