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

DontDestrouOnLoad

09.02.2018, 17:26. Показов 1800. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет

Есть объект 1 на котором висит AudioSourse. Она Play On Awake=true;
Есть объект 2 на котором висит скрипт Sounds с публичным экземпляром этой AudioSourse(ну типа public AudioSourse griby_mejdy_namy_taet_led. Сюда я перетащил объект 1. Работает. Музыка играет при старте сцены. Когда я жму "replay" музыка начинает играть заново, т.е объект 2 пересоздается

Код кнопки "replay":
"SceneManager.LoadScene(1);"

Я хочу, чтобы музыка играла независимо от того нажимаю ли я кнопку
Для этого я создал скрипт DontDestroyOnLoad и повесил его на объект 2

Код DontDestroyOnLoad:

C#
1
2
3
4
5
6
7
8
using UnityEngine;
 
public class DontDestroyOnLoad : MonoBehaviour {
 
void Start() {
DontDestroyOnLoad(this);
}
}
Проблема в том, что музыка не только начинает играть заново при нажатии на кнопку, так еще и не создается еще один экземпляр музыки, т.е скрипт DontDestroyOnLoad не работает

Подскажите пожалуйста что я делаю не так?
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
09.02.2018, 21:23 2
1.Создать пустой геймобьект, назвать SoundPlayer.
2.Добавить на геймобьект AudioSource.
3.Повесить на AudioSource нужный клип.
4.Добавить на геймобьект скрипт SoundPlayer (скопировать с поста)
5.Перетащить геймобьект в папку Assets/Resources
6.Удалить геймобьект SoundPlayer из сцены.
7. В любом скрипте в методе Start вызвать метод SoundPlayer.CreateSoundPlayer();
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SoundPlayer : MonoBehaviour
{
    private static SoundPlayer _instance;
    private AudioSource _audioSource;
 
    void Awake()
    {
        _instance = this;
    }
 
    void Start()
    {
        _audioSource = GetComponent<AudioSource>();
        _audioSource.Play();
        _audioSource.loop = true;
        DontDestroyOnLoad(this);
    }
 
 
    public static SoundPlayer CreateSoundPlayer()
    {
        if (_instance == null) {
            var player = GameObject.Instantiate(Resources.Load<GameObject>("SoundPlayer"));
            _instance = player.GetComponent<SoundPlayer>();
        }
        return _instance;
    }
    
}
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.02.2018, 19:11 3
ASDFD12, На СинглТоун не похоже чо-то. А если я где-то ещё вызову этот метод?? Или я чо-то не заметил
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
11.02.2018, 23:04 4
Цитата Сообщение от JerryLetehen Посмотреть сообщение
На СинглТоун не похоже чо-то. А если я где-то ещё вызову этот метод?? Или я чо-то не заметил
Хоть тыщу раз вызывай
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
12.02.2018, 07:06 5
ASDFD12, а чего без самоудаления при дублировании?
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
12.02.2018, 11:00 6
Цитата Сообщение от Cr0c Посмотреть сообщение
а чего без самоудаления при дублировании
а где дублирование?
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
12.02.2018, 17:31 7
ASDFD12, ну типа если их два на сцене будет-то сё - фиаска
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
12.02.2018, 20:07 8
Цитата Сообщение от JerryLetehen Посмотреть сообщение
ну типа если их два на сцене будет-то сё - фиаска
)) приведенный код не даст создать два обьекта, вот такие вот дела.
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
12.02.2018, 21:46 9
ASDFD12, но экземпляров останется два

Добавлено через 35 секунд
и при каждом запуске сцены они будут добавляться. Действительно, какие мелочи )))
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
12.02.2018, 22:49 10
Цитата Сообщение от ASDFD12 Посмотреть сообщение
не даст создать
Это если крэйтить его только с этого метода.
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
12.02.2018, 23:29 11
Цитата Сообщение от Cr0c Посмотреть сообщение
и при каждом запуске сцены они будут добавляться. Действительно, какие мелочи )))
нет!
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
12.02.2018, 23:32 12
ASDFD12, На старте стоит ДонДестройОнЛоад , то есть если в другой сцене я его вставлю - там их будет два. В Эвёйке ж нет проверки на индивидуальность. Или почему я не прав?
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
13.02.2018, 00:00 13
ASDFD12, чего это нет? Там в старте сразу DontDestroyOnLoad(this) и нет такого, чтобы
C#
1
if (_instance != null) Destroy(this);
Значит загружаем сцену ещё раз - опять старт и опять DontDestroyOnLoad(this) - и так каждый раз.
0
0 / 0 / 0
Регистрация: 16.01.2018
Сообщений: 38
13.02.2018, 01:00  [ТС] 14
Интересно. Вот что мне "пишут", указывая при этом на "var player = GameObject.Instantiate(Resources.Load<GameObject>("SoundPlayer"));"

ArgumentException: объект, который вы хотите создать, равен null.
UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:239)
UnityEngine.Object.Instantiate[GameObject] (UnityEngine.GameObject original) (at C:/buildslave/unity/build/Runtime/Export/UnityEngineObject.cs:200)
SoundPlayer.CreateSoundPlayer () (at Assets/Scripts/SoundPlayer.cs:22)
Destroy.Start () (at Assets/Scripts/Destroy.cs:12)

То есть, из префаба не создается первичный объект? Точнее, он действительно не создается - в инспекторе его нет
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
13.02.2018, 01:03 15
GRAKGD, Resources.Load<GameObject>("SoundPlayer") тут во-первых может быть такая проблема, что обёект не успеет загрузиться и пока он не загрузился он null. Сначала загрузи, потом инстантиеэть его
0
58 / 57 / 15
Регистрация: 15.09.2012
Сообщений: 557
13.02.2018, 09:54 16
Цитата Сообщение от JerryLetehen Посмотреть сообщение
В Эвёйке ж нет проверки на индивидуальность. Или почему я не прав?
видимо вы пропустили пункт 6.

Добавлено через 7 минут
Цитата Сообщение от GRAKGD Посмотреть сообщение
ArgumentException: объект, который вы хотите создать, равен null.
тут или вы вообще не создали префаб (пункт 5) или имя префаба != SoundPlayer
0
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
13.02.2018, 18:00 17
Цитата Сообщение от ASDFD12 Посмотреть сообщение
видимо вы пропустили пункт 6.
Ну мало ли, забудет человек удалить. В другой сцене добавит...

Проще ведь добавить 1 - 2 строки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    private static SoundPlayer _instance;
 
    public static SoundPlayer Instance
    {
        get
        {
            return _instance;
        }
    }
 
 
    private void Awake()
    {
        if (_instance == null)
            _instance = this;
        else
        {
            DestroyImmediate(this);
        }
    }
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
13.02.2018, 18:37 18
Serj190492, вот от DestroyImmediate лучше воздержаться, а то можно в один прекрасный момент физически удалить файл объекта с диска ))
0
0 / 0 / 0
Регистрация: 16.01.2018
Сообщений: 38
14.02.2018, 04:19  [ТС] 19
В итоге использовал эту конструкцию. Все работает

void Awake() {
GameObject[] objs = GameObject.FindGameObjectsWithTag("GameplaySong");
if (objs.Length > 1)
Destroy(this.gameObject);
DontDestroyOnLoad(this.gameObject);
}

Появилась новая проблема которая до этого момента даже в голову не приходила

Суть. Есть сцена стартового меню, в ней играет музыка стартового меню. Есть сцена игры, в ней играет собственно AudioSourse из "("GameplaySong");". Так вот если я нажимаю кнопку "replay" (ее код: "SceneManager.LoadScene(2);", то есть игровая сцена), то музыка продолжает играть, все как надо. Но если я нажму кнопку "back" (ее код: "SceneManager.LoadScene(1);", то есть стартовая сцена), то музыка тоже! продолжает играть, но там уже играет музыка стартового меню и они накладываются
0
160 / 159 / 59
Регистрация: 19.02.2015
Сообщений: 830
14.02.2018, 06:11 20
Cr0c, Понял, исправлюсь)
0
14.02.2018, 06:11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru