Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 1 / 0
Регистрация: 05.09.2022
Сообщений: 51
1

Метод в скриптах мешает друг другу

07.09.2022, 00:23. Показов 464. Ответов 9

Author24 — интернет-сервис помощи студентам
Здравствуйте.Простите за тупой вопрос, но я совсем зеленый в этом. Есть два скрипта (Меню и Записки) Стоят на разных Canvas.
Оба вызывают методы "Cursor.lockState и Time.timeScale". И как я понял мешают друг-другу.

В скрипте меню сказанно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (Input.GetKeyDown(keyMenuPaused))
        {
            isMenuPaused = !isMenuPaused;
        }
 
        if (isMenuPaused)
        {
            menuPaused.SetActive(true);
            Cursor.lockState = CursorLockMode.None;
            Time.timeScale = 0f;
            AudioListener.volume = 0f;
 
        }
        else
        {
            menuPaused.SetActive(false);
            Cursor.lockState = CursorLockMode.Locked;
            Time.timeScale = 1f;
            AudioListener.volume = 1f;
 
        }
Если при выходе из меню нажат "Esc" значит "Игра не на паузе"
Но в Canvas с Запиской я заставляю игру уйти в паузу и показать курсор. И как я понял строчки из скрипта Меню
C#
1
2
Cursor.lockState = CursorLockMode.Locked;
               Time.timeScale = 1f;
не дают этого сделать.
Как решить такое? В интернете нечего не нашел о конфликте скриптов
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.09.2022, 00:23
Ответы с готовыми решениями:

Статистическая переменная и метод друг другу мешают. Как все исправить?
Привет! У меня вопрос. Есть главный класс и дополнительный класс к этому классу. В главном классе...

Все ли подходит друг другу?
Процессор Intel Core i5-6600K Tray Охлаждения DEEP COOL GAMMAXX S40 Материнская плата ASUS Z170...

Равны ли строки друг другу
Пользователь вводит две строки если они равны друг другу значит вывести YES иначе NO

Все ли подходит друг к другу?
Всем привет, собственно, сабж Прошу оценить совместимость компонентов, в первую очередь на...

Притяжение тел друг к другу
Гравитон – «кирпичик», из которых складывается весь материальный мир. Гравитоны генерируются...

9
3353 / 1769 / 1025
Регистрация: 26.10.2018
Сообщений: 5,198
07.09.2022, 00:51 2
Просто не делай это в апдейте или допиши else (записки_неактивны).
0
891 / 161 / 84
Регистрация: 30.07.2022
Сообщений: 1,386
Записей в блоге: 4
07.09.2022, 01:19 3
Bles9, Доброго времени!
Просто управление временем и курсором вынесите в отдельный скрипт.
Я бы сделал так!
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*Unity 2020.3.26f1 personal <DX11>*/
 
using UnityEngine;
 
public class CursorLocking : MonoBehaviour
{
    private bool _lock = true;
    private KeyCode _keyCode = KeyCode.T;// кнопка паузы
 
    private void Start()
    {
        LockCursor(_lock);
    }
 
    private void Update()
    {
        if (Input.GetKeyDown(_keyCode))
        {
            _lock = !_lock;
            Pause(_lock);
            LockCursor(_lock);
        }
    }
 
    private void Pause(bool pause) => Time.timeScale = pause ? 1.0f : 0.0f;
 
    private void LockCursor(bool offCursor) => Cursor.lockState = offCursor ? CursorLockMode.Locked : CursorLockMode.None;
}
0
2 / 1 / 0
Регистрация: 05.09.2022
Сообщений: 51
07.09.2022, 04:22  [ТС] 4
devillived, Вы просто чародей) Обалдеть, заработало. Могу и записками пользоваться и меню. Но как при закрытии меню всё вернуть обратно? Бо меню закрыто и всё стоит на паузе и курсор показывается

Добавлено через 19 минут
1max1, я делал в "void ActiveMenu" а его уже в Ubdate вызвал.
А как правильно записки в исключения добавить в else? Название их скрипта дописать в else?
0
891 / 161 / 84
Регистрация: 30.07.2022
Сообщений: 1,386
Записей в блоге: 4
07.09.2022, 04:36 5
Bles9, исправить и дописать это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    private void Update()
    {
        if (Input.GetKeyDown(_keyCode))
        {
           IsLock();
        }
    }
    public void IsLock() 
    {
            _lock = !_lock;
            Pause(_lock);
            LockCursor(_lock);
    }
затем поместить на кнопку "закрыть меню" в поле OnClick объект с этим скриптом и из выпадающего меню выбрать CursorLocking => IsLock()

тогда при закрытии меню сработает этот метод, снимет паузу и спрячет курсор.
0
2 / 1 / 0
Регистрация: 05.09.2022
Сообщений: 51
07.09.2022, 16:46  [ТС] 6
devillived, Не получается. Сделал как вы и написали. Но что-то явно неправильно делаю. Из своего скрипта "меню" удалил строчки связанные с временем и курсором. Всавил ваш код в новый скрипт, кинул его на Canvas со скриптом "меню". Сейчас после выхода из меню игра запускается, курсора нет, но и в самом меню курсора нет, я и не смог проверить кнопку "Continue(выход из игры)" через OnClick.

В обоих скриптах вход/выход через Escape.

Вот ваш скрипт который я вставил:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CursorLocking : MonoBehaviour
{
      private bool _lock = true;
      private KeyCode _keyCode = KeyCode.Escape;// кнопка паузы
 
    private void Start()
    {
        LockCursor(_lock);
    }
 
    private void Update()
    {
        if (Input.GetKeyDown(_keyCode))
        {
            _lock = !_lock;
            Pause(_lock);
            LockCursor(_lock);
            IsLock();
        }
    }
 
    public void IsLock() 
    {
            _lock = !_lock;
            Pause(_lock);
            LockCursor(_lock);
    }
 
    private void Pause(bool pause) => Time.timeScale = pause ? 1.0f : 0.0f;
 
    private void LockCursor(bool offCursor) => Cursor.lockState = offCursor ? CursorLockMode.Locked : CursorLockMode.None;
 
}



Вот мой с меню:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MenuPaused : MonoBehaviour
{
    public GameObject menuPaused;
    [SerializeField] KeyCode keyMenuPaused;
    bool isMenuPaused = false;
 
    private void Start()
    {
        menuPaused.SetActive(false);
    }
 
    private void Update()
    {
       if (Input.GetKeyDown(keyMenuPaused))
        {
            isMenuPaused = !isMenuPaused;
        }
 
        if (isMenuPaused)
        {
            menuPaused.SetActive(true);
          
            AudioListener.volume = 0f;
        }
 
        else
        {
            menuPaused.SetActive(false);
           
            AudioListener.volume = 1f;
        }     
    } 
  
  private void MunePausedContinue()
    {
     isMenuPaused = false;
    }
  
    public void ExitGame()
    {
    Debug.Log("Игра закрылась");
    Application.Quit();
    }
}
0
891 / 161 / 84
Регистрация: 30.07.2022
Сообщений: 1,386
Записей в блоге: 4
07.09.2022, 18:18 7
Bles9, в скрипте CursorLocking
у меня
C#
1
2
3
4
5
6
7
private void Update()
    {
        if (Input.GetKeyDown(_keyCode))
        {
           IsLock();
        }
    }
у вас
C#
1
2
3
4
5
6
7
8
9
10
private void Update()
    {
        if (Input.GetKeyDown(_keyCode))
        {
            _lock = !_lock;//лишнее
            Pause(_lock);//лишнее
            LockCursor(_lock);//лишнее
            IsLock();//праввильное
        }
    }
в результате _lock = !_lock; срабатывает дважды ВЫКЛ\ВКЛ и все остается включенным.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MenuPaused : MonoBehaviour
{
    public GameObject menuPaused;
    [SerializeField] KeyCode keyMenuPaused;
    bool isMenuPaused = false;
 
public CursorLocking CL; //новая строка<============================
 
    private void Start()
    {
        menuPaused.SetActive(false);
    }
 
    private void Update()
    {
       if (Input.GetKeyDown(keyMenuPaused))
        {
            isMenuPaused = !isMenuPaused;
            CL.IsLock();  //новая строка<============================
        }
 
        if (isMenuPaused)
        {
            menuPaused.SetActive(true);
          
            AudioListener.volume = 0f;
        }
 
        else
        {
            menuPaused.SetActive(false);
           
            AudioListener.volume = 1f;
        }     
    } 
  
  private void MunePausedContinue()
    {
     isMenuPaused = false;
    }
  
    public void ExitGame()
    {
    Debug.Log("Игра закрылась");
    Application.Quit();
    }
}
вроде должно работать.

проблема в "архитектуре" проекта. Вам по большому счету надо бы Events использовать. А не жесткую привязку к скриптам.

А так только на "костылях" далеко не уедешь.
0
2 / 1 / 0
Регистрация: 05.09.2022
Сообщений: 51
07.09.2022, 19:11  [ТС] 8
devillived, да я олень в этом, месяц назад скачал Юнити и пытаюсь что-то построить. Events знаю только в меню анимаций. Остальное не изучил еще.

Я сейчас прям отсюда скопировал код, отключил вообще все скрипты в игре кроме этих.
Они оба на Convas в меню скрипта CL добавил Convas на котором оба скрипта.
И сейчас вообще не работают эти функции в меню: курсор и время
Миниатюры
Метод в скриптах мешает друг другу  
0
2 / 1 / 0
Регистрация: 05.09.2022
Сообщений: 51
07.09.2022, 20:10  [ТС] 9
devillived,

Нашел такой вариант в интернете. Вроде пока работает как надо. Методы Курсора и Времени в скриптах не пересекаются и не мешают друг-другу.
Как обезьянка переписал с экрана, я кода не знаю совсем и как оно работает, но работает

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class MenuPaused : MonoBehaviour
{
    public GameObject menuPaused;
    [SerializeField] KeyCode keyMenuPaused;
    public static bool isMenuPaused = false;
 
    
    
  void Update()
     {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (isMenuPaused)
            {
                Resume();
            }
            else
            {
                Pause();
            }
        }
    }
    
 
      public void Resume()
    {
        menuPaused.SetActive(false);
        Time.timeScale = 1f;
        isMenuPaused = false;
        AudioListener.volume = 1f;
        Cursor.lockState = CursorLockMode.Locked;
    }
 
    public void Pause()
    {
        menuPaused.SetActive(true);
        Time.timeScale = 0f;
        isMenuPaused = true;
        AudioListener.volume = 0f;
        Cursor.lockState = CursorLockMode.None;
    }
 
    private void Start()
    {
        menuPaused.SetActive(false);
    }
  
  private void MunePausedContinue()
    {
     isMenuPaused = false;
    }
 
    public void ExitGame()
    {
    Debug.Log("Игра закрылась");
    Application.Quit();
    }
}
0
Сын моей мамы
206 / 140 / 66
Регистрация: 09.05.2020
Сообщений: 733
07.09.2022, 21:33 10
Bles9, что именно не понятно?
0
07.09.2022, 21:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.09.2022, 21:33
Помогаю со студенческими работами здесь

таймеры мешают друг другу?
Коллеги задействую два таймера в программе. stm32f103, 72 МГц...

Подойдут ли к друг другу комплектующие?
Здравствуйте, пытаюсь апгрейдить свой 8-летний ПК, вот подобрал некоторые комплектующие: ОЗУ:...

Подходят комплектующие к друг другу?
Подходят комплектующие к друг другу? И нормальный ли это комп? ...

Привязка 2 окон друг к другу
Всем привет, вот задался таким вопросом, есть основное диалоговое окно, есть немодальное окно...

Привязка селекторов друг к другу
Здравствуйте! $('#production_1, #production_2, #production_3, #production_4').submit(function...

Подойдут ли RAM друг к другу
Всем привет! Возник вопрос будут ли работать вместе 2 планки памяти. Сам мало чего понимаю, просто...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru