Unity序列化字段迁移

时间:2017-12-19 08:43:17

标签: unity3d serialization

我有大量的预制件。这些预制件具有相同脚本的多个实例,其中包含以下字段:

[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属性,在我的情况下它没有帮助(只有重命名字段时)。

我目前的方向是编写一个编辑器脚本,该脚本将从旧字段中读取并将数据放入新字段中。

很高兴听到任何更好的建议......

1 个答案:

答案 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的列表为空。

The ofiginal array is filled

现在,如果您转到Inspector中的上下文菜单(齿轮图标),我们的ContextMenu项目“复制数组”就会显示出来。 (这不是真棒!)

The context menu method

点击一下后,您会看到AudioClip[] _audioClip的元素已复制到新列表List<VolumedAudioClip> _audioClips

The new List with copied content

注意
我写得非常快,而且肯定不完美,所以如果你已经对音量进行了调整而不是再次使用这个功能,那么由于列表再次使用默认值填充,音量调整将会丢失。

所以我会重新使用该功能,然后将其从脚本中删除,这样你就不会意外搞砸了。

希望它可以帮助您