using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
[DefaultExecutionOrder(-1)]
public class GameManager : MonoBehaviour.
{
public static GameManager Instance { get; private set; }
public float initialGameSpeed = 5f;
public float gameSpeedIncrease = 0.1f;
public float gameSpeed { get; private set; }
[SerializeField] private Text scoreText;
[SerializeField] private Text hiscoreText;
[SerializeField] private Text gameOverText;
[SerializeField] private Button retryButton;
private Player player;
private BarrierSpawner spawner;
private float score;
public float Score => score;
private void Awake()
{
if (Instance != null) {
DestroyImmediate(gameObject);
} else {
Instance = this;
}
}
private void OnDestroy()
{
if (Instance == this) {
Instance = null;
}
}
private void Start()
{
player = FindObjectOfType<Player>();
spawner = FindObjectOfType<BarrierSpawner>();
NewGame();
}
public void GameOver()
{
gameSpeed = 0f;
enabled = false;
player.gameObject.SetActive(false);
spawner.gameObject.SetActive(false);
gameOverText.gameObject.SetActive(true);
retryButton.gameObject.SetActive(true);
UpdateHiscore();
}
public void NewGame()
{
BarrierMove[] obstacles = FindObjectsOfType<BarrierMove>();
foreach (var obstacle in obstacles) {
Destroy(obstacle.gameObject);
}
score = 0f;
gameSpeed = initialGameSpeed;
enabled = true;
player.gameObject.SetActive(true);
spawner.gameObject.SetActive(true);
gameOverText.gameObject.SetActive(false);
retryButton .gameObject.SetActive(false);
UpdateHiscore();
}
private void Update()
{
gameSpeed += gameSpeedIncrease * Time.deltaTime;
score += gameSpeed * Time.deltaTime;
scoreText.text = Mathf.FloorToInt(score).ToString("D5");
}
private void UpdateHiscore()
{
float hiscore = PlayerPrefs.GetFloat("hiscore", 0);
if (score > hiscore)
{
hiscore = score;
PlayerPrefs.SetFloat("hiscore", hiscore);
}
hiscoreText.text = Mathf.FloorToInt(hiscore).ToString("D5");
}
}
Hocam NewGame fonksiyonu Restart butonunda çalışyor.Ben mi körüm anlamadım ama restart butonunun kodlarını görebilir miyim?
Büyük ihtimalle Time 0'a eşit kalıyor.
Game speed kısmını 5 yapıp dener misiniz?Hocam NewGame fonksiyonu Restart butonunda çalışyor.
Yaptım hocam. Oyun hızı arttı doğal olarakda hala sorun var. Yani basınca score vs. herşey duruyor obje spawn olmuyor.Game speed kısmını 5 yapıp dener misiniz?
gameSpeed = initialGameSpeed; yazdığınız yeri gameSpeed = 5f; olarak değiştirin belki düzelir.
using UnityEngine;
using UnityEngine.SceneManagement;
public class RestartGame : MonoBehaviour
{
public void Restart()
{
// Aktif sahnenin adını alır ve sahneyi yeniden yükler
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
public void GameOver()
{
gameSpeed = 0f;
// enabled = false; // Bu satırı kaldırın.
player.gameObject.SetActive(false);
spawner.gameObject.SetActive(false);
gameOverText.gameObject.SetActive(true);
retryButton.gameObject.SetActive(true);
UpdateHiscore();
}
public void NewGame()
{
// Sahneyi yeniden yükleyerek oyunu yeniden başlatın.
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
Hocam denedim de bu seferde restart butonları vs. hep açık kaldı. Onu temas ile halletmeyi deniyeceğim birde.Hmm o zaman şöyle yapalım. Yapay zekaya kod yazdırdım bunu kullanalım restart için.
Direk sahneyi baştan yükleyeceği için daha temiz olabilir diye düşünüyorum.
C#:using UnityEngine; using UnityEngine.SceneManagement; public class RestartGame : MonoBehaviour { public void Restart() { // Aktif sahnenin adını alır ve sahneyi yeniden yükler SceneManager.LoadScene(SceneManager.GetActiveScene().name); } }
Bu kod parçasını, oyununuzdaki bir butona atayarak kullanabilirsiniz. Butona tıklandığında Restart fonksiyonu çağrılacak ve oyun yeniden başlatılacaktır. Kodu kullanmak için Unity editöründe bir C# scripti oluşturun ve bu kodu içine yapıştırın. Daha sonra bu scripti bir GameObject'e (örneğin, bir buton) atayın ve butonun onClick Event'ine bu scriptin Restart fonksiyonunu ekleyin. Veya aşağıdaki gibi yapın:
@efew0
Kodunuzda GameOver fonksiyonunda gameSpeed sıfıra ayarlanıyor ve enabled değişkeni false olarak değiştiriliyor. Bu, Update metodunun daha fazla çalışmasını engelliyor ve dolayısıyla zamanın durmasına neden oluyor. Oyunu yeniden başlatmak için NewGame fonksiyonunu çağırdığınızda, enabled değişkenini tekrar true yapmanız gerekiyor. Ayrıca, SceneManager. LoadScene metodunu kullanarak sahneyi yeniden yüklemeniz, oyunun tamamen yeniden başlamasını sağlayacaktır.
İşte düzeltilmiş NewGame ve GameOver fonksiyonları:
C#:public void GameOver() { gameSpeed = 0f; // enabled = false; // Bu satırı kaldırın. player.gameObject.SetActive(false); spawner.gameObject.SetActive(false); gameOverText.gameObject.SetActive(true); retryButton.gameObject.SetActive(true); UpdateHiscore(); } public void NewGame() { // Sahneyi yeniden yükleyerek oyunu yeniden başlatın. SceneManager.LoadScene(SceneManager.GetActiveScene().name); }
Bu değişikliklerle, NewGame fonksiyonu sahneyi yeniden yükleyecek ve tüm oyun objeleri başlangıç durumlarına dönecektir. Böylece oyununuzun zamanı da sıfırlanmış olacak. Eğer oyununuzda sahne yeniden yüklenmesi istenmiyorsa, enabled değişkenini true yapmayı unutmayın. Sizin kodunuzdaki ilgili bölümleri benim verdiklerimle düzeltirseniz sorun çözülecektir diye düşünüyorum.
public void GameOver()
{
gameSpeed = 0f;
// enabled = false; // Bu satırı kaldırın.
player.gameObject.SetActive(false);
spawner.gameObject.SetActive(false);
gameOverText.gameObject.SetActive(true);
retryButton.gameObject.SetActive(true);
UpdateHiscore();
}
public void NewGame()
{
// Sahneyi yeniden yükleyerek oyunu yeniden başlatın.
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
Aynı şekilde yaptım. İlkdekini yaptım sadece birleştirdim fakat değişen olmadı. 2.olanıda denedim direkt kopyaladım. Çalışmadı oda buton hep ekranda kaldı ve işlem yapmıyor.Verdiğim yerdeki kodları sizinkiyle değiştirip denediniz mi bir de? 2. olarak sonradan yazdığımı.
Büyük ihtimalle Time 0'a eşit kalıyor.
Çalışmadı oda buton hep ekranda kaldı ve işlem yapmıyor.