Tùy chỉnh theo ý bạn
Bài học 14 trên 14 trong khóa học Game Unity: rắn 3D của Coddy.
Còn một tính năng nữa: lưu điểm cao nhất ngay cả khi bạn đóng trò chơi. PlayerPrefs sẽ lưu điểm này: đọc điểm với giá trị mặc định trong Start(), rồi lưu khi trò chơi kết thúc nếu điểm số vượt qua điểm cao nhất. Trong trò chơi đua xe, điểm vòng đua tốt nhất được tính theo cách ngược lại, vì thời gian càng thấp càng tốt:
if (lapTime < bestLap)
{
bestLap = lapTime;
PlayerPrefs.SetFloat("BestLap", bestLap);
}Sau đó, bạn có thể tùy chỉnh trò chơi theo ý mình. Các giá trị trong Snake quyết định cảm giác chơi: đặt tick thành 0.25 để bắt đầu chậm rãi hoặc 0.1 để bắt đầu nhanh, đặt speedUp thành 0.01 để rắn tăng tốc sớm hơn, và đặt minTick thành 0.05 để đoạn cuối trò chơi trở nên gay cấn. Trong trình chỉnh sửa này, bạn chỉ có thể xem Inspector, còn cảnh của khóa học giữ nguyên ba trường này theo các giá trị trong code. Vì vậy, hãy thay đổi chúng ở nơi khai báo rồi nhấn Play. Trong dự án Unity của riêng mình, bạn hãy thay đổi chúng trên thành phần Snake trong Inspector: giá trị mặc định mới trong code sẽ không cập nhật thành phần đã có trong một cảnh.
Thử thách
KhóGiữ điểm cao nhất qua các ván chơi, rồi tinh chỉnh trò chơi.
- Trong
GameManager, thêmpublic TMP_Text bestText;vàprivate int best; - Trong
Start(), dùngbest = PlayerPrefs.GetInt("BestScore", 0);rồi hiển thị"Best: " + best. - Trong
GameOver(), khi điểm số cao hơn điểm cao nhất, hãy cập nhật best, lưu điểm đó với khóaBestScorerồi hiển thị. - Tinh chỉnh
tick,speedUpvàminTicktại nơi khai báo chúng trong Snake.
Nhấn Chơi, lập điểm cao nhất rồi chơi lại: Best vẫn nằm ở góc trên bên phải. Sau đó nhấn Kiểm tra.
Tự làm thử
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)];
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Game Unity: rắn 3D
Tự luyện tập: Playground Unity