Gravitasi secara Manual
Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 38 dari 56.
CharacterController hanya jatuh jika skripmu membuatnya jatuh, dan jatuh sungguhan membuat kecepatan bertambah: gravitasi menambahkan sekitar 9.81 unit per detik ke kecepatan jatuh setiap detik. Jadi, skrip menyimpan kecepatan vertikal dalam sebuah field, menambahkan gravity * Time.deltaTime ke dalamnya setiap frame, lalu menggunakannya untuk bergerak dalam Move yang sama dengan gerakan berjalan:
public float gravity = -9.81f;
float verticalSpeed;
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f; // di tanah: hentikan jatuhnya, pertahankan sedikit dorongan ke bawah
}
verticalSpeed += gravity * Time.deltaTime;
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}Time.deltaTime muncul dua kali untuk dua kegunaan: gravity * Time.deltaTime adalah pertambahan kecepatan pada frame ini, dan kecepatan dikalikan Time.deltaTime adalah jarak yang ditempuh pada frame ini. Kecepatan disimpan dalam sebuah field karena harus bertahan dari satu frame ke frame berikutnya; variabel lokal akan kembali ke 0 setiap frame. Saat jatuh dari keadaan diam, controller berada pada -4.9 unit per detik setelah setengah detik dan -9.81 setelah satu detik.
Reset sama pentingnya dengan jatuh. Di lantai, Move menghentikan controller, tetapi tidak ada yang menghentikan field: tanpa reset, nilainya terus bertambah saat pemain berdiri, dan langkah berikutnya dari tepi akan membuat pemain jatuh dengan kecepatan penuh. Nilainya direset ke angka negatif kecil, bukan 0, agar setiap Move tetap menekan ke lantai: pada frame rate tinggi, dorongan gravitasi selama satu frame bisa lebih pendek daripada Min Move Distance, sehingga Move tidak melakukan apa-apa dan isGrounded menjadi false. isGrounded dibaca sebelum Move, jadi nilainya menjelaskan Move pada frame sebelumnya.
Tantangan
SedangPenyelam berdiri di atas menara tinggi, dan tombol panah menggerakkannya untuk berjalan (sudah ditulis). Beri gravitasi di Diver.cs. Inspector menetapkan gravity (-12) dan maxFall (10), dan script memiliki field verticalSpeed.
- Setiap frame,
verticalSpeedbertambah sebesargravitysetiap detik, dan penyelam bergerak turun sejauh nilai itu dalam pemanggilan Move yang sama dengan gerakan berjalan. - Udara memperlambat jatuh yang lama: penyelam tidak pernah jatuh lebih cepat dari
maxFallunit per detik. - Saat controller menyentuh tanah dan
verticalSpeedkurang dari 0, aturverticalSpeedmenjadi -1.
Tekan Jalankan, berjalanlah keluar dari menara, lalu tekan Periksa.
Coba sendiri
using UnityEngine;
public class Diver : MonoBehaviour
{
public float speed = 4f;
public float gravity = -12f;
public float maxFall = 10f;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
// Gravitasi: atur ulang verticalSpeed saat menyentuh tanah, tambahkan gravitasi, batasi kecepatan jatuh, lalu masukkan nilainya ke move.y
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
controller.Move(move * Time.deltaTime);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Membangun Game Sungguhan
4Scene dan Level
Muat SceneMulai Ulang LevelLevel BerikutnyaPertahankan Antar-SceneRekap: Pilih Level10Proyek: Platformer 3D
LintasanPlatform Bergerak2Tombol dan Layar
Tombol dan onClickLambdaMenghubungkan di InspectorPanel Aktif dan NonaktifBilah KesehatanRangkuman: Toko Upgrade5Menyimpan dengan PlayerPrefs
Simpan AngkaMuat dengan Nilai DefaultSkor TertinggiSimpan PengaturanUlasan: Koin di Bank8Pengendali Karakter
CharacterController.MoveGravitasi secara ManualMelompatMendorong BendaBergerak ke Arah PandanganmuUlasan: Lompatan Ganda