LoginSignup
2
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-05-23

はじめに

AudioSourceの3DSoundSettingでカーブを作った後、他のAudioSourceにも同じカーブをコピーしたい場面がありました。
しかし軽く試した限りでは、カーブそのものをCtrl+Cなどから簡単にコピペすることはできなさそうでした。(Unity2017.4.14f1)
そこで私が調べたコピー方法を紹介します!
SnapCrab_2019-5-15_13-12-18_No-00.png

1.コンポーネントごとコピー

カーブ以外の情報も同じならAudioSourceコンポーネントごとコピー&ペーストでカーブ情報もコピペできました。
SnapCrab_2019-5-16_11-27-0_No-00.png
右上の歯車からコピー元ではCopy Component、コピー先ではPaste Component Values
私はこの方法を使いました。

2.キーの値をコピー

部分的な解決策にしかなりませんが、キーの値は参照&コピーできました。
キーを右クリック>EditKeyで数値が出ます。
SnapCrab_2019-5-15_13-49-16_No-00.png
この数値をコピペしたらキー単体は同じところに打てます。

3.拡張エディタを作る

上の二つの方法でまかなえない場合、拡張エディタを作る方法があります。
以下は先輩に教えていただいた拡張エディタ用スクリプトです。

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; } }
}
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
この状態で「コピぺ」ボタンを押すと、カーブがコピーされます!
(拡張エディタなので実行中でなくともコピーができます。)

注意
カーブは0とMaxDistanceの位置(左端、右端)にもキーを打っておかないと、以下の二つの図のように引き伸ばされてしまいます。
SnapCrab_2019-5-16_14-0-1_No-00.png
↑コピー元、コピー先↓
SnapCrab_2019-5-16_14-0-9_No-00.png

これは仕様によるもので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のところにキーを打つときちんとコピーされます。
SnapCrab_2019-5-16_14-4-18_No-00.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

カーブはアニメーションカーブとして情報を持っています。
Editキーで、本来横軸は「距離」なのに「time」になっているのもそのせいかもしれません。
SnapCrab_2019-5-16_13-45-37_No-00.png

まとめ

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

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

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1