• Unity 声音的控制


    闲谈:

    游戏开发比普通软件开发难也是有原因的,第一 游戏功能需求变化多样内部逻辑交错纵横, 而软件相对固定,无非也就是点击跳转、数据存储 第二,游戏需要很多3D数学知识、物理知识,最起码得有高中物理的基础,力、向量、射线,除了这些数据存储一样不少

    但是,心态要放平,愚公移山乐此不疲的态度,一点点加,一点点玩就行了!现查现学,现学现用,用完就忘是常态!

    Unity 声音控制要根据需求来说。每个项目需求都不一样!

    今天实现一个撞金币并且发出声音的业务需求!

    场景导入声音到仓库

    直接把声音拖到Unity  文件夹就行

    然后播放声音的实现需要两个组件,一个是听到声音组件,整个场景只能有一个,一般都在摄像机挂在好了AudioListener

    另一个就是AudioSource,这个组件就像一个播放器,里面指定一个声音片段即可播放。也有对应的类来控制它的一切。

    当你播放的声音很多的时候,可以创建多个这样的组件,也可以用一个组件,通过代码切换Audioclip,来实现播放不同的声音。但是也有些声音需要同时播放,这些Unity 在类里面都考虑到了,Playoneshot()就是叠加播放。

    简单了解对应类

    1. 声音组件AudioSource类(可以存储声音播放组件,用来播放和控制声音)

    2. AudioClip类 声音片段(用来存储音频),将来可以赋值给AudioSource.clip实现音频切换

    一、播放声音的函数

    1.AudioSource.Play()

    直接播放当前AudioSource类对象中clip的内容

    1. // Assuming an AudioSource component is attached to the same GameObject
    2. public class AudioPlayer : MonoBehaviour
    3. {
    4. private AudioSource audioSource;
    5. void Start()
    6. {
    7. audioSource = GetComponent();
    8. }
    9. public void PlaySound()
    10. {
    11. if (audioSource.clip != null)
    12. {
    13. audioSource.Play();
    14. }
    15. }
    16. }

    AudioSource.clip 可以从外部赋值,也可以声明变量,外部赋值,也可以用加载本地资源ResourceLoad()办法赋值!

    2下面这个代码实现,自己外部指定多个音频,然后播放的时候切换音频

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class PlayAudio : MonoBehaviour
    5. {
    6. private AudioSource audioSource;
    7. public AudioClip[] OneClip=new AudioClip[3];
    8. void Start()
    9. {
    10. //获取播放组件
    11. audioSource = GetComponent();
    12. }
    13. //这个函数将来关联按钮
    14. public void PlaySound()
    15. {
    16. //把数组中存储的声音变量给声音播放组件中作为默认音频
    17. audioSource.clip = OneClip[0];
    18. if (audioSource.clip != null)
    19. {
    20. audioSource.Play();//播放组件
    21. }
    22. }
    23. }

    2.PlayOneShot:

    PlayOneShot 方法是 Unity AudioSource 类的一个函数,它允许你在不中断当前正在播放的音频的情况下播放一个音频剪辑。这个方法特别适合用于播放短暂的声音效果,如爆炸声、点击声等。它接受两个参数:一个 AudioClip 对象和一个可选的音量倍数(float 类型),这个音量倍数会乘以 AudioSource 的音量。例如,如果你有一个音效用于玩家的跳跃动作,你可以使用 PlayOneShot 来播放这个跳跃音效,即使背景音乐已经在用同一个 AudioSource 播放。这样,跳跃音效就会与背景音乐同时播放,而不会停止或替换背景音乐。

    1. using UnityEngine;
    2. public class SoundManager : MonoBehaviour
    3. {
    4. // 音频源组件的引用
    5. public AudioSource audioSource;
    6. // 要播放的音频剪辑
    7. public AudioClip jumpSound;
    8. void Start()
    9. {
    10. // 获取当前游戏对象上的AudioSource组件
    11. audioSource = GetComponent();
    12. }
    13. // 用于播放跳跃声音的方法
    14. public void PlayJumpSound()
    15. {
    16. // 使用PlayOneShot播放jumpSound音频剪辑
    17. // 第二个参数是可选的,用于调整播放音量,如果省略,默认为1(即AudioSource的当前音量)
    18. audioSource.PlayOneShot(jumpSound, 1.0f);
    19. }
    20. }

    在这个例子中,audioSource 是附加到同一个游戏对象上的 AudioSource 组件的引用,jumpSound 是要播放的 AudioClip 对象。PlayJumpSound 方法通过 PlayOneShot 方法播放 jumpSound 音效,并将音量设置为 AudioSource 的当前音量。这种方式不会打断任何当前正在 AudioSource 上播放的音频。

    3.PlayClipAtPoint

    PlayClipAtPoint 是 Unity 中的一个静态方法,用于在 3D 空间的特定位置播放一个音频剪辑(AudioClip),而不需要音频源(AudioSource)组件。它会在指定位置创建一个临时的 AudioSource,播放音频一次,然后销毁该 AudioSource。这个方法非常适合播放不需要细致控制的瞬时音效,如爆炸声或玩家收集物品的声音。

    使用 PlayClipAtPoint 方法时,你需要提供音频剪辑和一个 Vector3 位置。你还可以选择提供一个音量参数,但这不是必须的。这个方法会自动处理音频的播放和清理工作,使得你无需在场景中预先放置音频源。

    1. using UnityEngine;
    2. public class AudioManager : MonoBehaviour
    3. {
    4. // 要播放的音频剪辑
    5. public AudioClip explosionSound;
    6. // 在3D空间中的特定位置播放音频剪辑
    7. public void PlayExplosionSound(Vector3 position)
    8. {
    9. // 使用PlayClipAtPoint在指定位置播放explosionSound音频剪辑
    10. // 第二个参数是音频的位置,第三个参数是可选的,用于调整音量,默认值是1.0
    11. AudioSource.PlayClipAtPoint(explosionSound, position, 1.0f);
    12. }
    13. }

    在这段代码中,我们有一个名为 explosionSound 的 AudioClip 变量。PlayExplosionSound 方法被调用时,它将使用 PlayClipAtPoint 方法在指定的 position 位置播放 explosionSound 音效。这个方法自动创建一个临时的 AudioSource 来播放音效,并在音效播放结束后销毁该 AudioSource。这种方式是处理不与特定游戏对象关联的音效的理想选择。

    我的撞金币案例

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public class Collision222 : MonoBehaviour
    5. {
    6. // 克隆金币
    7. //挂在到主角上,分别检测 金币克隆区和障碍物克隆区
    8. //让主角去触发,金币触发器,如果触发了就开始克隆金币
    9. public GameObject CoinMuban;
    10. GameObject TempTriggerCoin;
    11. public Transform oneCoinParent;
    12. public AudioClip coinSound; // 金币音效,从外边拖拽赋值
    13. public AudioClip MonsterAudio;// 掉血音效,从外边拖拽赋值
    14. private void OnTriggerEnter(Collider other)//当我触发到别人 就把别人的碰撞器存在other里面
    15. {
    16. TempTriggerCoin = other.transform.gameObject;
    17. if (other.transform.gameObject.name== "TriggerCoin01")
    18. {
    19. CloneCoin();//开始克隆金币
    20. }
    21. if (other.transform.gameObject.name == "TriggerStru")
    22. {
    23. CloneStruction();//开始克隆障碍物
    24. }
    25. if (other.transform.gameObject.tag == "Coin")
    26. {
    27. //开始加分
    28. Debug.Log("开始加分");
    29. Destroy(other.transform.gameObject);
    30. AudioSource.PlayClipAtPoint(coinSound, other.transform.position);//临时播放,完毕销毁
    31. }
    32. if (other.transform.gameObject.tag == "Monster")
    33. {
    34. //开始加分
    35. Debug.Log("开始掉血");
    36. }
    37. }
    38. void CloneCoin()
    39. {
    40. for (int i = 0; i < 10; i++)
    41. {
    42. Vector3 clonePos = new Vector3(156, 0.5f, TempTriggerCoin.transform.position.z + 50+i*3);
    43. Debug.Log("开始克隆金币");
    44. GameObject.Instantiate(CoinMuban, clonePos, Quaternion.Euler(0, 0, 0), oneCoinParent);
    45. }
    46. }
    47. void CloneStruction()
    48. {
    49. Debug.Log("开始克隆障碍物");
    50. }
    51. }

    二、 多个声音播放 

    1.创建多个AudioSource组件,每个组件播放自己的clip 片段

    2.多个声音Clip,但是只有一个AudioSource组件

    可以用AudioSource类中公共方法修改当前组件的声音片段。 

    AudioSource audioSource;

    核心代码:

    audioSource.clip = clip1;

     audioSource.clip = clip2;

    1. using UnityEngine;
    2. public class PlayMultipleAudioClips : MonoBehaviour
    3. {
    4. public AudioSource audioSource; // 你的AudioSource组件
    5. public AudioClip clip1; // 第一个声音片段
    6. public AudioClip clip2; // 第二个声音片段
    7. void Start()
    8. {
    9. // 播放第一个声音片段
    10. PlaySound(clip1, 0); // 0表示从头开始播放
    11. // 在3秒后播放第二个声音片段
    12. Invoke("PlaySecondSound", clip1.length + 3.0f); // 在第一个声音片段播放结束后3秒播放第二个声音片段
    13. }
    14. void PlaySound(AudioClip clip, float startTime)
    15. {
    16. audioSource.clip = clip;
    17. audioSource.time = startTime;
    18. audioSource.Play();
    19. }
    20. void PlaySecondSound()
    21. {
    22. PlaySound(clip2, 0); // 从头开始播放第二个声音片段
    23. }
    24. }

    三、播放视频

    视频的播放和声音播放极其类似!区别是视频播放不需要侦听组件,直接一个VideoPlayer(就是播放器组件)完成。

    但是视频需要一个宿主,帮助渲染视频(这个宿主可以是3D物体、也可以是UGUI-RawImage)

    视频播放在3D物体上:比如我们应该首先创建一个游戏物体,确保这个物体有Rendener组件,正常渲染。然后给这个游戏物体添加VideoPlayer组件即可。这个组件可以给任何人!

    在UGUI上创建视频

    首先创建RawImage UI物体,然后添加视频组件

    把视频片段拖上去之后,创建一个可以渲染视频的New Render Texture

    这个渲染类型的贴图,既需要渲染视频,作为Video Player组件的渲染器,也作为Rawimage组件的贴图。分别拖到为Video Player组件的Target Texture中,然后拖到Raw Image组件上的Texture中!

    这样就完成了在UI上播放视频!

    剩下的和声音几乎一致了! 

    拖一个视频到Assets 中,直接赋值给组件Video Clip 即可!现在游戏运行就可以播放了!

    代码控制:

    代码可以实现切换不同的视频进行播放。

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using UnityEngine.Video;
    5. public class PlayVideo : MonoBehaviour
    6. {
    7. // Start is called before the first frame update
    8. public VideoClip[] SomeVideo = new VideoClip[10];
    9. VideoPlayer OneVideoComp;
    10. void Start()
    11. {
    12. OneVideoComp = this.GetComponent();
    13. OneVideoComp.frame = 10;
    14. }
    15. private void Update()
    16. {
    17. Debug.Log(OneVideoComp.frameCount/25);
    18. }
    19. //下面函数关联外部UGUI按钮
    20. public void ButtonClikA()
    21. {
    22. OneVideoComp.clip = SomeVideo[0];
    23. OneVideoComp.Play();
    24. }
    25. public void ButtonClikB()
    26. {
    27. OneVideoComp.clip = SomeVideo[1];
    28. OneVideoComp.Play();
    29. }
    30. }

  • 相关阅读:
    【JokerのZYNQ7020】ubuntu启动后跳过验证登录。
    智能佳-E-PUCK2分布式单体智能集群协作机器人
    java类的练习 -- 声明一个接口(Calculability),接口中
    聚焦AIGC落地,八仙过海,谁更神通?
    LeetCode 21. 合并两个有序链表
    基于JAVA水果食品顺溯源系统计算机毕业设计源码+数据库+lw文档+系统+部署
    卡方分布和 Zipf 分布模拟及 Seaborn 可视化教程
    java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(1)
    单体民宿小程序开发运营方案
    【图像修复】基于改进的Criminisi算法实现图像修复附matlab代码
  • 原文地址:https://blog.csdn.net/leoysq/article/details/134239134