Camera & Character Movement
8.1 Pemrograman C#
A. Pengertian
C# adalah bahasa pemrograman modern yang diciptakan oleh Microsoft yang sebelumnya telah berkontribusi pada pengembangan bahasa seperti Borland Turbo C++ dan Borland Delphi. C# sendiri telah di standarisasi secara internasional oleh ECMA. Sebagai bahasa pemrograman modern dan berorientasi Object, C# memungkinkan developer untuk membangun berbagai jenis aplikasi yang aman dan kuat yang dapat berjalan di platform .NET. C# dapat digunakan untuk mengembangkan aplikasi berbasis desktop (Windows), aplikasi berbasis web, dan layanan web (web services). Penting untuk dicatat bahwa dalam pengembangan game, khususnya menggunakan platform Unity, C# menjadi bahasa pemrograman default. Ini menunjukkan fleksibilitas dan popularitas C# dalam pengembangan permainan, yang merupakan salah satu bidang aplikasi yang signifikan. Keunggulan C# adalah adopsi fitur-fitur dari berbagai bahasa pemrograman terkenal, dengan pengaruh paling dominan dari bahasa Java.
Berikut adalah fitur yang dimiliki C#:
- Feature yang sama dengan JAVA
- Object-orientation (single inheritance)
- Interfaces
- Exceptions
- Threads
- Namespaces (like Packages)
- Strong typing
- Garbage Collection
- Reflection
- Dynamic loading Code
B. Keunggulan
C# memiliki beberapa keunggulan yang membuatnya menjadi bahasa pemrograman yang populer dan digunakan secara luas, diantaranya sebagai berikut :
- Sederhana C# berdasar pada bahasa C dan C++, sehingga bagi mereka yang sudah familiar dengan bahasa-bahasa tersebut, C# akan terasa sangat familiar. Aspek-aspek seperti statements, expressions, operators, dan beberapa fungsi diadopsi langsung dari C dan C++, dengan peningkatan yang membuat bahasa ini lebih sederhana.
- Level Aplikasi Tinggi Selain sederhana, C# dirancang sebagai bahasa High Level Interoperability. Hal ini menunjukkan kemampuan C# untuk berintegrasi dengan berbagai teknologi.
- Efisien C# memiliki sedikit kata kunci (keywords), membuat penulisan program menjadi lebih mudah. Sedikitnya kata kunci juga berdampak pada eksekusi program yang lebih cepat.
- Produktivitas Tinggi Berbasis Pemrograman Berorientasi Objek (OOP) yang terintegrasi di dalam C# memungkinkan pengembangan program dengan mudah, terutama dengan ketersediaan class library yang sangat banyak.
- Fleksibilitas C# memiliki kemampuan untuk menangani berbagai jenis program, mulai dari sistem operasi, pengolah grafis, hingga pembuatan compiler untuk bahasa pemrograman lain.
- Sifat Moduler C# mendukung pemrograman moduler, di mana program ditulis dalam rutin-rutin atau fungsi-fungsi yang dapat digunakan kembali dalam program atau aplikasi lain.
Keunggulan-keunggulan ini menjadikan C# sebagai pilihan yang kuat untuk pengembangan berbagai jenis aplikasi, termasuk dalam konteks pengembangan game menggunakan platform Unity.
Secara default pada saat pertama membuat file script yang baru akan ditampilkan 2 buah prosedur MonoBehaviour, yaitu :

- Start() Prosedur ini akan dipanggil satu kali diawal pada saat script pertama kali dienable. Prosedur ini sesuai untuk inisialiasasi
- Update() Prosedur ini dipanggil pada setiap frame, apabila script di-enable, prosedur ini sesuai untuk bagian script yang dieksekusi berulang-ulang
8.2 Rigid Body 2D
A. Penjelasan Rigid Body 2D
Komponen RigidBody2D dalam konteks pengembangan game seringkali digunakan untuk memberikan kontrol fisika pada objek, terutama dalam lingkungan game 2D. Di sini, kita akan membahas karakteristik spesifik dari RigidBody2D yang membatasi gerakan objek.
- Control Object: RigidBody2D memberikan kendali penuh terhadap sifat fisika objek, seperti massa, gaya, dan percepatan. Ini memungkinkan objek berperilaku sesuai dengan hukum fisika yang berlaku.
- Gerakan di Bidang XY: Dengan menggunakan RigidBody2D, objek hanya dapat bergerak di bidang XY, yang berarti gerakannya dibatasi hanya pada sumbu horizontal (X) dan vertikal (Y). Hal ini umumnya sesuai dengan kebanyakan game 2D yang tidak memerlukan gerakan di dalam ruang 3D.
- Rotasi pada Sumbu yang Tegak Lurus: Objek yang menggunakan RigidBody2D hanya dapat memutar pada sumbu yang tegak lurus terhadap bidang XY. Ini berarti objek dapat mengalami rotasi, tetapi hanya sekitar sumbu yang tegak lurus dengan bidang tempat objek bergerak. Pengaturan ini memberikan kontrol yang lebih terbatas dibandingkan dengan RigidBody pada lingkungan 3D, di mana objek dapat bergerak bebas di tiga dimensi. Kendali yang lebih spesifik ini dapat sangat bermanfaat dalam konteks game 2D, di mana terkadang kita ingin membatasi gerakan dan rotasi objek untuk memenuhi kebutuhan desain dan gameplay tertentu. Dengan menggunakan RigidBody2D, pengembang dapat mengimplementasikan simulasi fisika yang realistis dalam game 2D, sambil mempertahankan kendali yang sesuai dengan kebutuhan desain dan tujuan gameplay.

Komponen 2D RigidBody muncul berbeda di Unity Editor tergantung pada tipe tubuh yang dipilih. Ada tiga opsi tipe body yaitu Dinmais, Kinematis, Statis
1. Dynamic
- Objek game dinamis sepenuhnya digerakkan oleh game machine (mesin fisik)
- Gerakan objek permainan Dinamis dipengaruhi oleh gaya, kecepatan, dan lain-lain
- Pysics Machine bertanggung jawab untuk menyelesaikan collison (tabrakan ) mereka dengan objek statis, kinematik, dan dinamis lainnya dan memantulkannya sesuai kebutuhan
- Contoh penggunaan: karakter game, memindahkan objek game, dll
2. Kinematic
- Objek permainan kinematik sepenuhnya didorong oleh skrip, jadi Anda harus menangani bagian gerakan secara manual
- Objek game kinematik hanya memproses tabrakan dengan objek game Dinamis
- Contoh penggunaan : jika menginginkan karakter bergerak dengan lebih fleksibel
3. Static
- Tidak ada komponen real Rigidbody yang terpasang padanya, sehingga mesin fisika tidak menganggapnya bergerak
- Tidak ada tabrakan yang dapat diterapkan padanya.
- Contoh penggunaan : tanah, dinding, objek game lain apa pun yang Anda tidak ingin karakter tersebut bertabrakan
Lalu terdapat Komponen material, sebagai tempat menambahkan script Physic Material 2D, biasanya pada script tersebut digunakan untuk memanipulasi player bergerak ke kanan kekiri dan melompat.
Selanjutnya terdapat Dropdown Constraints pada Body Type Dynamic & Kinematic yaitu, Freez Position sumbu X dan Y. Freez Rotation Sumbu Z, keduanya berfungsi untuk membekukan / menghentikan pergerakan poisis / rotasi yang diinginkan. Sedangkan pada Body Type Static tidak terdapat fitur tersebut.
8.3 Membuat Pergerakan Player
1. Buka file projek Unity sebelumnya pada bab 7 untuk digunakan kembali

2. Tambahkan player bernama player-id, pilih yang idle, Import kedalam Hirarki

3. Klik player-idle-1 tambahkan Component Rigidbody 2D, sesuaikan settingannya seperti gambar berikut, Centang pada Freeze Rotation Z

4. Lalu tambahkan komponen Capsule Colider di player-idle-1, lalu klik icon sebelah kanan edit colider

5. Lalu cockan garis oval degan karakternya atau bisa di inputkan Offset X, Y dan juga Size X, Y nya

6. Buka Folder praktikum, lalu bikin folder baru bernama Script

7. Masuk kedalam folder Script, lalu buat C# Script, beri nama Player

8. Drag & drop script player kedalam Hirarki player-idle-1, lalu klik 2x pada script player maka akan masuk kedalam text editor seperti ini

9. Masukan source code dibawah ini, pastikan nama public class harus sama dengan nama file yang dibuat.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
Rigidbody2D rb;
[SerializeField] float speed = 1;
float horizontalValue;
bool facingRight;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
void Update ()
{
horizontalValue = Input.GetAxisRaw("Horizontal");
}
void FixedUpdate()
{
Move(horizontalValue);
}
void Move(float dir)
{
#region gerak kanan kiri
float xVal = dir * speed * 100 * Time.fixedDeltaTime;
Vector2 targetVelocity = new Vector2(xVal, rb.velocity.y);
rb.velocity = targetVelocity;
if (facingRight && dir < 0)
{
// ukuran player
transform.localScale = new Vector3(-1, 1, 1);
facingRight = false;
}
else if (!facingRight && dir > 0)
{
// ukuran player
transform.localScale = new Vector3(1, 1, 1);
facingRight = true;
}
#endregion
}
}
10. Untuk mencoba Source code diatas berhasil, Tekan dikeyboard “a” atau “left arrow” untuk ke arah kiri, tekan “d” atau “right arrow” untuk ke arah kanan

11. Untuk membuat player loncat menggunakan spasi, kita perlu membuat GorundCheck dengan cara, klik Grid pada Hierarchy, pergi ke inspector, pilih Layer, Klik Add Layer

12. Lalu isi “Ground” pada User Layer 6

13. Ubah Layer menjadi Ground, jika muncul pop up Change Layer, klik yes saja

14. Klik kanan pada player-idle-1, lalu Create empty, beri nama GorundCheck
15. Klik pada Hirarki GorundCheck, lalu gunakan “Move Tools” untuk memindahkan ke bagian bawah Player seperti gambar berikut.

16. Kembali ke script Player tambahkan source code seperti ini

[SerializeField] Transform groundcheckCollider;
[SerializeField] LayerMask groundLayer;
const float groundCheckRadius = 0.2f; // +
[SerializeField] float speed = 1;
float horizontalValue;
[SerializeField] bool isGrounded; // +
bool facingRight;
17. Buat void ground check dibawah void fixedUpdate & tambahkan GorunCheck(); pada void fixedUpdate

void FixedUpdate()
{
GroundCheck();
Move(horizontalValue);
}
void GroundCheck()
{
isGrounded = false;
Collider2D[] colliders = Physics2D.OverlapCircleAll(groundcheckCollider.position, groundCheckRadius, groundLayer);
if (colliders.Length > 0)
isGrounded = true;
}