Mendorong Benda
Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 41 dari 60.
CharacterController tidak pernah mendorong apa pun: gerakkan hingga menabrak peti dengan Rigidbody, lalu CharacterController akan berhenti seolah-olah menabrak dinding. Sebaliknya, Unity memanggil OnControllerColliderHit(ControllerColliderHit hit) pada skrip milik controller untuk setiap collider yang disentuh oleh Move, termasuk lantai, lalu skrip menentukan apa yang terjadi. hit.collider adalah objek yang tersentuh, hit.moveDirection adalah arah Move yang menyentuhnya, dan hit.normal adalah arah yang dihadapi permukaannya di titik kontak. Berikut skrip dorong bawaan Unity:
public float pushPower = 2f;
void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (body == null || body.isKinematic) return; // tidak ada yang bisa didorong
if (hit.moveDirection.y < -0.3f) return; // benda itu berada di bawah kaki kita
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0f, hit.moveDirection.z);
body.linearVelocity = pushDir * pushPower;
}Setiap return punya alasan. Lantai dan dinding tidak memiliki Rigidbody, jadi body bernilai null untuk keduanya, dan keduanya tersentuh pada hampir setiap Move. Benda kinematik hanya bergerak saat skripnya sendiri menggerakkannya, jadi kecepatan tidak berpengaruh padanya. Move yang arahnya sangat menurun menyentuh sesuatu di bawah kaki, dan peti tempat karakter berdiri tidak seharusnya didorong.
Arah dorong hanya menggunakan x dan z, sehingga peti meluncur di sepanjang tanah, bukan terdorong menembusnya. Menetapkan linearVelocity, alih-alih menambahkan gaya, membuat peti ringan dan peti berat bergerak dengan kecepatan yang sama; body.AddForce(pushDir * pushPower, ForceMode.Impulse) akan mendorong peti berat lebih sedikit.
Tantangan
SedangBiarkan pemain menendang bola yang ditabraknya saat berjalan.
- Di
Kicker.cs, tulisvoid OnControllerColliderHit(ControllerColliderHit hit)dan dapatkanRigidbody body = hit.collider.attachedRigidbody;. - Gunakan
returnjikabodybernilai null atau kinematic, atau jikahit.moveDirection.y < -0.3f(bola berada di bawah kaki). - Atur
body.linearVelocityke arah berjalan dengan y 0, dikalikankickPower, lalu ditambahVector3.up * lift.
Tekan tombol “Main” dan berjalanlah menabrak bola merah: bola itu melesat ke depan dan ke atas. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
public class Kicker : MonoBehaviour
{
public float kickPower = 6f;
public float lift = 4f;
// Tendang bola yang ditabrak pemain
}
Semua pelajaran di Membangun Game Sungguhan
2Tombol 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 GandaLatihan sendiri: Playground Unity