Pengontrol Karakter 2D untuk Unity
2D Platformer adalah jenis permainan di mana pemain melompat antar platform, menghindari rintangan, dan melawan musuh, yang semuanya diamati dari perspektif tampilan samping 2D.
Untuk membuat Pengontrol Karakter Platformer 2D di Unity, ikuti langkah-langkah di bawah ini.
Pengontrolnya akan berbasis fisika dan akan menggunakan komponen Rigidbody2D.
Langkah
- Buka Scene dengan level 2D kamu (pastikan sprite level sudah terpasang collider 2D, agar pemain tidak terjatuh)
- Buat GameObject baru dan beri nama "Player"
- Buat GameObject lain, beri nama "player_sprite" dan tambahkan komponen Sprite Renderer ke dalamnya
- Tetapkan sprite Anda ke "player_sprite" dan pindahkan ke dalam Objek "Player"
- Buat skrip baru, beri nama "CharacterController2D" dan tempel kode di bawah ini di dalamnya:
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;
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) && isGrounded)
{
r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
}
// 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);
}
}
- Lampirkan skrip CharacterController2D ke Objek "Player" (Anda akan melihatnya juga menambahkan komponen lain yang disebut Rigidbody2D dan CapsuleCollider2D)
- Sesuaikan dimensi CapsuleCollider2D hingga cocok dengan Sprite pemain
- Pastikan tidak ada child collider dan CapsuleCollider2D adalah satu-satunya collider yang terpasang pada pemain ini
Dalam skrip CharacterController2D ada opsi untuk menetapkan variabel Kamera Utama yang dapat berupa Kamera apa pun yang mengikuti pemain:
Pengontrol Karakter 2D sekarang siap!