Menu
CoddyTech

מטבעות

שיעור 13 מתוך 20 בקורס משחק Unity: נתיבי שמיים של Coddy.

מטבעות נותנים לשחקן סיבה להחליף נתיב כשאין שום דבר בדרך. בכל קטע יש שורה של ארבעה מטבעות בנתיב אחד, אחרי המכשולים שלו, במיקומים 4, 7, 10 ו־13 לאורך הקטע וב־y 1.

המטבע מסתובב בעצמו, באמצעות סקריפט משלו:

void Update()
{
    transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}

ה־prefab של המטבע מונח על צדו, ולכן ציר ה־z שלו מצביע כלפי מעלה: סיבוב סביב z מסובב אותו כמו מטבע על שולחן.

איסוף המטבעות הוא באחריות ה־Runner, באותו OnTriggerEnter: מטבע מוסיף אחד באמצעות game.AddCoin() ואז מושמד.

challenge icon

אתגר

קל
  1. ב־Coin הוסף את public float spinSpeed = 180f; ואת הפונקציה Update שלמעלה.
  2. ב־Road הוסף את coinPrefab, ובסוף Fill הצב 4 מטבעות בנתיב אקראי במיקומי z של 4f + i * 3f.
  3. ב־GameManager הוסף את public TMP_Text coinText;, את public int coins; ואת public void AddCoin() (הוסף מטבע אחד, ואז קרא ל־ShowScore()). הפונקציה ShowScore גם קובעת את coinText.text = "Coins: " + coins;.
  4. ב־Runner.OnTriggerEnter, בתוך else if (other.CompareTag("Coin")): הוסף את המטבע והשמד אותו.

נסו בעצמכם

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

כל השיעורים ביחידה משחק Unity: נתיבי שמיים

תרגלו בעצמכם: Unity אונליין