Можно ли предотвратить повторный запуск игры?

Общие вопросы о Unity3D

Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 19 окт 2012, 10:28

День добрый.

Собственно вопрос: можно ли отслеживать запущена игра или нет и если уже запущена не запускать повторно, средствами Unity только.

Понимаю, что можно делать отдельный экзешник где все что в голову придет проверить, но вопрос именно можно ли с помощью юнити.

Спасибо.
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23

Re: Можно ли предотвратить повторный запуск игры?

Сообщение Kayler 19 окт 2012, 10:58

ну например заносить в player prefs
Синтаксис:
Используется csharp
void Start() {
PlayerPrefs.SetInt("GameEnable", 1);
}

и при выходе очищать
Синтаксис:
Используется csharp
void OnApplicationQuit()
        {
        PlayerPrefs.SetInt("GameEnable", 0);
    }

ну и когда заходим в игру проверяем значение
Синтаксис:
Используется csharp
if (PlayerPrefs.GetInt("GameEnable") == 1)
//выводим сообщение что игра запущена
 


но по моему такой метод очень глупый, это первое что мне пришло в голову, так как я о подобном не задумывался
Аватара пользователя
Kayler
Адепт
 
Сообщения: 1038
Зарегистрирован: 25 авг 2010, 23:49
Откуда: Чувашия

Re: Можно ли предотвратить повторный запуск игры?

Сообщение seaman 19 окт 2012, 11:19

System.Diagnostics.Process.GetProcessesByName("unity");
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Можно ли предотвратить повторный запуск игры?

Сообщение Guyver 19 окт 2012, 11:38

hint... а некоторые ещё мьютексы юзают для этого.
Xcombat: 3D шутер на летающих тарелках!
Аватара пользователя
Guyver
UNIверсал
 
Сообщения: 392
Зарегистрирован: 21 июл 2010, 08:04
Откуда: Челябинск

Re: Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 19 окт 2012, 13:16

seaman писал(а):System.Diagnostics.Process.GetProcessesByName("unity");


Что-то такое представлял.

А как быть если переименуем екзешник.
Можно имя ехе файла узнать как то?
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23

Re: Можно ли предотвратить повторный запуск игры?

Сообщение DbIMok 19 окт 2012, 15:52

можно еще ключом в ярлыке
-single-instance (Windows only)
Allow only one instance of the game to run at the time. If another instance is already running then launching it again with -single-instance will just focus the existing one.

узнать имя http://msdn.microsoft.com/ru-ru/library ... odule.aspx
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.8k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 20 окт 2012, 05:00

DbIMok писал(а):можно еще ключом в ярлыке
-single-instance (Windows only)
Allow only one instance of the game to run at the time. If another instance is already running then launching it again with -single-instance will just focus the existing one.

узнать имя http://msdn.microsoft.com/ru-ru/library ... odule.aspx


С ярлыком в моем случае не получится.

Поиграю с процессами. Спасибо.
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23

Re: Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 20 окт 2012, 09:52

seaman писал(а):System.Diagnostics.Process.GetProcessesByName("unity");


Эх, беда беда

Синтаксис:
Используется csharp

 Process p = Process.GetCurrentProcess();
        string gameName =  p.ProcessName;

        Debug.Log("== Process Name = " + gameName);

        Process[] processes = Process.GetProcessesByName(gameName);
        if (processes.Length > 0)
        {
            Debug.Log("== Processes not empty");
            foreach (Process process in processes)
            {
                Debug.Log("== executed ==" + process.ProcessName);
            }
        }
        else
        {
            Debug.Log("== Nothing ===");
        }

 


Имя ехе показывается верно.

А вот найти процесс по имени не могу. В логах ошибка

И вот тут Process[] processes = Process.GetProcessesByName(gameName);
или Process[] processes = Process.GetProcesses();
processes[0].ProcessName будет ошибка. а если processes[0].Id вызвать то всел будет ок.

Синтаксис:
Используется csharp

== Process Name = MyGame
UnityEngine.Debug:Internal_Log(Int32, String, Object)
UnityEngine.Debug:Log(Object)
Util:CheckToPreventMultipleExecutionOfTheGame()
LogoManager:Awake()
 
(Filename: C:/BuildAgent/work/842f9557127e852/Runtime/ExportGenerated/StandalonePlayer/UnityEngineDebug.cpp Line: 34)

InvalidOperationException: Process has exited, so the requested information is not available.
  at System.Diagnostics.Process.get_ProcessName () [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ProcessName ()
at System.Diagnostics.Process.GetProcessesByName (System.String processName) [0x00000] in <filename unknown>:0
at CheckToPreventMultipleExecutionOfTheGame () [0x00000] in <filename unknown>:0
at LogoManager.Awake () [0x00000] in <filename unknown>:0
 
(Filename:  Line: -1)

 
Последний раз редактировалось gameshadow 20 окт 2012, 10:08, всего редактировалось 2 раз(а).
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23

Re: Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 20 окт 2012, 09:54

Kayler писал(а):ну например заносить в player prefs
Синтаксис:
Используется csharp
void Start() {
PlayerPrefs.SetInt("GameEnable", 1);
}

и при выходе очищать
Синтаксис:
Используется csharp
void OnApplicationQuit()
        {
        PlayerPrefs.SetInt("GameEnable", 0);
    }

ну и когда заходим в игру проверяем значение
Синтаксис:
Используется csharp
if (PlayerPrefs.GetInt("GameEnable") == 1)
//выводим сообщение что игра запущена
 


но по моему такой метод очень глупый, это первое что мне пришло в голову, так как я о подобном не задумывался


Не стоит так делать. Если игра будет остановлена как-нибудь подругому то значение так в реестре и останется, а потом уже не получится запустить игру
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23

Re: Можно ли предотвратить повторный запуск игры?

Сообщение Kayler 20 окт 2012, 09:55

gameshadow писал(а):Не стоит так делать. Если игра будет остановлена как-нибудь подругому то значение так в реестре и останется, а потом уже не получится запустить игру

ежу понятно, поэтому я и говорю что глупый способ
Аватара пользователя
Kayler
Адепт
 
Сообщения: 1038
Зарегистрирован: 25 авг 2010, 23:49
Откуда: Чувашия

Re: Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 20 окт 2012, 10:26

Guyver писал(а):hint... а некоторые ещё мьютексы юзают для этого.


И так не вышло.

Синтаксис:
Используется csharp
Mutex.OpenExisting("My");
 


В визуал студио норм все. А юнити не компилирует
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23

Re: Можно ли предотвратить повторный запуск игры?

Сообщение gameshadow 20 окт 2012, 10:45

Оказалось, что не у всех процессов можно получить имя.
,Лучше обернуть в трайкетч. Имя нашего будет в списке.

Синтаксис:
Используется csharp

Process[] processes = Process.GetProcesses();
        foreach (Process process in processes)
        {
            try
            {
                    Debug.Log(">>> PID : " + process.ProcessName);
            }
            catch (Exception e)
            {
                Logger.Log("ERROR == " + e.Message);
            }
       }
 
gameshadow
UNец
 
Сообщения: 16
Зарегистрирован: 12 май 2012, 12:23


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19