Naik Platform
Termasuk bagian Membangun Game Sungguhan dalam perjalanan Unity di Coddy. Pelajaran 51 dari 60.
CharacterController tidak ikut terbawa oleh pijakan tempatnya berdiri: di atas platform bergerak, CharacterController tetap di tempat dan platform bergeser menjauh di bawahnya. Mengubah transform.position tidak membantu, karena pemanggilan Move berikutnya dimulai dari posisi yang terakhir kali diketahui fisika dan membatalkan perubahan tersebut.
Jadi, pemain menambahkan gerakan platform ke gerakannya sendiri. OnControllerColliderHit(ControllerColliderHit hit) berjalan untuk setiap collider yang disentuh oleh Move; benturan dari bawah memiliki hit.normal.y yang mendekati 1. Feri yang membawa peti dengan cara yang sama:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Tantangan
SedangBuat pemain menumpang di platform yang bergerak.
- Di
Player, tambahkanprivate MovingPlatform platform;danOnControllerColliderHit: saathit.normal.y > 0.5fdan objek memilikiMovingPlatform, simpan objek itu diplatform. - Di
Update(), masukkan(move + velocity) * Time.deltaTimekeVector3 motion. Jikaplatform != null, tambahkanplatform.deltadan tetapkanplatform = null. - Panggil
controller.Move(motion).
Tekan tombol “Main” dan lompat ke platform: platform itu akan membawamu. Lalu tekan tombol “Periksa”.
Coba sendiri
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
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 BankLatihan sendiri: Playground Unity