Menu
CoddyTech

Bắt vật phẩm tăng sức mạnh

Bài học 15 trên 19 trong khóa học Trò chơi Unity: phá gạch của Coddy.

Vật phẩm tăng sức mạnh tự nhận biết khi được bắt: collider kích hoạt của nó chạm vào collider của thanh đỡ, và cả hai vật thể đều là vật thể động học, như vậy là đủ để OnTriggerEnter chạy. Nó cũng rơi qua bóng, nên trước tiên nó kiểm tra thẻ.

Một enum đặt tên cho các loại, và mỗi prefab tự thiết lập giá trị trong Inspector, nên một script có thể dùng cho cả hai:

public enum Kind { Wide, Multiball }
public Kind kind;

if (kind == Kind.Multiball) Debug.Log("Three balls");

other.GetComponent<Paddle>() tìm script Paddle trên đối tượng mà vật phẩm tăng sức mạnh chạm vào. Hiện tại, loại Wide chỉ ghi nhật ký; bài học tiếp theo sẽ làm thanh đỡ dài ra.

challenge icon

Thử thách

Khó

Đón vật phẩm tăng sức mạnh đang rơi bằng thanh đỡ.

  1. Trong PowerUp, thêm public enum Kind { Wide, Multiball } và public Kind kind; (mỗi prefab đặt loại của nó).
  2. Thêm OnTriggerEnter(Collider other): thoát hàm nếu other.CompareTag("Paddle") không đúng; vật phẩm loại Wide gọi other.GetComponent<Paddle>().Widen();, sau đó gọi Destroy(gameObject);
  3. Trong Paddle, thêm public void Widen() để tạm thời ghi Wide paddle vào nhật ký.

Nhấn Chơi và đón một vật phẩm màu xanh lá: vật phẩm biến mất và Console hiển thị Wide paddle. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // Mặt trong của hai bức tường bên nằm tại -wallX và wallX

    Rigidbody rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float input = 0f;
        if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
        if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;

        Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
        float halfWidth = transform.localScale.x / 2f;
        target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
        rb.MovePosition(target);
    }
}

Tất cả bài học trong Trò chơi Unity: phá gạch

Tự luyện tập: Playground Unity