当前位置: 首页 > news >正文

Unity 集成 FMOD 音频管理插件 2.02

Unity 集成 FMOD 音频管理插件 2.02

    • 3. 集成教程:
      • 3.1 设置Unity项目
      • 3.2 设置FMOD项目
      • 3.3 设置 FMOD for Unity
      • 3.4 添加声音:卡丁车引擎
      • 3.5 添加声音:氛围
      • 3.6 添加声音:音乐
      • 3.7 删除现有音频
      • 3.8 下一步
    • 10. 脚本 API 参考
      • 10.1 基础知识
      • 10.2 Unity Inspector 中的浏览器 UI
      • 10.2.1 事件
      • 10.2.2 BANK
      • 10.2.3 全局参数
    • 11 FMOD [主页链接](https://www.fmod.com/)

3. 集成教程:

本指南将向您展示如何开始使用 FMOD for Unity。您将采用现有的Unity项目,安装FMOD for Unity,并集成使用FMOD Studio创建的自适应音频。一步一步地跟着走,听听结果。完成本教程后,您应该有足够的知识将 FMOD 内容集成到任何 Unity 项目中。

您将使用的 Unity 项目是卡丁车微型游戏模板,这是一款专为学习而开发的 3D 卡丁车赛车游戏。为简单起见,您将使用 FMOD 示例项目中的音频内容。观看下面的视频,预览我们将要进行的更改:

前后对比一下我们将对卡丁车小游戏所做的更改。

让我们开始吧!

3.1 设置Unity项目

1 访问 Unity 网站并使用“下载 Unity Hub”按钮安装 Unity Hub。

2 登录 Asset Store 并从 Asset Store 将 Karting Microgame 添加到您的资产中。

3 运行 Unity Hub 并重新登录。

4 在 Unity Hub 中,单击“新建项目”。
请添加图片描述
5 单击“所有模板”,然后滚动到“卡丁车微型游戏”磁贴。
请添加图片描述
6 单击下载模板。
请添加图片描述
7 如果您尚未安装 Unity 引擎,系统将提示您安装一个引擎。如果您安装了兼容的引擎,请跳到步骤 8。
请添加图片描述
如果您看到以下消息:

a. 单击安装编辑器。
b. 在出现的提示符中,选择受支持的 Unity 版本(在 Karting Microgame 的 Asset Store 页面中注明),然后单击安装。
请添加图片描述
c. 单击“安装”
请添加图片描述
d. 等待安装完成,在 Unity Hub 的“安装”部分。
e. 完成后,再次单击“新建项目”,然后选择“卡丁车微型游戏”(如步骤 4 和 5 所示)。

8 输入项目名称,然后单击“创建项目”。

Unity 将打开并导入项目数据。这可能需要一些时间。 在 Windows 上,您可能需要接受任何提示才能允许防火墙访问。
打开Unity后,您将看到一个欢迎对话框,说明如何开始使用卡丁车微型游戏教程。

9 欢迎对话框可引导您完成 Unity 的 Karting Microgame 教程。由于我们没有遵循它,我们可以通过单击窗口右上角的叉号来关闭“欢迎”对话框。
请添加图片描述
10 在屏幕右侧,您会看到“教程”选项卡。同样,这在 Unity 的教程中使用,因此我们也可以通过单击菜单下拉列表并从菜单中选择“关闭选项卡”来关闭它。
请添加图片描述

让我们试着玩卡丁车游戏,听听目前的情况。

11 单击 Unity 窗口顶部的播放按钮。

游戏将在编辑器中开始播放。

12 使用键盘上的箭头键开始驾驶。

正如你所听到的,发动机的声音非常安静。我们可以暂时禁用音乐来听到引擎 - 但在进行任何更改之前,让我们保存此项目的新副本。

13 从菜单栏中选择“文件”>“退出”。
请添加图片描述
14 系统将提示您保留该项目。选择“保留”。
请添加图片描述
15 选择项目的保存位置和名称。

16 若要重新打开项目,请再次打开 Unity Hub。

17 从“项目”部分中,选择刚刚保存的项目。(有时 Unity Hub 不会显示较旧的项目。如果未显示项目,请单击“添加”按钮并导航到之前保存项目的位置。
请添加图片描述

等待项目在 Unity 中重新打开,然后再次单击播放按钮。

18 在游戏运行时,在左侧的“层次结构”选项卡中选择“BackgroundMusic”游戏对象。

19 取消选中右侧“检查器”窗格中的“音频源”组件。
请添加图片描述
20 使用方向键继续行驶。

21 听完引擎后,单击播放按钮退出游戏。

引擎的声音,以及游戏的一般音频,可能需要一些改进。我们可以使用 FMOD 来做到这一点。

3.2 设置FMOD项目

我们的计划是使用 FMOD Studio 示例中的音频内容。为此,我们需要安装 FMOD Studio 创作工具并创建一个新的 FMOD
Studio 项目。

1 转到 FMOD。

2 单击下载。

3 登录或创建帐户。

4 在下载页面上,单击 FMOD Studio Suite 部分将其展开,然后选择 2.02 子部分。

5 单击适合您正在使用的计算机平台(Windows 或 Mac)的下载链接。
请添加图片描述

FMOD for Unity的“Unity Verified”版本经过 Unity 的 QA 测试和认证,是兼容的解决方案。

6 运行下载的安装程序并按照安装说明进行操作。

接下来,让我们复制 FMOD Studio 附带的示例项目。

7 通过从 Windows 上的“开始”菜单或 Mac 上的“应用程序”文件夹中选择它来运行 FMOD Studio。 (在 Windows 上,接受任何允许防火墙访问的提示。

8 在欢迎对话框中,从“最近使用的项目”列表中选择 Examples.fspro 项目。(在 Mac 上,如果未显示 Examples.fspro,请单击“打开项目”以手动找到它。示例项目位于 FMOD Studio 安装目录的 examples 文件夹中。
请添加图片描述
9 从菜单栏中,选择“文件”>“另存为…”。
请添加图片描述
10 选择项目的保存位置和名称。当我们告诉Unity在哪里可以找到FMOD项目时,我们可以将项目保存在我们喜欢的任何位置。请勿在之前创建的 Unity 项目的 Assets 文件夹中选择位置。

示例项目包含许多事件。 在 FMOD中,事件是可以通过游戏代码控制的声音内容单元。游戏中发出声音的所有内容都应该有相应的事件。事件包含音频文件和播放逻辑。
在我们的游戏中,卡丁车的引擎将有自己的事件。 在本指南中,我们将使用 Kart 引擎示例项目中的现有事件。我们稍后将介绍如何创建新事件。

11 在窗口左侧的“事件”浏览器中,选择“车辆>驾驶式割草机”。该事件将显示在编辑器中。
请添加图片描述
12 单击传输栏中的播放按钮以试听事件。

13 在传输栏中拖动 RPM 滑块。
请添加图片描述

您应该听到以各种 RPM 播放的更准确的发动机声音模型。 我们的 Unity
游戏可以简单地播放此事件,在游戏过程中发送任何相关参数数据,例如 RPM 值。

14 单击停止按钮以停止试镜活动。
Setting up the FMOD Project

下一步是将我们的 FMOD 活动构建到银行中。稍后,我们将在 Unity 中加载库。

15 在菜单栏中,选择“文件”>“生成…”。
请添加图片描述

这些库将构建到 FMOD Studio 项目中的文件夹中。

3.3 设置 FMOD for Unity

现在,我们已准备好将银行加载到Unity中,以便可以触发卡丁车事件。首先,我们需要导入 FMOD for Unity。

1 在浏览器中导航到 FMOD for Unity。

请注意,在 Unity 2019.4 及更早版本中,资源存储会在“资源存储”窗口中打开。在搜索栏中搜索“FMOD for Unity”。

2 检查资产的主要版本是否与您的 FMOD Studio 版本匹配,即 2.02.xx(此外,由于包含程序集定义,本指南至少需要 2.02.04)。如果不匹配,请改为从 FMOD 网站下载。

3 单击“添加到我的资产”按钮。

在 Unity 2019.4 及更早版本中,此按钮标记为“下载”。

4 确保您已再次登录 Unity 帐户。

5 在 Unity 2020.1 及更高版本中,从 Unity 的菜单栏导航到 Window > Package Manager。

6 在“包管理器”窗口中,确保左上角的第二个下拉列表设置为“我的资产”。

7 选择 FMOD for Unity 资源,然后单击右下角的下载。

8 在包列表中选择“FMOD For Unity”,然后单击“下载”。下载完成后,单击“导入”按钮。

9 系统将提示您输入资产列表,将它们全部勾选,然后单击“导入”按钮。
请添加图片描述

(如果您使用的是 MacOS 10.15 Catalina,此时可能会遇到警告。如果是这样,请参阅以下内容:Catalina)。

10 “FMOD Setup Wizard”(FMOD 设置向导)窗口打开。单击“开始”。
请添加图片描述

11 下一页用于更新现有的 FMOD For Unity 设置。由于这是第一次,因此单击“下一步”。
请添加图片描述
12 选择 FMOD Studio 项目按钮,选择 FMOD Studio 项目文件夹中的文件(如前所述),然后单击下一步。*.fspro
请添加图片描述
13 下一页是删除原生 Unity 侦听器并将其替换为 FMOD 侦听器。单击“将 Unity 侦听器替换为 FMOD 音频侦听器”,然后单击“下一步”。
请添加图片描述
14 此页面用于禁用 Unity 的内置音频引擎。由于我们使用 FMOD 引擎处理音频,因此 Unity 内置音频引擎无需不断消耗资源。单击禁用内置音频按钮。
请添加图片描述
15 此页面将列出 Unity 项目中的所有 AudioSource Unity 组件。这对于导航到 Unity 项目中的所有 AudioSource 组件非常有用,以便您可以根据需要禁用或删除。由于我们想充分了解如何添加 FMOD 事件发射器组件并进一步操作它们,因此请保持此页面不变并单击下一步。
请添加图片描述
16 下一页用于复制在将 FMOD for Unity 与 Unity 项目一起使用时忽略某些文件和文件夹的规则。由于我们未将此 Unity 项目添加到源代码管理存储库,因此请单击“下一步”。
请添加图片描述
17 最后一页是使用 FMOD for Unity 向导执行的所有任务的列表。由于这是一个新项目,并且没有更改 Unity AudioSources,因此“更新”和“Unity 源”选项卡被列为“不完整”。这是意料之中的,因此请关闭设置向导,让我们开始将我们的事件放入 Unity 游戏中。
请添加图片描述

玩游戏并确保“日志”选项卡中没有显示错误。

祝贺!现在,您已经完成了 FMOD for Unity 的基本设置。本指南的其余部分将重点介绍如何将 FMOD 事件添加到卡丁车微型游戏中。

3.4 添加声音:卡丁车引擎

如前所述,我们希望玩家的卡丁车使用 Ride-on Mower FMOD 事件。首先,让我们添加一个组件来触发事件。

1 在左侧的“层次结构”选项卡中选择 KartClassic_Player/ArcadeEngineAudio 游戏对象。
请添加图片描述
2 单击 Inspector 选项卡底部的添加组件。

3 选择 FMOD Studio > FMOD Studio 事件发射器。
请添加图片描述
4 将“Play Event”字段设置为“对象启动”。
请添加图片描述
5 单击“事件”字段旁边的搜索按钮。

6 在浏览器弹出窗口中,双击 Events > Vehicles > Ride-on Mower。
请添加图片描述
7 在“初始参数值”部分下,从下拉列表中添加 RPM 并将值设置为 1000。
请添加图片描述

玩游戏。您现在应该听到卡丁车引擎以 1000 的恒定 RPM 值播放。 我们需要做的是将卡丁车的物理特性确定的 RPM 值与 FMOD事件联系起来。为此,我们将编辑现有的引擎音频 C# 脚本,以将 RPM 值传递给我们的事件。
但是,我们需要编辑的脚本使用程序集定义文件分配给自定义 KartGame 程序集。这意味着,在我们使 KartGame 程序集引用 FMODUnity 程序集之前,它将无法访问 FMOD 脚本。

8 在窗口底部的“项目”选项卡中,导航到“Assets > Karting > Scripts > KartGame”。

9 在检查器的“组件定义参照”(Assembly Definition References) 部分中,单击“+”按钮。

10 单击新组件定义参考上的目标图标,然后选择 FMODUnity 组件。
请添加图片描述

11 单击检查器底部的“应用”按钮。

现在,我们可以对引擎音频脚本进行更改。

12 在左侧的“层次结构”选项卡中选择 KartClassic_Player/ArcadeEngineAudio 游戏对象。

13 单击 Inspector 窗格中 Arcade Engine Audio 脚本组件上的上下文菜单图标。

14 选择“编辑脚本”。
请添加图片描述

15 脚本文件将在默认代码编辑器中打开。

16 我们需要用自己的代码替换现有代码,因此选择下面的所有代码并按 Cmd/Ctrl + C 进行复制。然后返回代码编辑器,按 Cmd/Ctrl + A 全选,然后按 Cmd/Ctrl + V 粘贴此代码:

using UnityEngine;namespace KartGame.KartSystems
{/// <summary>/// This class produces audio for various states of the vehicle's movement./// </summary>public class ArcadeEngineAudio : MonoBehaviour{public float minRPM = 0;public float maxRPM = 5000;ArcadeKart arcadeKart;void Awake(){arcadeKart = GetComponentInParent<ArcadeKart>();}void Update(){float kartSpeed     = arcadeKart != null ? arcadeKart.LocalSpeed() : 0;// set RPM value for the FMOD eventfloat effectiveRPM = Mathf.Lerp(minRPM, maxRPM, kartSpeed);var emitter = GetComponent<FMODUnity.StudioEventEmitter>();emitter.SetParameter("RPM", effectiveRPM); //核心代码}}
}

17 保存脚本并关闭文本编辑器。

再次玩游戏。发动机声音会随着您加速而变化。但是,发动机仍然需要一些调整。

18 确保在“层次结构”选项卡中仍选择“KartClassic_Player/ArcadeEngineAudio 游戏对象”。

19 在“引擎音频”脚本组件下,将“最小 RPM”设置为 500,将“最大 RPM”设置为 2000,以匹配 Ride-on Mower 事件的合理范围。
请添加图片描述

再次玩游戏。卡丁车引擎听起来应该好多了!

3.5 添加声音:氛围

现在我们已经让卡丁车引擎正常工作,让我们为音景添加一些氛围。

1 在左侧的“层次结构”选项卡中选择“BackgroundMusic”游戏对象。

2 单击 Inspector 选项卡底部的添加组件。

3 选择 FMOD Studio > FMOD Studio 事件发射器。
请添加图片描述
4 将“Play Event”字段设置为“对象启动”。

5 单击“事件”字段旁边的搜索按钮。

6 在浏览器弹出窗口中,双击 Events > Ambience > City。

7 在“初始参数值”部分下,从下拉列表中添加“流量”并将值设置为 0.3。
请添加图片描述

再次玩游戏。您应该听到城市氛围充满了音景。

3.6 添加声音:音乐

到目前为止,我们一直在使用 FMOD 示例项目中的事件。让我们尝试创建一个新事件。

这将是一个复制原始游戏循环背景音乐的简单事件。

1 在 FMOD Studio 中,右键单击(或在 Mac 上按住 Command 键单击)“音乐”文件夹,然后选择“事件默认值”>“2D 时间轴”。
请添加图片描述
2 输入活动名称:“卡丁车音乐”。

3 若要将事件分配给库进行导出,请在“事件”浏览器中右键单击(或在 Mac 上按住 Command 键单击)该事件,选择“分配给库”,然后选择“音乐库”。
请添加图片描述

我们将在新的FMOD活动中重用Unity项目中的原创音乐。

4 在 Unity 编辑器中,在窗口底部的“项目”选项卡中,导航到“资源”>“卡丁车”>“音频>音乐”。

5 右键单击(或在 Mac 上按住 Command 键单击)“音乐”资源,然后选择“在资源管理器中显示”(或在 Mac 上选择“在 Finder 中显示”)。
请添加图片描述
6 将 Music.mp3 文件从资源管理器(在 Mac 上为 Finder)窗口拖到 FMOD Studio 事件编辑器窗口,将其拖放到编辑器窗格中 Audio 1 轨道的正文上以创建音频。
请添加图片描述
7 单击播放按钮并确保可以听到音乐。

8 单击停止按钮结束试镜。

与原版游戏一样,我们希望音乐能够连续循环播放。

9 在前面步骤中创建的仪器上单击鼠标右键(或在 Mac 上按住 Command 键单击),然后选择“新建循环区域”。

播放事件,并观察音乐在到达循环区域的末尾时是否循环。
音乐将单独路由到音效。这样可以很容易地在以后调整混音。

10 在菜单栏中,选择 Window > Mixer。这将打开 Mixer 窗口。
请添加图片描述
11 在 Mixer 窗口的 Routing 浏览器中,将“Music/Kart Music”事件拖到“Music”组中。
请添加图片描述

我们需要构建BANK文件,将新的卡丁车音乐活动纳入游戏中。

12 在菜单栏中,选择“文件”>“生成…”。

接下来,让我们在游戏中触发这个事件。

13 在 Unity 中,在左侧的“层次结构”选项卡中选择“BackgroundMusic”游戏对象。

14 单击 Inspector 选项卡底部的添加组件。

15 选择 FMOD Studio > FMOD Studio 事件发射器。

16 将“Play Event”字段设置为“Object Start”。

17 单击“事件”字段旁边的搜索按钮。

18 在浏览器弹出窗口中,双击“事件”>“音乐”>“卡丁车音乐”。
请添加图片描述

玩游戏以听到播放的背景音乐。 正如你所听到的,这有效地复制了原始游戏的音乐播放。但是,您会发现背景音乐淹没了引擎的声音。
我们可以使用实时更新在FMOD中快速调整声音。这适用于 Unity 编辑器和独立构建。

19 在 Unity 窗口中,单击播放按钮并确保游戏正在运行。

20 在 FMOD Mixer 窗口中,单击窗口底部的 Live Update 按钮。

21 确保选择“localhost”地址。这使我们能够连接到与 FMOD Studio 在同一台机器上运行的游戏。

22 单击“连接”按钮。
请添加图片描述

请注意,窗口底部的“实时更新”按钮现在突出显示,混音器中的电平表显示游戏中听到的内容。
请添加图片描述

23 找到调音台上的音乐组。您可能需要向右滚动才能找到它。
请添加图片描述
向下拖动音量推子,将其设置为 -6dB。
请添加图片描述

音乐应立即降低音量。
实时更新可以快速迭代游戏的音频。
请添加图片描述
现在是尝试根据自己的喜好调整事情的好时机。例如,单击“音乐”组后,您会发现您可以在卡座中编辑声像和音高设置,或者添加 DSP 效果来更改声音质量。
请注意,如果断开实时更新的连接,则在退出播放模式时,Unity 中的音频将恢复到以前构建的状态。要提交更改,请在 FMOD Studio 中重建库。

3.7 删除现有音频

在开始添加 FMOD Studio 事件之前,最好删除项目中当前存在的预先存在的 Unity AudioSource。

1 导航到 FMOD > 设置向导,然后单击 Unity Sources 选项卡。从其列表中选择以下游戏对象以自动导航到它们(或者,可以在 Unity 编辑器的“层次结构”选项卡中找到这些对象):

a 游戏管理器/游戏HUD
b 背景音乐
c KartClassic_Player/ArcadeEngine音频/引擎空闲
d KartClassic_Player/ArcadeEngine音频/engine_start
e KartClassic_Player/ArcadeEngine音频/引擎运行
f KartClassic_Player/ArcadeEngine音频/引擎反转
g KartClassic_Player/街机引擎音频/漂移
请添加图片描述
2 对于这些游戏对象中的每一个:

a 选择游戏对象
v 单击右侧“检查器”窗格中“音频源”组件上的上下文菜单图标。
c 选择“删除组件”。

从 GameManager/GameHUD 对象中删除音频源将导致反馈 Flash HUD
脚本中出现错误。要解决这个问题,我们需要编辑FeedbackFlashHUD.cs。

3 选择 GameManager/GameHUD 对象。

4 向下滚动到“检查器”选项卡中的“反馈闪光 HUD”组件,然后单击上下文菜单图标。

5 选择“编辑脚本”,在默认代码编辑器中打开脚本文件。

6 删除所有包含 的行。m_audioSource

7 保存脚本并关闭文本编辑器。

还有一个 Game Flow Manager 组件,用于在通过最终检查点时创建 AudioSource
组件。为了摆脱这种情况,我们需要编辑GameFlowManager.cs。

8 选择 GameManager 对象。

9 向下滚动到 Game Flow Manager 组件,然后单击上下文菜单图标。

10 选择“编辑脚本”,在默认代码编辑器中打开脚本文件。

11 删除所有包含 的行。audioSource

12 保存脚本并关闭文本编辑器。

还有一些组件会调用(创建 AudioSource
组件)以在您撞到墙或通过检查点时播放声音效果。为了摆脱这些,我们需要编辑AudioUtility.cs。AudioUtility.CreateSFX

13 在窗口底部的“项目”选项卡中,导航到“AudioUtility”>“AudioUtility”>“Assets > Scripts > Utilities”。

14 双击 AudioUtility 脚本以在默认代码编辑器中将其打开。

15 删除函数的内容(第 19-29 行)。CreateSFX

16 保存脚本并关闭文本编辑器。

还有一个 Objective Toast 组件,用于在目标消息出现时创建 AudioSource
组件。为了摆脱这些,我们需要编辑ObjectiveToast.cs。

17 在窗口底部的“项目”选项卡中,导航到 ObjectiveToast > ObjectiveToast > > UI > Assets Karting Scripts。

18 双击 ObjectiveToast 脚本,在默认代码编辑器中将其打开。

19 删除除以 开头的行之外的所有包含的行。PlaySoundvoid PlaySound

20 保存脚本并关闭文本编辑器。

如果您再次玩游戏,警告将得到修复。但是,您可能会注意到起跑线声音继续播放。这些是由 Unity 时间线资源触发的,我们也可以将其删除。

21 在窗口底部的“项目”选项卡中,导航到 Assets > Karting > Timelines > RaceStart。

22 双击 RaceStart 资源以在编辑器中将其打开。请添加图片描述
在显示的“时间轴”选项卡中,单击“音轨”上下文菜单图标,然后选择“删除”。
请添加图片描述

再玩一次游戏。不应听到任何音频,也不应在“日志”选项卡中显示任何警告。

3.8 下一步

在本指南中,您学习了如何将 FMOD 添加到现有 Unity 游戏中。我们还替换并改进了游戏的声音,让世界感觉更加生动。

要了解有关 FMOD 和 Unity 的更多信息,请参阅以下资源:

  • 维京村 - 视频教程系列
  • 生存射击游戏 - 视频教程系列
  • FMOD Studio - 用户手册

10. 脚本 API 参考

FMOD Studio Unity Integration 以 C# 公开完整的 FMOD Core 和 Studio API。

Studio API 用于播放和控制在 FMOD Studio 工具中创建的事件。

核心 API 用于直接播放声音以及事件播放的高级控制。

运行时管理器 API 为编写使用 FMOD Studio 事件的 Unity 游戏组件时的最常见操作提供了帮助程序。

10.1 基础知识

初始化时,它会创建一个 和 一个 .您可以使用其中任何一个和/或所有这些来访问 API。

RuntimeManagerStudio SystemCore Systemvar studioSystem = FMODUnity.RuntimeManager.StudioSystem;
FMOD.Studio.CPU_USAGE cpuUsage;
studioSystem.getCPUUsage(out cpuUsage);var coreSystem = FMODUnity.RuntimeManager.CoreSystem;
uint version;
coreSystem.getVersion(out version);

10.2 Unity Inspector 中的浏览器 UI

您可以使用以下方法之一访问自定义 FMOD UI 以选择事件、库和全局参数:

10.2.1 事件

使用 EventReference 类型来保存对 Event 的引用。

public class EventReferenceTest : MonoBehaviour
{public FMODUnity.EventReference MyEvent;
}

您将看到以下 UI:
请添加图片描述

10.2.2 BANK

在用于保存 Bank 路径的任何字符串属性上使用属性“[FMODUnity.BankRef]”。

public class BankRefTest : MonoBehaviour
{[FMODUnity.BankRef]public string MyBank1;
}

您将看到以下 UI:
请添加图片描述

10.2.3 全局参数

在用于保存全局参数路径的任何字符串属性上使用属性“[FMODUnity.ParamRef]”。

public class ParamRefTest : MonoBehaviour
{[FMODUnity.ParamRef]public string MyParam1;
}

您将看到以下 UI:
请添加图片描述

11 FMOD 主页链接

相关文章:

Unity 集成 FMOD 音频管理插件 2.02

Unity 集成 FMOD 音频管理插件 2.02 3. 集成教程&#xff1a;3.1 设置Unity项目3.2 设置FMOD项目3.3 设置 FMOD for Unity3.4 添加声音&#xff1a;卡丁车引擎3.5 添加声音&#xff1a;氛围3.6 添加声音&#xff1a;音乐3.7 删除现有音频3.8 下一步 10. 脚本 API 参考10.1 基础…...

Linux下线程的互斥与同步详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…...

【栈】736. Lisp 语法解析

本文涉及知识点 栈 LeetCode736. Lisp 语法解析 给你一个类似 Lisp 语句的字符串表达式 expression&#xff0c;求出其计算结果。 表达式语法如下所示: 表达式可以为整数&#xff0c;let 表达式&#xff0c;add 表达式&#xff0c;mult 表达式&#xff0c;或赋值的变量。表达…...

什么时候用C而不用C++?

做接口只用C&#xff0c;千万别要C。C是编译器敏感的&#xff0c;一旦导出的接口里有 std::string这些东西&#xff0c;以及类&#xff0c;注定了要为各个编译器的各个版本准备独立的库。 刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门…...

unix环境编程编程扫描版:深度解析与实践指南

unix环境编程编程扫描版&#xff1a;深度解析与实践指南 在探索Unix环境编程的广阔天地时&#xff0c;我们如同行走在一条充满未知与奇遇的旅程中。本篇文章将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Unix环境编程的精髓&#xff0c;帮助读者在编程的海…...

2024年6月8日 每周新增游戏

中医百科中药: 中医百科中药是一款非常强大的中药知识科普软件&#xff0c;该应用提供500多味中草药的文献资料&#xff0c;强大的搜索功能可根据功效、特点和关键词来快速查找中药&#xff0c;而且每味中药的图片、功效、主治、炮制方法等百科知识&#xff0c;可以很好的帮助你…...

AI提示词Prompts有没有好公式?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…...

一个 buffer 使用的负反馈实例

端到端拥塞控制其实就是负反馈的实施。典型的做法是识别到一系列标志性事件&#xff0c;比如丢包&#xff0c;时延增加等&#xff0c;然后对这些事件做反应&#xff0c;进而形成负反馈&#xff0c;但 inflight 守恒是一种完全不同的做法&#xff0c;它将负反馈平铺到了整个传输…...

小程序简单版录音机

先来看看效果 结构 先来看看页面结构 <!-- wxml --><view class"wx-container"><view id"title">录音机</view><view id"time">{{hours}}:{{minute}}:{{second}}</view><view class"btngroup"…...

苹果手机微信如何直接打印文件

在快节奏的工作和生活中&#xff0c;打印文件的需求无处不在。但你是否曾经遇到过这样的困扰&#xff1a;打印店价格高昂&#xff0c;让你望而却步&#xff1f;今天&#xff0c;我要给大家介绍一款神奇的微信小程序——琢贝云打印&#xff0c;让你的苹果手机微信直接变身移动打…...

51.线程池大小

问题 1.线程池太小会导致程序不能充分利用系统资源、容易导致饥饿。 2.线程池过大导致更多的线程上下文切换&#xff0c;占用更多的内存。 情况一&#xff1a;CPU密集型运算 应用程序是做一些数据分析&#xff0c;需要大量的使用cpu,程序代码全部都是跟cpu相关的&#xff0…...

Python | 开房门(map)

常把map称之为映射&#xff0c;就是将一个元素&#xff08;通常称之为key键&#xff09;与一个相对应的值&#xff08;通常称之为value&#xff09;关联起来 通常用**字典dict**实现了映射这种数据结构 字典也是使用{}来包裹&#xff08;set也是{}&#xff09;&#xff0c;每…...

MATLAB 函数 function

函数定义函数调用局部函数匿名函数函数句柄子函数函数文件的位置函数的文档函数的参数函数的返回值总结 在 MATLAB中&#xff0c;函数是一个执行特定任务的代码块&#xff0c;可以被重复调用。 MATLAB函数可以执行计算、数据操作、文件处理等任务&#xff0c;并且可以接收输入…...

基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道

作者&#xff1a;尹航 在前文《基于阿里云服务网格流量泳道的全链路流量管理&#xff08;一&#xff09;&#xff1a;严格模式流量泳道》、《基于阿里云服务网格流量泳道的全链路流量管理&#xff08;二&#xff09;&#xff1a;宽松模式流量泳道》中&#xff0c;我们介绍了流…...

9行超强代码用Python工具快速获取放假日期

9行超强代码用Python工具快速获取放假日期 在很多场景下,我们需要获知国内具体的节假日安排情况,而国内每一年具体的放假安排以及调休情况,都依赖于国务院发布的具体公告,如果不想自己手动整理相关数据的话,我们可以用Python来快速获取最新的放假日期. 可以通过调用公开的 API…...

Elastic Search(ES)Java 入门实操(2)搜索代码

上篇解释了 ES 的基本概念和分词器。Elastic Search &#xff08;ES&#xff09;Java 入门实操&#xff08;1&#xff09;下载安装、概念-CSDN博客 Elastic Search&#xff08;ES&#xff09;Java 入门实操&#xff08;3&#xff09;数据同步-CSDN博客 这篇主要演示 Java 整合…...

Hudi Spark Sql Procedures 回滚 Hudi 表数据

前言 因为有 Hudi Rollback 的需求,所以单独总结 Hudi Spark Sql Procedures Rollback。 版本 Hudi 0.13.0(发现有bug)、(然后升级)0.14.1Spark 3.2.3Procedures 官方文档:https://hudi.apache.org/docs/procedures 相关阅读:Hudi Spark SQL Call Procedures学习总结…...

【重学C语言】十九、SDL2 图形化编程的使用

【重学C语言】十九、SDL2 图形化编程的使用 SDL2 的第一个程序渲染器纹理渲染1. 纹理的概念2. 加载纹理3. 渲染纹理4. 纹理设置和查询5. 纹理渲染流程6. 注意事项SDL2_imageSDL2 的第一个程序 #define SDL_MAIN_HANDLED #include <SDL.h>int main(int argc, char* argv[…...

什么是电风扇行情?

“电风扇行情” 是一个金融术语&#xff0c;用于描述证券市场中价格上下波动频繁、幅度较大&#xff0c;但总体趋势不明显的市场状况。   其名称来源于电风扇的扇叶在旋转时&#xff0c;风向不断变化的特征&#xff0c;形象地比喻了市场价格频繁变动但没有明确方向的情景。 …...

pytho入门教程

文章目录 随机数据生成的方式list操作方式数据操作方式处理缺失数据数据框操作方式画图的方式 随机数据生成的方式 # 随机生成数据的方式 # 1. 随机生成10-20之间的浮点数 holdForce random.uniform(10,20) # print(holdForce)# 2.for循环输出50个数据的方式 # for i in rang…...

Elasticsearch:ES|QL 查询 TypeScript 类型(二)

在我之前的文章 “Elasticsearch&#xff1a;ES|QL 查询 TypeScript 类型&#xff08;一&#xff09;”&#xff0c;我们讲述了如何在 Nodejs 里对 ES|QL 进行查询。在今天的文章中&#xff0c;我们来使用一个完整的例子来进行详细描述。更多有关如何使用 Nodejs 来访问 Elasti…...

元音 (音标) 和元音字母的区别

元音 [音标] 和元音字母的区别 1. 音位 (phoneme)1.1. Correspondence between letters and phonemes 2. 元音 (vowel)3. 辅音 (consonant)3.1. Consonant sounds and consonant letters 4. 元音字母 (vowel letter)References 1. 音位 (phoneme) https://en.wikipedia.org/wi…...

SMS - 基于阿里云实现手机短信验证码登录(无需备案,非测试)

目录 SMS 环境调试 从阿里云云市场中购买第三方短信服务 调试短信验证码功能 实战开发 封装组件 对外接口 调用演示 SMS 环境调试 从阿里云云市场中购买第三方短信服务 a&#xff09;进入阿里云首页&#xff0c;然后从云市场中找到 “短信” &#xff08;一定要从 云…...

使用Python编写Ping监测程序

Ping是一种常用的网络诊断工具&#xff0c;它可以测试两台计算机之间的连通性&#xff1b; 如果您需要监测某个IP地址的连通情况&#xff0c;可以使用Python编写一个Ping监测程序&#xff1b; 本文将介绍如何使用Python编写Ping监测程序 首先&#xff0c;需要导入os、sys、t…...

iptables常用命令总结

1.iptables 是什么 在Linux中&#xff0c;iptables就是一款强大而灵活的防火墙工具&#xff0c;它为系统管理员提供了广泛的配置选项&#xff0c;可以有效地控制数据包的流动&#xff0c;实现网络访问的控制及安全性增强。 iptables 使用三个不同的链来允许或阻止流量&#x…...

spring 自定义注解实现

实现自定义注解&#xff0c;通常会结合AOP&#xff08;面向切面编程&#xff09;来创建一个自定义的行为。 下面创建一个名为MyCustomAnnotation的自定义注解&#xff0c;并使用AOP编写一个切面来处理这个注解。 1. 创建自定义注解&#xff1a; import java.lang.annotation…...

10.dockerfile自动构建镜像

dockerfile自动构建镜像 类似ansible剧本&#xff0c;大小几kb 手动做镜像&#xff1a;大小几百M 首先创建一个dockerfile的路径&#xff0c;便于在路径下存在多个路径每个路径下都是dockerfile命名的脚本 注释&#xff1a;文件必须为&#xff1a;dockerfile或者Dockerfile …...

python -- series和 DataFrame增删改数据

学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列 注意:本文用到的数据集在文章顶部 1.1 直…...

window.clearInterval(timer) 清除定时器

window.clearInterval(timer)是用来清除定时器的方法。在JavaScript中&#xff0c;使用定时器可以在指定的时间间隔执行一段代码。通常&#xff0c;使用setTimeout()方法可以在一定时间后执行一次代码&#xff0c;而使用setInterval()方法可以在每个时间间隔执行一次代码。 使…...

Java项目如何外发告警日志到企业微信

前言 最近领导交代了一个需求,就是有些许客户不单单满足平台告警日志外发到邮箱、短信的形式,还要以消息聊天的形式外发给企业微信。 具体操作 1、注册企业微信。 2、登录企业微信,找到应用管理,创建应用。 3、创建完之后需要记录以下图片中两个值的信息。 4、然后记录下…...

网站开发用什么图片格式最好/建站流程

一、主键自增 1.设置数据库中&#xff0c;主键自增 2.设置VS中Model1.edmx 二、级联删除 使用Data Annotations&#xff1a; 如果我们要到一对主从表增加级联删除&#xff0c;则要在主表中的引用属性上增加Required关键字&#xff0c;如&#xff1a; public class Destination{…...

苏州北京网站建设/页面关键词优化

安装Linux&#xff08;如果之前已经有Linux&#xff0c;不用安装&#xff0c;直接安装Hadoop&#xff09; 参考链接&#xff1a;厦门大学Hadoop安装教程_单机/伪分布式配置 1尝试新建一个名为hadoop的用户并且设置密码&#xff08;同时添加管理员权限&#xff09;&#xff1a;…...

徐州网站开发怎样/b站推广入口2023破解版

本文实例讲述了python基于queue和threading实现多线程下载的方法&#xff0c;分享给大家供大家参考。具体方法如下&#xff1a;主代码如下&#xff1a;#download workerqueue_download Queue.Queue(0)DOWNLOAD_WORKERS 20for i in range(DOWNLOAD_WORKERS):DownloadWorker(qu…...

坪地网站建设价格/电子商务seo

1、监控过程将向项目提供什么好处? A.通过观察和衡量项目绩效来识别偏差 B.通过观察和衡量项目绩效向变更控制委员会(CCB)识别输入 C.通过观察和衡量项目绩效来更新过程改进计划。 D.通过观察和衡量项目绩效来更新项目管理计划。 答案&#xff1a;A。解析&#xff1a;4.5监…...

网络服务器无响应原因/爱站seo工具包

何为协程  协程&#xff0c;又称微线程。英文名Coroutine。 协程最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换&#xff0c;而是由程序自身控制&#xff0c;因此&#xff0c;没有线程切换的开销&#xff0c;和多线程比&#xff0c;线程数量越多&#xff0c;协…...

建设银行内部网站/百度搜索排名

AFNetworking和ASIHTTPRequest&#xff0c;大致如下&#xff1a; 使用上&#xff1a;AFN是用上较ASI略简单&#xff0c;但扩展不如ASI;AFN能按普通的block写法直接用闭包的写法&#xff0c;但是ASI不行&#xff0c;这样ASI的代码就比较松散&#xff1b; 效率&#xff1a;AFN基于…...