我有大量的预制件。这些预制件具有相同脚本的多个实例,其中包含以下字段:
[SerializeField]
private AudioClip[] _audioClip;
[SerializeField, Range(0, 1)]
private float _volume = 1;
由于我希望能够分别控制每个音频剪辑的音量,我想使用:
[SerializeField]
private VolumedAudioClip[] _audioClips;
其中:
[Serializable]
public class VolumedAudioClip
{
[SerializeField]
public AudioClip _audioClip;
[SerializeField, Range(0, 1)]
public float _volume = 1;
}
问题是,如果我现在更改它,所有预制件将丢失对已设置的音频剪辑的引用。
我知道FormerlySerializedAs
属性,在我的情况下它没有帮助(只有重命名字段时)。
我目前的方向是编写一个编辑器脚本,该脚本将从旧字段中读取并将数据放入新字段中。
很高兴听到任何更好的建议......
答案 0 :(得分:0)
如果您可以灵活地使用List<VolumedAudioClip>
代替VolumedAudioClip[]
,我会为您提供一个非常简单快速的解决方案:
using System.Collections.Generic;
using System;
using UnityEngine;
public class test : MonoBehaviour
{
[SerializeField]
private AudioClip[] _audioClip;
[SerializeField, Range(0, 1)]
private float _volume = 1;
[Serializable]
public class VolumedAudioClip
{
[SerializeField]
public AudioClip_audioClip;
[SerializeField, Range(0, 1)]
public float _volume = 1;
public VolumedAudioClip(AudioClip clip)
{
_audioClip = clip;
}
}
[SerializeField]
private List<VolumedAudioClip> _audioClips;
//THIS ADDS A CONTEXT MENU BUTTON TO THE INSPECTOR!
[ContextMenu("Copy the array")]
private void CopyIt()
{
//To make sure we don't add things multiple times
_audioClips.Clear();
//Than just insert the items from the original array
foreach (AudioClip clip in _audioClip)
{
VolumedAudioClip newClip = new VolumedAudioClip(clip);
_audioClips.Add(newClip);
}
}
}
[ContextMenu]
属性将CopyIt()方法添加到Inspector的Context-Menu。以下是您使用它的方式:(我使用int[] _audioClip
进行演示)
所以在开始时我们已经填充了AudioClip[] _audioClip
的原始数组,并且List<VolumedAudioClip> _audioClips
的列表为空。
现在,如果您转到Inspector中的上下文菜单(齿轮图标),我们的ContextMenu项目“复制数组”就会显示出来。 (这不是真棒!)
点击一下后,您会看到AudioClip[] _audioClip
的元素已复制到新列表List<VolumedAudioClip> _audioClips
注意强>
我写得非常快,而且肯定不完美,所以如果你已经对音量进行了调整而不是再次使用这个功能,那么由于列表再次使用默认值填充,音量调整将会丢失。
所以我会重新使用该功能,然后将其从脚本中删除,这样你就不会意外搞砸了。
希望它可以帮助您