Menu
CoddyTech

Nam châm

Bài học 14 trên 21 trong khóa học Trò chơi Unity: đường đua trên trời của Coddy.

Các vật phẩm tăng sức mạnh khiến mỗi lượt chơi có cảm giác khác với lượt trước. Vật phẩm đầu tiên là nam châm: trong 8 giây, mọi đồng xu gần nhân vật chạy sẽ bay về phía nhân vật.

Runner lưu thời gian còn lại trong magnet và đếm ngược. Mỗi đồng xu hướng về phía nhân vật chạy, và khi nam châm đang hoạt động, đồng thời nhân vật ở gần, đồng xu sẽ di chuyển về phía nhân vật:

if (runner.magnet > 0f && Vector3.Distance(transform.position, runner.transform.position) < pullRange)
{
    transform.position = Vector3.MoveTowards(transform.position, runner.transform.position, pullSpeed * Time.deltaTime);
}

Đồng xu bay vào nhân vật chạy, rồi vùng kích hoạt của nó sẽ xử lý phần còn lại. Thỉnh thoảng, một đoạn đường sẽ có vật phẩm nam châm màu hồng, cách chướng ngại vật 6 đơn vị.

challenge icon

Thử thách

Dễ

Nam châm hút những đồng xu ở gần về phía người chạy.

  1. Runner: thêm magnetTime = 8f và magnet; giảm dần giá trị magnet khi nó lớn hơn 0.
  2. Thẻ Magnet đặt magnet = magnetTime và hủy vật phẩm nhặt được.
  3. Coin: thêm pullRange = 7f và pullSpeed = 30f, rồi hút xu như trên.
  4. Road.Fill: với float roll = Random.value;, đặt magnetPrefab ở một làn ngẫu nhiên tại y 1, z -6 khi roll < 0.06f.

Nhấn Chơi và nhặt nam châm màu hồng: xu sẽ bay về phía bạn. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 16f;
    public float jumpHeight = 1.6f;
    public float gravity = -40f;
    public float slideTime = 0.7f;

    public int lane;

    private CharacterController controller;
    private GameManager game;
    private float fallSpeed;
    private float slide;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        game = FindFirstObjectByType<GameManager>();
    }

    void Update()
    {
        if (!game.over)
        {
            if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
            if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
            bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
            if (jump && controller.isGrounded)
            {
                fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
                StopSlide();
            }
            if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
            {
                slide = slideTime;
                Resize(0.5f);
            }
        }

        if (slide > 0f)
        {
            slide -= Time.deltaTime;
            if (slide <= 0f) StopSlide();
        }

        if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
        fallSpeed += gravity * Time.deltaTime;

        float targetX = lane * laneWidth;
        float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
        Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
        controller.Move(move);
    }

    void StopSlide()
    {
        if (transform.localScale.y < 1f) Resize(1f);
        slide = 0f;
    }

    void Resize(float height)
    {
        controller.enabled = false;
        transform.position += Vector3.up * (height - transform.localScale.y);
        transform.localScale = new Vector3(1f, height, 1f);
        controller.enabled = true;
    }

    void OnTriggerEnter(Collider other)
    {
        if (game.over) return;
        if (other.CompareTag("Obstacle"))
        {
            game.GameOver();
        }
        else if (other.CompareTag("Coin"))
        {
            game.AddCoin();
            Destroy(other.gameObject);
        }
    }
}

Tất cả bài học trong Trò chơi Unity: đường đua trên trời

Tự luyện tập: Playground Unity