Enter Play Mode Settings

atmuc

Member
When I click play it takes a long to start. It is a general problem for big projects. When I use Project Settings/Editor/Play Mode Settings it starts very quickly but I have a problem with that mode. When I uncheck Enter Play Mode Options it works fine. I don't have any static variable in my character controller script. Is UCC fully compatible with Fast Enter Play Mode?

1643620792614.png

MissingReferenceException: The object of type 'AudioSource' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.
Opsive.Shared.Audio.AudioConfig.GetAvailableAudioSource (Opsive.Shared.Audio.AudioSourceGroup audioSourceGroup) (at Assets/Opsive/Shared/Audio/AudioConfig.cs:509)
Opsive.Shared.Audio.AudioConfig.GetNextAudioSource (Opsive.Shared.Audio.AudioSourceGroup audioSourceGroup) (at Assets/Opsive/Shared/Audio/AudioConfig.cs:468)
Opsive.Shared.Audio.AudioConfig.Play (Opsive.Shared.Audio.AudioSourceGroup audioSourceGroup, Opsive.Shared.Audio.AudioClipInfo audioClipInfo) (at Assets/Opsive/Shared/Audio/AudioConfig.cs:349)
Opsive.Shared.Audio.AudioManagerModule.PlayAudio (UnityEngine.GameObject gameObject, Opsive.Shared.Audio.AudioClipInfo audioClipInfo) (at Assets/Opsive/Shared/Audio/AudioManagerModule.cs:132)
Opsive.Shared.Audio.AudioManager.PlayInternal (UnityEngine.GameObject playGameObject, Opsive.Shared.Audio.AudioClipInfo clipInfo) (at Assets/Opsive/Shared/Audio/AudioManager.cs:250)
Opsive.Shared.Audio.AudioManager.Play (UnityEngine.GameObject gameObject, Opsive.Shared.Audio.AudioClipInfo clipInfo) (at Assets/Opsive/Shared/Audio/AudioManager.cs:236)
Opsive.Shared.Audio.AudioClipSet.PlayAudioClip (UnityEngine.GameObject gameObject, Opsive.Shared.Audio.AudioModifier audioModifier, System.Int32 clipIndex) (at Assets/Opsive/Shared/Audio/AudioClipSet.cs:75)
Opsive.Shared.Audio.AudioClipSet.PlayAudioClip (UnityEngine.GameObject gameObject, System.Int32 clipIndex) (at Assets/Opsive/Shared/Audio/AudioClipSet.cs:46)
Opsive.Shared.Audio.AudioClipSet.PlayAudioClip (UnityEngine.GameObject gameObject) (at Assets/Opsive/Shared/Audio/AudioClipSet.cs:35)
Opsive.UltimateCharacterController.Character.Abilities.Ability.AbilityStarted (System.Boolean enableAttributeModifier) (at Assets/Opsive/UltimateCharacterController/Scripts/Character/Abilities/Ability.cs:515)
Opsive.UltimateCharacterController.Character.Abilities.Ability.AbilityStarted () (at Assets/Opsive/UltimateCharacterController/Scripts/Character/Abilities/Ability.cs:482)
Opsive.UltimateCharacterController.Character.Abilities.Ability.StartAbility (System.Int32 index) (at Assets/Opsive/UltimateCharacterController/Scripts/Character/Abilities/Ability.cs:474)
Opsive.UltimateCharacterController.Character.UltimateCharacterLocomotion.TryStartAbility (Opsive.UltimateCharacterController.Character.Abilities.Ability ability, System.Boolean ignorePriority, System.Boolean ignoreCanStartCheck) (at Assets/Opsive/UltimateCharacterController/Scripts/Character/UltimateCharacterLocomotion.cs:1220)
Opsive.UltimateCharacterController.Character.UltimateCharacterLocomotion.TryStartAbility (Opsive.UltimateCharacterController.Character.Abilities.Ability ability, System.Boolean ignorePriority) (at Assets/Opsive/UltimateCharacterController/Scripts/Character/UltimateCharacterLocomotion.cs:1087)
Opsive.UltimateCharacterController.Character.UltimateCharacterLocomotion.TryStartAbility (Opsive.UltimateCharacterController.Character.Abilities.Ability ability) (at Assets/Opsive/UltimateCharacterController/Scripts/Character/UltimateCharacterLocomotion.cs:1076)
Opsive.UltimateCharacterController.Character.Abilities.Ability.StartAbility () (at Assets/Opsive/UltimateCharacterController/Scripts/Character/Abilities/Ability.cs:463)
 
AudioManagerModule is a scriptable object. It keeps some old values as null. I added a line to Audio Manager. it works now. I am not sure if that causes another problem.

AudioManager line 71

if (m_AudioManagerModule == null) {
m_AudioManagerModule = ScriptableObject.CreateInstance<AudioManagerModule>();
}
else
{
m_AudioManagerModule.AudioSourceGroups = new Dictionary<GameObject, AudioSourceGroup>();
}
 
I had this same problem, thanks!
I wonder though, maybe this would be a safer way to do it?

C#:
m_GameObject = gameObject;
            if (m_AudioManagerModule == null) {
                m_AudioManagerModule = ScriptableObject.CreateInstance<AudioManagerModule>();
            }
            else
            {
                m_AudioManagerModule = null;
                m_AudioManagerModule = ScriptableObject.CreateInstance<AudioManagerModule>();

            }

(How I presented the code here is a little redundant obviously, but I left it this way to more quickly depict what I did.)

My thinking is that, if AudioManager is expecting there to be no existing AudioManagerModule, then maybe null out the remnant of the AudioManagerModule (because of the way Enter Play Mode works) and just create a fresh instance of the AudioManagerModule entirely? As opposed to how you did it where you reinitialized a single field inside the remnant.

Just spitballing here, I don't know! Just figured I'd weigh in because I had this exact issue, and your post helped me solve it. Thanks!
 
Top