【Unity】3D Sound Settingカーブをコピーする方法について調べてみた

#はじめに
AudioSourceの3DSoundSettingでカーブを作った後、他のAudioSourceにも同じカーブをコピーしたい場面がありました。
しかし軽く試した限りでは、カーブそのものをCtrl+Cなどから簡単にコピペすることはできなさそうでした。（Unity2017.4.14f1)
そこで私が調べたコピー方法を紹介します！
![SnapCrab_2019-5-15_13-12-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/b6d8e995-f0ea-2a5e-97b0-3da1e0c7bb03.png)


#１.コンポーネントごとコピー
カーブ以外の情報も同じならAudioSourceコンポーネントごとコピー＆ペーストでカーブ情報もコピペできました。
![SnapCrab_2019-5-16_11-27-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/e94e3436-63bd-c1c8-47fd-32bb1cae0428.png)
右上の歯車からコピー元では**Copy Component**、コピー先では**Paste Component Values**。
私はこの方法を使いました。
#２.キーの値をコピー
部分的な解決策にしかなりませんが、キーの値は参照＆コピーできました。
キーを右クリック>EditKeyで数値が出ます。
![SnapCrab_2019-5-15_13-49-16_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/95d1e013-b586-6a6e-aafd-ae0fcb6d11ef.png)
この数値をコピペしたらキー単体は同じところに打てます。
#３.拡張エディタを作る
上の二つの方法でまかなえない場合、拡張エディタを作る方法があります。
以下は先輩に教えていただいた拡張エディタ用スクリプトです。

```c#:AudioSourceCopy.cs
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; } }
}
```


```c#:CopyEditor.cs
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を下の欄に入れます。
![SnapCrab_2019-5-23_10-28-27_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/696df90a-e407-82d2-db85-51a72ba9aca0.png)
この状態で「コピぺ」ボタンを押すと、カーブがコピーされます！
（拡張エディタなので実行中でなくともコピーができます。）


**注意**
カーブは0とMaxDistanceの位置（左端、右端）にもキーを打っておかないと、以下の二つの図のように引き伸ばされてしまいます。
![SnapCrab_2019-5-16_14-0-1_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/0e8a14de-ab33-af25-5384-4e29f2661be5.png)
↑コピー元、コピー先↓
![SnapCrab_2019-5-16_14-0-9_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/6575babd-5ca2-5c94-fc54-74a8d9de8a95.png)

これは仕様によるもので[SetCustomCurve](https://docs.unity3d.com/ja/2018.2/ScriptReference/AudioSource.SetCustomCurve.html)にも書かれています。以下引用
>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のところにキーを打つときちんとコピーされます。
![SnapCrab_2019-5-16_14-4-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/7afce0b1-aaa4-3848-1445-f40bb34d88f3.png)

##参考リファレンス
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

カーブは[アニメーションカーブ](https://docs.unity3d.com/ja/2017.4/ScriptReference/AnimationCurve.html)として情報を持っています。
Editキーで、本来横軸は「距離」なのに「time」になっているのもそのせいかもしれません。
![SnapCrab_2019-5-16_13-45-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190043/861bfa74-2025-0cba-cad2-ed6a2d1c0c54.png)

#まとめ
コンポーネントごとのコピーやキーの値コピーで済む場合は比較的簡単にコピペできました。

そうでない場合は3番目のように拡張エディタから操作するしかないようです。