中级06/Unity中声障效果

声障效果主要为了体现当听者和发声体之间被阻隔,听者无法直接看到发声体时,为了配合视觉表现音频也要作相应的处理后,得到整体感观效果提升。

本文中我们探讨当声音和听者之间被Mesh阻隔后,我们通过在Cue中创建相关AISAC,并且在Unity中进行调用调整效果来实现声障的表现。

ADX2中设置

一般来说,当声音被墙体阻隔后,由于声音波长的特性,高频的声音会被阻隔而低频的则会穿过障碍物进行传播,因此为了模拟阻隔效果我们需要在Cue上设置一个AISAC控制两个效果,一个是音量,一个是低通滤波:

如上图,我们做了两个极为简单的AISAC控制曲线,让AISAC_Occlusion控制3DMusic的音量和低通滤波。

我们想通过这种方式,当声音和听者之间没有任何阻隔时,我们将会听到AISAC值为0的表现,既没有任何音量衰减和低通效果添加。

而当声音和听者之间存在阻隔时,我们将会听到AISAC大于0(具体由设计师自定)的表现, 存在音量衰减和低通效果添加。

Unity中设置

我们首先要在场景中创建相关内容,让声音和听者之间存在一个阻挡:

如上图所示,我们通过plane以及cube创建了简易场景,在一边放入摄像机,另外一边放入了声音,摄像机上需要添加Cri Atom Listener。

对于声音部分我们也直接进行创建Game Object并将其放在上图所示的位置即可。

创建完成之后,我们需要对声音部分添加脚本如下:

using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

public class Cri3DOcclusion : MonoBehaviour
 {
     // Gameworld Variables
     Transform listenerTransform;
     public LayerMask OcclusionLayer = 1;

// Internal Variables
private CriAtomSource atomSource;

public float minOcclusion = 0.0f
public float maxOcclusion = 0.75f;
public float transitionTime = 0.5f;
private float curOcclusion = 1.0f;

void Start()
{
    listenerTransform = GameObject.Find("Main Camera").GetComponent<Transform>();
    atomSource = gameObject.GetComponent<CriAtomSource>();

    atomSource.Play();
}

void Update()
{
    bool re = Physics.Linecast(transform.position, listenerTransform.position, out RaycastHit hit, OcclusionLayer);

    if (!re)
    {
        Debug.DrawLine(transform.position, listenerTransform.position, Color.blue);
        if (curOcclusion != minOcclusion)
            StartCoroutine(MoveTo(minOcclusion));
    }
    else
    {
        Debug.DrawLine(transform.position, listenerTransform.position, Color.red);
        if (curOcclusion != maxOcclusion)
            StartCoroutine(MoveTo(maxOcclusion));
    }
}

IEnumerator MoveTo(float targetOcclusion)
{
    curOcclusion = Mathf.MoveTowards(curOcclusion, targetOcclusion, Time.deltaTime / transitionTime);

    atomSource.SetAisacControl("AISAC_Occlusion", curOcclusion);
    yield return null;
}
}

脚本主要作用是通过创建听者和发声体之间连线,当他们之间有阻隔时,将会显示为红色,同时将AISAC_Occlusion的值设置为maxOcclusion。

当他们之间没有阻隔时,将会显示为蓝色,同时将AISAC_Occlusion的值设置为mixOcclusion。

我们在ADX2中创建的AISAC_Occlusion作用是通过值来调整整个Cue的音量以及低通滤波效果。如此一来我们就能在阻隔和非阻隔的状态下听到有效果和无效果的音效表现了。

创建的脚本能够更改maxOcclusion和mixOcclusion的值用以调整AISAC,除此之外还拥有Transition Time用以设置两个值之间的过渡速度,使得效果过渡更加自然。

Ringo

CRI Middleware Global Expansion Group

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据