Đi trên bệ
Thuộc phần Xây dựng trò chơi thực tế trong hành trình Unity của Coddy. Bài học 51 trên 60.
CharacterController không di chuyển theo bề mặt mà nó đứng trên: khi đứng trên một bệ di động, nó vẫn đứng yên tại chỗ, còn bệ trượt đi bên dưới. Thay đổi transform.position không giúp ích, vì lần gọi Move tiếp theo bắt đầu từ vị trí mà hệ thống vật lý ghi nhận lần trước và hoàn tác thay đổi đó.
Vì vậy, nhân vật cộng chuyển động của bệ vào chuyển động của chính mình. OnControllerColliderHit(ControllerColliderHit hit) chạy cho từng collider mà Move chạm vào; một va chạm từ bên dưới có hit.normal.y gần bằng 1. Một chiếc phà chở thùng hàng theo cách tương tự:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Thử thách
Trung bìnhGiúp nhân vật di chuyển trên bục di động.
- Trong
Player, thêmprivate MovingPlatform platform;vàOnControllerColliderHit: khihit.normal.y > 0.5fvà đối tượng cóMovingPlatform, hãy lưu đối tượng đó vàoplatform. - Trong
Update(), đặt(move + velocity) * Time.deltaTimevàoVector3 motion. Nếuplatform != null, hãy cộngplatform.deltavà đặtplatform = null. - Gọi
controller.Move(motion).
Nhấn Chơi rồi nhảy lên bục di động: bục sẽ đưa bạn đi. Sau đó, nhấn Kiểm tra.
Tự làm thử
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);
}
}
Tất cả bài học trong Xây dựng trò chơi thực tế
1Văn bản trên màn hình
Canvas và văn bảnHiển thị điểm sốĐịnh dạng sốĐồng hồ đếm ngượcÔn tập: Đồng hồ tốc độ7Điều khiển thời gian
Tạm dừng bằng timeScaleChuyển động chậmThời gian không bị co giãnÔn tập: Bullet Time10Dự án: trò chơi đi cảnh 3D
Đường đuaBệ di chuyển2Nút bấm và màn hình
Nút bấm và onClickLambdaKết nối trong InspectorBật và tắt bảngThanh máuÔn tập: Cửa hàng nâng cấp5Lưu dữ liệu với PlayerPrefs
Lưu một sốTải với giá trị mặc địnhĐiểm cao nhấtLưu cài đặtÔn tập: Tiền xu trong ngân hàngTự luyện tập: Playground Unity