Skip to content

Instantly share code, notes, and snippets.

@TyounanMOTI
Created July 2, 2017 12:40
Show Gist options
  • Save TyounanMOTI/3a23a4ced2591e79a23aa89fe2151361 to your computer and use it in GitHub Desktop.
Save TyounanMOTI/3a23a4ced2591e79a23aa89fe2151361 to your computer and use it in GitHub Desktop.
SFX ReverbのDry Levelを距離減衰・指向性音源による減衰でコントロールするためのコンポーネント
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
[RequireComponent(typeof(AudioSource))]
public class MixerParamAttenuation : MonoBehaviour {
AudioSource source;
AudioMixerGroup mixer;
Transform mainCamera;
[SerializeField]
float maxLevel = 0.0f;
[SerializeField]
float minLevel = -3000.0f;
[SerializeField]
float minAngle = 10.0f;
[SerializeField]
float maxAngle = 180.0f;
[SerializeField]
string ParameterName = "UnityChanDistance";
[SerializeField]
float distanceRatio;
[SerializeField]
float directionalRatio;
[SerializeField]
float angle;
private void Start() {
source = GetComponent<AudioSource>();
mixer = source.outputAudioMixerGroup;
mainCamera = Camera.main.transform;
}
float CalcDistanceAttenuation() {
var distance = Vector3.Distance(transform.position, mainCamera.position);
var minDistance = source.minDistance;
var maxDistance = source.maxDistance;
var ratio = (distance - minDistance) / (maxDistance - minDistance);
if (ratio < 0.0f) {
ratio = 0.0f;
}
var invRatio = 1.0f - ratio;
var invSquareRatio = Mathf.Pow(invRatio, 2.0f);
return invSquareRatio;
}
float CalcDirectionalAttenuation() {
var sourceToCamera = mainCamera.position - source.transform.position;
var sourceDirection = source.transform.forward;
Debug.DrawRay(source.transform.position, sourceToCamera);
Debug.DrawRay(source.transform.position, sourceDirection, Color.red);
angle = Vector3.Angle(sourceDirection, sourceToCamera);
var ratio = (angle - minAngle) / (maxAngle - minAngle);
if (ratio < 0.0f) {
ratio = 0.0f;
}
var invRatio = 1.0f - ratio;
var invSquareRatio = Mathf.Pow(invRatio, 2.0f);
return invSquareRatio;
}
private void Update() {
// 距離減衰
distanceRatio = CalcDistanceAttenuation();
// 指向性音源
directionalRatio = CalcDirectionalAttenuation();
var ratio = distanceRatio * directionalRatio;
var dryLevel = Mathf.Lerp(minLevel, maxLevel, ratio);
mixer.audioMixer.SetFloat(ParameterName, dryLevel);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment