はじめに
AudioSourceの3DSoundSettingでカーブを作った後、他のAudioSourceにも同じカーブをコピーしたい場面がありました。
しかし軽く試した限りでは、カーブそのものをCtrl+Cなどから簡単にコピペすることはできなさそうでした。(Unity2017.4.14f1)
そこで私が調べたコピー方法を紹介します!
1.コンポーネントごとコピー
カーブ以外の情報も同じならAudioSourceコンポーネントごとコピー&ペーストでカーブ情報もコピペできました。
右上の歯車からコピー元ではCopy Component、コピー先ではPaste Component Values。
私はこの方法を使いました。
2.キーの値をコピー
部分的な解決策にしかなりませんが、キーの値は参照&コピーできました。
キーを右クリック>EditKeyで数値が出ます。
この数値をコピペしたらキー単体は同じところに打てます。
3.拡張エディタを作る
上の二つの方法でまかなえない場合、拡張エディタを作る方法があります。
以下は先輩に教えていただいた拡張エディタ用スクリプトです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AudioSourceCopy : MonoBehaviour {
[SerializeField] AudioSource m_source1;
[SerializeField] AudioSource m_source2;
public AudioSource source1 { get { return m_source1; } set { m_source1 = value; } }
public AudioSource source2 { get { return m_source2; } set { m_source2 = value; } }
}
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(AudioSourceCopy))]
public class CopyEditor : Editor
{
public override void OnInspectorGUI()
{
AudioSourceCopy copy = target as AudioSourceCopy;
copy.source1 = EditorGUILayout.ObjectField(copy.source1, typeof(AudioSource), true) as AudioSource;
copy.source2 = EditorGUILayout.ObjectField(copy.source2, typeof(AudioSource), true) as AudioSource;
if (GUILayout.Button("コピぺ"))///コピペボタン
{
AnimationCurve curve = copy.source1.GetCustomCurve(AudioSourceCurveType.CustomRolloff);///カーブ取得
copy.source2.SetCustomCurve(AudioSourceCurveType.CustomRolloff, curve);///カーブセット
}
}
}
CopyEditor.csはEditorフォルダーを作りその中に入れます。AudioSourceCopy.csにボタンとかを上書きしてくれます。
AudioSourceCopy.csは適当なオブジェクトに付けます。
そしてコピー元のAudioSourceを上の欄、コピー先のAudioSourceを下の欄に入れます。
この状態で「コピぺ」ボタンを押すと、カーブがコピーされます!
(拡張エディタなので実行中でなくともコピーができます。)
注意
カーブは0とMaxDistanceの位置(左端、右端)にもキーを打っておかないと、以下の二つの図のように引き伸ばされてしまいます。
↑コピー元、コピー先↓
これは仕様によるものでSetCustomCurveにも書かれています。以下引用
The curve will be scaled so that it is applied over AudioSource.maxDistance from the AudioSource.
Note that the internal AnimationCurve to be rescaled to range from 0..1 for performance reasons. This means calling AudioSource.GetCustomCurve will return a potentially different curve to what was just set.
横軸の0とMaxdistanceのところにキーを打つときちんとコピーされます。
参考リファレンス
AudioSource.GetCustomCurveでカーブを取得。
https://docs.unity3d.com/ja/2017.4/ScriptReference/AudioSource.GetCustomCurve.html
AudioSource.SetCustomCurveでカーブをセット。
https://docs.unity3d.com/ja/2017.4/ScriptReference/AudioSource.GetCustomCurve.html
カーブはアニメーションカーブとして情報を持っています。
Editキーで、本来横軸は「距離」なのに「time」になっているのもそのせいかもしれません。
まとめ
コンポーネントごとのコピーやキーの値コピーで済む場合は比較的簡単にコピペできました。
そうでない場合は3番目のように拡張エディタから操作するしかないようです。