הפכו את זה לשלכם
שיעור 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: ערך ברירת מחדל חדש בקוד לא מועבר לרכיב שכבר נמצא בסצנה.
אתגר
קשה- ב־
GameManager, הוסףpublic TMP_Text bestText;(בסצנה הוא מוגדר ל־BestText, בפינה הימנית העליונה) ואתprivate int best;. - ב־
Start(), טען אתbestמהמפתחBestScore, עם הערך 0 אם לא נשמר דבר, והצג אותו בתורBest: 0. - ב־
GameOver(), כאשרscoreעולה עלbest, קבע אותו בתור השיא, שמור אותו תחתBestScoreוהצג אותו.
לחץ על Play, ואז לחץ על Check. לאחר מכן שחק וכוונן את tick, speedUp ואת minTick עד שהמשחק ירגיש לך מתאים.
נסו בעצמכם
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)];
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.