首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在一个新的场景中改变DontDestroyOnLoad‘’ed的AudioClip?

DontDestroyOnLoad 是 Unity 引擎中的一个方法,用于确保指定的 GameObject(及其子对象)在场景切换时不会被销毁。这在处理音频播放器等需要在多个场景间持续存在的对象时非常有用。然而,当你需要在新的场景中更改这些对象的 AudioClip 时,可能会遇到一些挑战。

基础概念

  • DontDestroyOnLoad: 确保 GameObject 在场景切换时不被销毁。
  • AudioClip: 存储音频数据的资源,可以被 AudioSource 组件播放。

相关优势

  • 持久性: 对象在场景切换时保持存在,适用于需要跨场景播放的音频。
  • 资源管理: 避免重复创建和销毁对象,节省内存和性能。

类型与应用场景

  • 单例模式: 使用 DontDestroyOnLoad 创建音频播放器的单例实例,确保全局唯一。
  • 背景音乐: 在游戏或应用的多个场景中播放相同的背景音乐。

遇到的问题及原因

当你尝试在新的场景中更改 DontDestroyOnLoaded 的 AudioClip 时,可能会发现更改没有生效,因为该对象已经在之前的场景中被初始化,并且其 AudioClip 属性没有被更新。

解决方法

  1. 查找已存在的对象: 在新的场景中,首先查找已经存在的 DontDestroyOnLoaded 对象。
代码语言:txt
复制
AudioSource audioSource = FindObjectsOfType<AudioSource>().FirstOrDefault(a => a.name == "YourAudioSourceName");
  1. 更改 AudioClip: 如果找到了对象,直接更改其 AudioClip 属性。
代码语言:txt
复制
if (audioSource != null)
{
    audioSource.clip = newClip;
    audioSource.Play();
}
  1. 单例模式: 如果你使用的是单例模式来管理音频播放器,可以直接通过单例实例来更改 AudioClip。
代码语言:txt
复制
public class AudioManager : MonoBehaviour
{
    public static AudioManager Instance { get; private set; }

    private AudioSource audioSource;

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }

        audioSource = GetComponent<AudioSource>();
    }

    public void ChangeClip(AudioClip newClip)
    {
        audioSource.clip = newClip;
        audioSource.Play();
    }
}

然后在新的场景中调用 AudioManager.Instance.ChangeClip(newClip); 来更改 AudioClip。

参考链接

通过上述方法,你可以在新的场景中成功更改 DontDestroyOnLoaded 的 AudioClip。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Andriod项目开发实战(1)——如何在Eclipse一个包下建

最开始是想将各个类分门别类地存放在不同,所以想在项目源码包中新建几个不同功能包eg:utils、model、receiver等,最后结果应该是下图左边这样:   很明显建立项目后架构是上图右边这样...时是分层,是按name“.”来进行分层,通过上面的右图可以看出,我们最初包是com.mukekeweather.app,然后就有了这样树状文件架构,在src文件夹下有com文件夹,然后在com...文件夹又新建mukekeweather文件夹,然后在其下才新建app文件夹。...所以,我们预想文件夹架构应该是上图最右边那样。。。   ...ok,方法就这样了,其实理解了java中新建包时name写法与包在文件实际组织架构之间关系就很容易了,我们按照刚刚方法继续将其他几个包补上就达到了我们预想效果了,就是下面左侧这张图了,其相应文件组织架构就是右侧这样了

93690
  • 【干货】Cocos Creator制作一个微信小游戏(下)

    双击一下资源管理器Menu场景,再在层级管理器单击一下Canvas节点,显示节点属性检查器,然后把Script目录Menu代码文件搬去到属性检查器,以实现代码和场景绑定。...从资源管理器把1号小球拖到任意一个场景,再在层级管理器把小球命名为Ball1,然后把Ball1拖回资源管理器,再从层级管理器把Ball1删除,即可实现把小球做成预制资源。...,得到一个二维数组,结构[[0,1,1,0],[0,1,0,0]...]        ...比如我们点击小球时候,可以让小球处理一个循环放大缩小动画效果。做法就是在update方法里检测当前选中小球,如果存在就循环改变scale。...我办法是在开始菜单场场景,创建一个空节点,并绑定播放器代码,然后注册到全局。  ?

    5.7K51

    Unity2D开发入门-场景切换

    使用Unity场景管理器:在Unity编辑器,可以使用场景管理器来直接切换场景。打开菜单栏”Window”,选择”Scene Management”,然后选择需要切换场景即可。...切换场景不销毁 在Unity中切换场景时,默认情况下,前一个场景是会被销毁。 当你加载一个场景时,Unity会自动卸载前一个场景,释放相关资源。 然而,你也可以选择在切换场景时保留前一个场景。...这样做可以让前一个场景保持加载状态,并在场景加载之上展示。...当切换到场景时,前一个场景将保留在加载状态,并且场景将以前一个场景上层进行展示。...总之,你可以根据具体需求选择是否销毁前一个场景来达到所需场景切换效果。

    1.7K40

    【学习笔记】Unity3D官方游戏教程:2D Roguelike

    一、前言 继续上次 3D 游戏: Survival Shooter 以及 Tanks tutorial 学习总结之后,这次是官方一个游戏教程: 2D Roguelike 这是官方一个 2D 游戏...,也是自己认真学习并制作一个 2D 游戏。...DontDestroyOnLoad 使用 我们知道,每次加载场景时候,所有当前场景物体都会被销毁,如果想要保存当前场景一些数据,我自己做法是保存数据到一个全局类。...关卡场景加载方法 在 Unity 当中加载场景非常简单,不过那是“简单场景”,如果场景非常庞大,想象一下,加载场景是需要时间,这时候我们恰好又要在场景加载完后做一些初始化,初始化代码怎么放呢?...,这和 Java 差不多,表示子类属性方法可见性以及重写父类方法( C# 父类 virtual 方法) 4.

    1.9K10

    同事看了我代码惊呼:居然是这么在Unity中用单例

    比如,服务器程序,将配置信息存放到一个文件,然后使用一个单例对象进行读取,其他服务进程其他对象再通过这个单例去获取这些配置信息,简化了配置管理。...单例模式结构图如下图所示: 那么,单例模式在Unity又有那些应用场景呢: 1、在使用Unity开发项目的时候,经常会遇到需要一个管理类来管理一些全局变量和方法,比如GameManager...进行创建,不能通过构造函数创建 3、在Awake函数里面对Instance进行赋值,保证了这个属性可以第一时间初始化 4、使用DontDestroyOnLoad可以使这个挂载脚本游戏对象在切换场景也不会被销毁...然后Next场景随便找一个对象挂载UseData脚本,场景不需要创建DataManager对象 然后将两个场景加到Build Setting: 运行程序: 切换到Next场景,DataManager...对象也存在: 敲击键盘W: 所有的值,都从上一个场景DataManager对象挂载脚本单例对象DataManager.csInStancem_StationsAllInfo数组读取出来了

    66110

    【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景游戏物体不被销毁

    也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!...---- Unity小知识点学习 切换场景后保留上个场景游戏物体不被销毁 很多游戏和程序都不止在一个场景运行,就需要进行场景视图切换,在Unity实现场景切换方法非常简单,几句话就能说清楚...但是在Unity中进行场景交换以后,上一个场景所有游戏对象默认都会被销毁 有时候我们并不希望某些用于控制全局游戏对象或者脚本被销毁 所以要对某个游戏对象通过代码进行控制切换场景时不被销毁 方法也很简单...,代码如下: Object.DontDestroyOnLoad(Object) 只要在脚本执行一次这个方法,并将不想被切换场景时销毁对象加进去即可 效果如下: 完整代码在这: public class...UnityTest1 : MonoBehaviour { public Button button1; void Start() { DontDestroyOnLoad

    2.1K30

    Pico Neo 2 ✨ 一、项目的基础配置

    本节讲解内容 如何在Unity完成Pico Neo 2基本配置,为后面实现UI交互、拾取、传送等等功能做铺垫。 在Unity完成本博客内容后,即可到后面博客找到你所需要实现功能进行配置。...配置Unity设置 【当新建空项目导入SDK,选择SDK弹出Apply选项时,下方选项便已默认配置好。如不更改下面选项,可不必再看。】...Settings--Rendering--Color Space: 如果选择Linear,则Resolution and Presentation--Blit Type必须选择Never,否则Unity多创建一个离屏...Apply(下载传送门) 若没弹出Apply选项,选择下图选项,Apply 2️⃣ 场景配置 配置Camera 新建场景,删掉场景Camera,将Pvr_UnitySDK预制体拖入场景。...注:如果项目中有多个场景,只需在主场景Pvr_UnitySDK预制体上增加“DontDestroyOnLoad”方法即可。保证切换场景时候只有一个Pvr_UnitySDK。

    10710

    【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景游戏物体不被销毁

    也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!...---- Unity小知识点学习 切换场景后保留上个场景游戏物体不被销毁 很多游戏和程序都不止在一个场景运行,就需要进行场景视图切换,在Unity实现场景切换方法非常简单,几句话就能说清楚...但是在Unity中进行场景交换以后,上一个场景所有游戏对象默认都会被销毁 有时候我们并不希望某些用于控制全局游戏对象或者脚本被销毁 所以要对某个游戏对象通过代码进行控制切换场景时不被销毁 方法也很简单...,代码如下: Object.DontDestroyOnLoad(Object) 只要在脚本执行一次这个方法,并将不想被切换场景时销毁对象加进去即可 效果如下: 完整代码在这: public class...UnityTest1 : MonoBehaviour { public Button button1; void Start() { DontDestroyOnLoad

    2.3K30

    【100个 Unity实用技能】| Unity检测 设备麦克风权限

    Unity 平台提供一整套完善软件解决方案,可用于创作、运营和变现任何实时互动2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。...也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏! ???? 博客主页:https://xiaoy.blog.csdn.net ????... 检测当前设备是否有麦克风权限 在Unity可以通过调用API检测可以从devices属性获得已连接麦克风列表 从而 判断有没有麦克风权限 Microphone 方法 描述 End 停止记录...GetDeviceCaps 获取设备频率能力。 GetPosition 获取录音样本位置。 IsRecording 查询设备是否正在记录。 Start 开始记录设备。...AudioSource播放,将脚本挂载到场景并添加一个AudioSource组件拖到脚本上即可!

    96350

    Unity-BattleStar丨11. 且听风吟:音乐与音效

    场景,观察 二、概要 1、BGM位于玩家对象,即摄像头下,Play On Awake、Loop 2、在同一个Audio Source—Audio Clip上动态切换音乐,需: Assets新建Resources...三、注意事项 1、 一个场景只能有一个Audio Listener 2、用代码切换动画时,我们要注意Unity Animation默认播放动画应该空,否则即使写了改变播放动画,也不会执行我们写程序,...,造成无法检测到玩家现象 我们调整方向代码,改为如下所示。...#脚本设置: Gun: 1)、当我们击中Robot时,Robot会调用BulletHit音效,若没击中,则在Gun代码调用GunFire音效 2)、当更换弹药时,播放ReloadBullet...两次开火之间要有一个时间差。

    8810

    Unity-BattleStar丨13. 终章:改善BUG,增加三连发模式

    写在前面 根据上个视频展示,细心朋友可能会发现有以下问题: a、有时开完枪后,画面没有枪口火花粒子特效; b、机器人播放完死亡动画后血条并不会立刻消失,而是等待一段时间; c、血包重复加血; d...因此我先改变了代码,优化了a、b、c三个现象,另增加三连发模式,让游戏体验变得容易 更改后游戏效果展示:BattleStar丨终章 优化思路: a、在时间原基础上,再增加延迟0.3s,打开ActiveFire...开关 b、将销毁机器人等待时间设置为机器人死亡动画播放时间——1.1.s c、修改血包代码 d、增加“三连发模式” 该三连发模式并不是完全意义一次发射三发子弹,我们也应该判断当还剩两颗子弹时...另外为区分单发射击和三连发射击不同,我们增加音效,该音效在文章末尾下载 注:本视频上仍有部分开枪特效不显示火花,但那是由于录屏软件帧数不够导致,实际运行该问题已解决。...我们修改重点主要放在c问题上,因此我们展示c问题主要优化代码。该游戏内其他所有脚本和上文提到音效文件已放在CSDN下载资源上,读者可到CSDN下载所有内容。

    8410

    Java图形用户界面之Applet设计

    Applet 类是Java系统类java.awt.Panel子类,因此它也是一个面板容器,其默认布局管理器是FlowLayout, 可以在Applet 面板添加其他界面成分,各种 AWT组件。...在 Applet ,显示更新是由一个专门 AWT 线程控制。...public final static newAudioClip(URL url):从指定相对 URL 上获得一个AudioClip对象,然后通过该对象调用 AudioClip play()、loop...在编写 Applet GUI时,应首先考虑使用哪些组件,标签(Label)、按钮(Button)、文本框(TextField)等,一般在 init ()方法创建相应组件。...Applet类与音频播放有关方法有以下两类。 public AudioClip getAudioClip(...):用于加载音频文件,返回一个 AudioClip 对象。

    8710

    10万+短视频被批量生产了,Python表示不服

    「ImageSequenceClip」类将这些图片写入到一个视频文件。...第二步是将所有的视频文件进行剪辑,写入一个单独文件。利用 moviepy 库下面的 「 VideoFileClip 」可以非常快捷方便地完成这一操作。...(0, video_time) 然后把音频文件通过 set_audio() 添加到视频操作类,最后重新写入到一个视频文件当中。...# 5.视频中加入音频 video_with_new_audio = videoclip_new.set_audio(audioclip_new) # 6.写入到视频文件 video_with_new_audio.write_videofile...GIF 动画文件分别生成一段普通视频,然后把所有的视频合成一段视频,然后再添加一段 BGM 背景音乐,最后写入到一个视频文件,如此,就完成了制作一个 GIF 视频操作。

    2.5K20

    基于RTMP智慧数字人|AI数字人传输技术方案探讨

    ,构建适用于数字客服、虚拟展厅讲解、 智慧城市、智慧医疗、智慧教育等场景,通过人机可视化语音交互,释放人员基础劳动力,降低运营成本,提升智慧交互体验。​ ​...一个有“温度”智慧数字人,有多个维度组成,如图像识别、语音识别、语义理解等,本文主要阐述是如何把这样一个智慧数字人,通过编码传输,以更低延迟和好体验,呈现给用户。​ ​...声音、麦克风、扬声器、还有两路AudioClip音频混音: public void SelAudioPushType(int type) { switch (type)...数据,这块需要注意是,PCM数据发送间隔,每隔10毫秒发一次,因为AudioClipsize比如可能只有十几秒或者几分钟,需要考虑是,AudioClip数据采集播放完毕后,是loop形式反复播放...客户端直接拉取RTMP流数据,延迟在毫秒级,用户体验良好,在智慧数字人等交互场景,体验极佳。

    44440
    领券