Unity使用c#脚本代码编写基于AudioSource的音频淡入淡出渐变效果

2023-10-28

需求分析与类设计

编写能够通过一个函数调节音乐淡入淡出效果的类。
使用时将脚本挂载在AudioSource的物体上,其他脚本的物体能够访问物体上的这个类进行音量调节。

需要导入的外部成员变量:
1、本物体的AudioSource
2、目标音量

实现思路:
使用FadeMusic(目的音量,持续时间-多少秒)函数设置当前音乐的变化状态,计算出每次刷新的音量的变化值volumedelta。在Update函数中通过保存的volumedelta每次刷新时更改音量。在音乐达到目的音量附近时,停止音量变化,重置状态。
刷新的总变化量使用timedelta = durtime / Time.deltaTime获取,每次刷新的音量变化量用(target - start) / timedelta算出。这样的话,淡入淡出时间就会控制在deltatime(秒)内。注意执行一下除0判断。

代码实现

本人代码没有什么优化,仅供参考。(建议看后面的注意事项!)

public class MusicFade : MonoBehaviour
{
    /*
     * 挂载在audiosource类型的gameobj上,使用时调用objname.fadeMusic(volume,time)
     */
    // Start is called before the first frame update
    [SerializeField] private AudioSource Music;
    [SerializeField] private float volumeDelta;
    [SerializeField] private float targetvolume ;
    [SerializeField] private bool isfading;
    void Start()
    {
        Music = GetComponent<AudioSource>();
        volumeDelta = 0;
        volDecrease = false;
        isfading = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (!isfading) return;
        if(Math.Abs(Music.volume - targetvolume) >= Math.Abs(volumeDelta))
        {
            Music.volume += (float)volumeDelta;
            Debug.Log("fading...");
        }
        else
        {
            Music.volume = targetvolume;
            isfading = false;
        }
    }

    public void FadeMusic(float targetVolume/*0-1*/, float durtime/*seconds*/)
    {
        Debug.Log("Music fade set target = " + targetVolume);
        targetvolume = targetVolume;
        if(Music == null) Music = GetComponent<AudioSource>();
        float timedelta = durtime / Time.deltaTime;
        if(timedelta > 0)
            volumeDelta = (targetVolume - Music.volume) / timedelta;
        else
        {
            volumeDelta = (targetVolume - Music.volume);
        }

        isfading = true;
    }

    public void FadeOut()
    {
        fadeMusic(0,1);
    }

    public void FadeIn()
    {
        fadeMusic(0.5f,1);
    }
    
}

注意事项

1、似乎FadeMusic函数和本类的Update是有并发运行的?如果将isFading = true这个语句提前,会导致音量变化出错。
2、必须在FadeMusic内添加判断是否有AudioSource的引用,并且加上获取!其他脚本调用这个函数时,有可能本类对象还没有执行Awake函数。(或许写进构造函数会修正这个bug?)
3、gameObject用getComponent找到这个类的对象再调用成员函数。

参考资料:如何实现音频淡入淡出效果

以及谁能告诉我一下为什么编辑界面的强调部分框对了,展示部分的强调完全错了……debug不能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity使用c#脚本代码编写基于AudioSource的音频淡入淡出渐变效果 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 时间复杂度分析

    目录 前言 最好 最坏情况复杂度 平均情况时间复杂度 均摊事件复杂度 总结 前言 本文作文学习极客时间课程 数据机构与算法之美 课程的一些笔记与感悟 有兴趣的朋友希望大家关注课程 非常好的课程 不要惧怕数据结构与算法 当你学完整篇专栏 会对
  • 01背包--数组能否分成两个和相同的数组

    1 2 6 3 可以分成 1 2 3 和 6 思路 此题可以用0 1背包问题来解决 分成的两个数组之和 一定为整个数组之和的一半 所以将背包容量设为初始数组之和的一半即可 最后在判断背包所装的容量是不是整个数组之和的一半 关于01背包问题的
  • python 中字典对象按照 value 排序

    dit 1 a 1 b 2 c 2 d 直接使用sorted方法 只能根据key进行排序 sorted dit Out 6 2 1 1 2 如果需要根据value排序 可以 sorted dit items key lambda x x 1
  • 【计算机网络】3、IO 多路复用:select、poll、epoll、reactor

    文章目录 一 select 1 1 用法 1 1 实战 二 poll 2 1 用法 2 2 实战 三 阻塞 非阻塞 3 1 非阻塞 IO 3 1 1 read 3 1 2 write 3 1 3 accept 3 1 4 connect 3
  • 关于Lattic Diamond软件安装不成功问题(license问题)

    今天搞了一上午的软件 都快放弃了 最后发现竟然是环境变量的问题 顿时感觉自己太费了 这么简单都没发现 正常按照教程安装完显示的结果应该是这样的 这时候报错是因为还没有安装license 这个教程里也有 一步步来就行 但是要吐槽的一点就是这个
  • C语言初学者必学必会的C语言必背100代码

    对于C语言这门计算机语言 算是老生常谈了 现在就由我来给大家分享几个关于C语言的几个代码吧 如果有错的地方还望见谅 1 入门级别hello world include
  • 【ES6】let、const、var详解

    let let用于声明变量 特点 1 let不能重复声明变量 2 let声明的变量不会变量提升 3 let声明的变量不属于顶层对象 4 let声明的变量具有块级作用域 let生成了对应的块状作用域 找到i值 let arr for let
  • 解决“至少有一个JAR被扫描用于TLD但尚未包含TLD”的问题

    一 问题描述 26 Aug 2020 18 52 00 419 信息 RMI TCP Connection 3 127 0 0 1 org apache jasper servlet TldScanner scanJars 至少有一个JAR
  • 微服务的优点

    在这里插入图片描述 1 简而言之 微服务就是开发一组小型服务的方式来开发一个独立的应用系统 每个小型服务都运行在自己的进程中 并采用HTTP资源API轻量级的机制来互相通信 这些服务围绕业务功能进行构建 并能通过全自动的部署机制来进行独立部
  • 虚拟机隔离和容器隔离机制及区别

    1 虚拟机隔离机制 通过虚拟化技术虚拟出资源完全独立的的主机 支持虚拟化的层是hypervisor hypervisor是一种虚拟化服务器的软件 2 Docker容器的隔离机制 Docker利用Namespace实现系统环境隔离 采用Cgr
  • 十进制小数转换成二进制的原理理解

    十进制小数转换成二进制的原理理解 在学习浮点数据类型的时候 涉及到了10进制的小数如何转成2进制数的问题 此文章不讨论精度问题 仅涉及转换原理 乘2取整 学习到的方法是 乘2取整 但是一直不知道具体原理是什么 现在从数学上说明一下原理 乘2
  • 你真的了解Python吗?这篇文章可以让你了解90%

    人们为什么使用Python 之所以选择Python的主要因素有以下几个方面 软件质量 在很大程度上 Python更注重可读性 一致性和软件质量 从而与脚本语言世界中的其他工具区别开发 此外 Python支持软件开发的高级重用机制 例如面向对
  • phpstorm 实现SFTP开发,线上线下同步(实时更新代码)

    phpstrom是一个功能非常强大的IDE 甚至在修改SFTP项目时 不需要使用FTP软件将项目download到本地 修改后再提交到服务器覆盖的传统方式 就能做到远程动态连接和修改 非常方便十分适合开发微信项目 1 打开工具栏 Tools
  • 荣耀8 android8.0 2018,荣耀手机EMUI8.0+ Android8.0最新适配计划

    官方活动 荣耀手机EMUI8 0 Android8 0最新适配计划 3941603381 电梯直达 荣小耀同学 天下无双 发表于 2018 3 20 10 06 16 来自 浏览器 最新回复 2020 6 6 19 29 29 亲爱的花粉
  • 离线安装vscode server以及免密登录

    背景 代码服务器通常是无网状态 并且普通用户的权限很低 无法在服务器中安装vscode软件 而我们又想要用vscode编辑器 此时应该怎么办 首先 我们需要在本地安装vscode 其次 当代码量不大 我们可以考虑用samba的方式 在电脑中
  • 微信小程序自带的referer (附:微信,头条,支付宝,百度小程序的自带referer)

    背景 一个获取列表信息的接口 在我在浏览器可以正常获取数据 但小程序的接口返回失败 1invalid request 定位问题 在CGI中有域名白名单校验 checkhost 函数会校验请求头中的referer字段的域名是否在白名单中 白名
  • Java从天气网爬取历史天气数据

    private static String URL http lishi tianqi com private static String BaseURL http www tianqi com public static Map
  • gdb调试正在运行的进程

    http elisawell blog 163 com blog static 171462881201223061149953 有时会遇到一种很特殊的调试需求 对当前正在运行的其它进程进行调试 正是我今天遇到的情形 这种情况有可能发生在那
  • Python删除指定行数据

    Python小点点儿 按列条件筛选 删除DataFrame的行 遇到清洗数据的问题 需要把某一列中为指定元素的数据 整行去除 尝试了drop却不能到达理想的效果 isin效果理想 import pandas as pd df pd Data
  • Unity使用c#脚本代码编写基于AudioSource的音频淡入淡出渐变效果

    需求分析与类设计 编写能够通过一个函数调节音乐淡入淡出效果的类 使用时将脚本挂载在AudioSource的物体上 其他脚本的物体能够访问物体上的这个类进行音量调节 需要导入的外部成员变量 1 本物体的AudioSource 2 目标音量 实