Po włączeniu menu podczas gry, czas się nie zatrzymuje (Unity)

0

Witam ponownie. Ostatnio napisałem skrypt, żeby wyświetlić takie testowe menu podczas rozgrywki. I podczas wyświetlania tego menu, chciałem, aby czas przestał płynąć. Podam poniżej kod, który odpowiada za to. Z góry dzięki za pomoc.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InGameMenu : MonoBehaviour
{

    private bool gamePaused = false;


    void Update()
    {
    
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (gamePaused)
            {
                Time.timeScale = 1;
                gamePaused = false;
            }
            else
            {
                Time.timeScale = 0;
                gamePaused = true;
            }
        }
    }

    void OnGUI()
    {
        if (gamePaused)
        {
            Color background = Color.black;
            background.a = 0.3f;
            DrawQuad(new Rect(0, 0, Screen.width, Screen.height), background);

         
            if (GUI.Button(new Rect(Screen.width / 2 - 50, 20, 100, 20), "Play"))
            {
              
            }

            if (GUI.Button(new Rect(Screen.width / 2 - 50, 50, 100, 20), "Score"))
            {

            }

            if (GUI.Button(new Rect(Screen.width / 2 - 50, 80, 100, 20), "Quit"))
            {

            }
        }
    }


    void DrawQuad(Rect position, Color color)
    {
      
        Texture2D texture = new Texture2D(1, 1);
        texture.SetPixel(0, 0, color);
        texture.Apply();
        GUI.skin.box.normal.background = texture;
        GUI.Box(position, GUIContent.none);
    }
}

2

Jak czas wpływa na obiekty w Twojej grze?

W swoich skryptach korzystasz z Time.deltaTime, czy Time.unscaledDeltaTime?
W coroutines korzystasz z WaitForSeconds(), czy WaitForSecondsRealtime()?

Animator też może mieć wybrane, żeby działał w nieskalowanym czasie, więc można sprawdzić...

Sprawdź też, korzystając z Debug.Log, czy na pewno timeScale jest ustawiany tylko raz i czy jego wartość jest taka jak się spodziewasz.

Na razie mogę Ci napisać, że "u mnie działa" :D W ten sposób da się zatrzymać działanie gry korzystającej ze zwykłego deltaTime.

A tak poza tym, polecam skorzystać z GUI przygotowanego w edytorze ;) Po to mamy narzędzia, żeby ich używać.

Pokazywanie GUI mógłbyś wtedy robić metodą uiGameObject.SetActive(true);. Tylko naturalnie uiGameObject pownien być nieaktywnym dzieckiem aktywnego obiektu ze skryptem, bo niektywny Update nie będzie się wykonywał.

0

Jeśli chodzi o obiekty - timeScale ani trochę na nie nie wpłynął (ruszają się jak się ruszały).
Spróbowałem też DebugLogiem to zrobić i tu mnie trochę coś zdziwiło - otóż ciągle wartości zmieniały mi się same, niezależnie od tego czy menu było włączone czy nie. Cały czas było coś takiego
"
0
1
0
1
0
1
1
"
(Tak wyglądały logi mniej więcej). Przez chwilę wcześniej też działało, ale nagle coś się pokopało i nie działa. A skryptu nie dotykałem.

Z klasą UI też pracuję i próbowałem z nią zrobić to menu. Też tak samo.

1

W jaki sposób poruszasz obiektami?
Jeśli nie przemnażasz wektoru przemieszczania przez Time.deltaTime, to obiekty będą się one przemieszczały o daną wartość w każdej klatce - prędkość zależy wtedy od ilości klatek na sekundę - tego i tak nie chcemy!
Update wykonuje się niezależnie od timeScale. Ale w tym Update powinieneś przemieszczać obiekt w taki sposób:

transform.position += velocity * Time.deltaTime;

1 użytkowników online, w tym zalogowanych: 0, gości: 1