Menu
CoddyTech

Platforma Bin

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 51 / 60.

Bir CharacterController, üzerinde durduğu şey tarafından taşınmaz: hareketli bir platformda olduğu yerde kalır ve platform altından kayıp gider. transform.position değerini değiştirmek işe yaramaz; çünkü sonraki Move, fiziğin onu en son gördüğü konumdan başlar ve değişikliği geri alır.

Bu yüzden oyuncu, platformun hareketini kendi hareketine ekler. OnControllerColliderHit(ControllerColliderHit hit), Move işleminin temas ettiği her çarpıştırıcı için çalışır; alttan gelen bir çarpışmada hit.normal.y değeri 1'e yakındır. Bir kasayı aynı şekilde taşıyan bir feribot:

private Ferry ferry;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
    {
        ferry = f;
    }
}
challenge icon

Görev

Orta

Oyuncunun hareketli platforma binmesini sağla.

  1. Player içinde private MovingPlatform platform; ve OnControllerColliderHit ekle: hit.normal.y > 0.5f olduğunda ve nesnede bir MovingPlatform bulunduğunda, onu platform içinde tut.
  2. Update() içinde (move + velocity) * Time.deltaTime ifadesini Vector3 motion içine koy. platform != null ise platform.delta ekle ve platform = null olarak ayarla.
  3. controller.Move(motion) çağrısını yap.

“Oyna” düğmesine bas ve platformun üzerine zıpla: platform seni taşır. Ardından “Kontrol et”.

Kendin dene

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);
    }
}

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground