【小功能】Unity音频截取部分内容播放

Unity音频截取部分播放

今天接到一个需求从Json文件里可以解析出音频起始时间和结束时间,需要根据此信息只播放某个音频文件起始时间——结束时间的音效(相当于片段)。
搜了下发现信息不是很多,而且感觉很多写的都有问题(头大,还有没注释也就算了,还是错的,啊啊啊~),后续根据网上看到的部分API按思路实现了下,代码如下:

    /// <summary>
    /// 截取音频片段音效并播放
    /// </summary>
    /// <param name="audioClip">截取的音频</param>
    /// <param name="startTime">截取的开始时间</param>
    /// <param name="endTime">截取的结束时间</param>
    public void PlayAudioClipSegment(AudioClip audioClip, float startTime, float endTime)
    {
        // 计算截取片段的长度
        float clipLength = endTime - startTime;

        // 创建一个新的截取剪辑
        AudioClip segment = AudioClip.Create("TempAudio", Mathf.RoundToInt(clipLength * audioClip.frequency), audioClip.channels, audioClip.frequency, false);

        // 计算截取的样本数
        int startSample = Mathf.RoundToInt(startTime * audioClip.frequency);
        int endSample = Mathf.RoundToInt(endTime * audioClip.frequency);
        int segmentLength = endSample - startSample;

        // 从原始音频剪辑中复制样本到截取剪辑
        float[] data = new float[segmentLength * audioClip.channels];
        audioClip.GetData(data, startSample);

        //数据设置进新的片段里
        segment.SetData(data, 0);

        // 播放截取的音频片段
        audioSource.clip = segment;
        audioSource.Play();
    }

目前发现这种方法可行,但不清楚有没有更好或更便捷的方法,我尝试过
audioSource.time = startTime; audioSource.SetScheduledEndTime等来实现,网上也看到有这样写的,但我测试出来并没有得到我想要的效果(不知道是不可行还是我写的不对)。所以目前暂用这种方法,如果有小伙伴有其他方法,跪求大佬告知。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于Unity中的音频播放完毕的问题,您可以通过以下几种方式来处理: 1. 使用Unity的AudioSource组件:在音频播放完毕时,Unity的AudioSource组件会自动触发一个事件。您可以通过添加一个事件侦听器来监听这个事件,并在事件被触发时执行相应的操作。例如,您可以在事件触发时播放下一个音频或执行其他逻辑。 ```csharp using UnityEngine; public class AudioPlayer : MonoBehaviour { private AudioSource audioSource; private void Start() { audioSource = GetComponent<AudioSource>(); audioSource.loop = false; audioSource.playOnAwake = false; audioSource.clip = /* 设置您要播放音频 */; audioSource.Play(); } private void Update() { if (!audioSource.isPlaying) { // 音频播放完毕的逻辑处理 // 播放下一个音频或执行其他操作 } } } ``` 2. 使用Unity的事件系统:您可以自定义一个音频播放完毕的事件,并在音频播放完毕时手动触发该事件。其他脚本可以通过添加事件侦听器来监听这个事件,并在事件被触发时执行相应的操作。 ```csharp using UnityEngine; using UnityEngine.Events; public class AudioPlayer : MonoBehaviour { public UnityEvent onAudioFinished; private AudioSource audioSource; private void Start() { audioSource = GetComponent<AudioSource>(); audioSource.loop = false; audioSource.playOnAwake = false; audioSource.clip = /* 设置您要播放音频 */; audioSource.Play(); } private void Update() { if (!audioSource.isPlaying) { // 音频播放完毕的逻辑处理 onAudioFinished.Invoke(); // 手动触发事件 } } } ``` 希望以上方法能对您有所帮助!如果有任何疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值