Unity 2D restart butonu çalışmıyor

  • Konuyu başlatan efew0
  • Başlangıç Tarihi
  • Mesaj 10
  • Görüntüleme 112

efew0

Decipat
Katılım
25 Eylül 2022
Mesajlar
1.545
Makaleler
2
Çözümler
7
Yer
Kocaeli
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

Videodaki gibi restart butonuna basınca ne skor çalışıyor ne de nesne geliyor. Bende anlamadım. Bayağıdır uğraşıyorum. Restart butonunun Click alanındaki çalışan kod. Newgame fonksiyonu seçili koddur.

C#:
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");
 }

}
 
Son düzenleyen: Moderatör:
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.
 
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.
 
Son düzenleme:
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.
Hocam denedim de bu seferde restart butonları vs. hep açık kaldı. Onu temas ile halletmeyi deniyeceğim birde.
 
Verdiğim yerdeki kodları sizinkiyle değiştirip denediniz mi bir de? 2. olarak sonradan yazdığımı.
Şundan bahsediyorum

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

Böyle düzelmesi gerekirdi. Bilemedim.
 
Verdiğim yerdeki kodları sizinkiyle değiştirip denediniz mi bir de? 2. olarak sonradan yazdığımı.
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.

Hocam çözüldü. Cidden kafayı yemek üzereyim. Saatlerdir buna bakıyorum denemediğim şey kalmadı. Meğersem en başta denemek için playerdaki temas kodunda TimeScale'i 0 yapmıştım. O şekilde unutmuşum. TimeScale'yi silince düzeldi. Herşey çalışıyor.
 
Son düzenleme:
Büyük ihtimalle Time 0'a eşit kalıyor.

En başta tahmin etmiştim Time'ın 0 olduğunu. :D

Çalışmadı oda buton hep ekranda kaldı ve işlem yapmıyor.

Time 0 ya ondan öyle oldu hocam. Güzel bari çözüldüyse. İyi çalışmalar :D
Böyle sorunların olursa tekrardan etiketleyebilirsin Unity ile uğraşmayı seviyorum bende.
 

Geri
Yukarı