Menu
CoddyTech

הפוך אותו לשלך

שיעור 14 מתוך 14 בקורס משחק Unity: נחש תלת־ממדי של Coddy.

נותרה תכונה אחת: שיא ניקוד שנשמר גם אחרי שסוגרים את המשחק. PlayerPrefs שומר אותו: קוראים אותו עם ערך ברירת מחדל ב־Start(), ושומרים אותו בסיום המשחק כשהניקוד עולה עליו. משחק מרוצים שומר את זמן ההקפה הטוב ביותר בכיוון ההפוך, כי זמן נמוך יותר הוא טוב יותר:

if (lapTime < bestLap)
{
    bestLap = lapTime;
    PlayerPrefs.SetFloat("BestLap", bestLap);
}

עכשיו המשחק בידיך כדי לכוונן אותו. המספרים של Snake קובעים את התחושה שלו: tick בערך 0.25 יוצר התחלה רגועה, ו־0.1 התחלה מהירה; speedUp בערך 0.01 מאיץ את הנחש מוקדם יותר, ו־minTick בערך 0.05 יוצר משחק סיום קדחתני. ה־Inspector של השחקן הזה מוגדר לקריאה בלבד, והסצנה של הקורס משאירה את שלושת השדות האלה בערכים שבקוד שלך, לכן שנה אותם במקום שבו הם מוגדרים ולחץ על Play. בפרויקט Unity משלך, שנה אותם ברכיב Snake שב־Inspector: ערך ברירת מחדל חדש בקוד לא מועבר לרכיב שכבר נמצא בסצנה.

challenge icon

אתגר

קשה

שמרו על שיא בין המשחקים, ואז כווננו את המשחק.

  1. ב־GameManager, הוסיפו public TMP_Text bestText; ו־private int best;
  2. ב־Start(), הוסיפו best = PlayerPrefs.GetInt("BestScore", 0); והציגו את "Best: " + best.
  3. ב־GameOver(), כשהניקוד עולה על השיא, הגדירו את best, שמרו אותו תחת BestScore והציגו אותו.
  4. כווננו את tick, את speedUp ואת minTick במקום שבו הם מוגדרים ב־Snake.

לחצו על "שחק", קבעו שיא ושחקו שוב: השיא נשאר בפינה הימנית העליונה. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    public GameObject gameOverPanel;
    public Button playAgainButton;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        playAgainButton.onClick.AddListener(PlayAgain);
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    public void GameOver()
    {
        gameOverPanel.SetActive(true);
    }

    void PlayAgain()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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

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