// 导出ExportAudioTrack
        private int ExportAudioTrack(AudioTrack audioTrack, JSONObject trackListArr, JSONObject clipListArr)
        {
            JSONObject trackJSON = GenerateBaseTrack(audioTrack, PlaybaleTrackTypeMap["AudioTrack"]);

#if UNITY_2019_1_OR_NEWER
            UnityEditor.SerializedObject   serializedObject           = new UnityEditor.SerializedObject(audioTrack);
            UnityEditor.SerializedProperty propertiesserializedObject = serializedObject.FindProperty("m_TrackProperties");
            float volume       = propertiesserializedObject.FindPropertyRelative("volume").floatValue;
            float stereoPan    = propertiesserializedObject.FindPropertyRelative("stereoPan").floatValue;
            float spatialBlend = propertiesserializedObject.FindPropertyRelative("spatialBlend").floatValue;
            trackJSON.AddField("volume", volume);
            trackJSON.AddField("stereoPan", stereoPan);
            trackJSON.AddField("spatialBlend", spatialBlend);
#else
            trackJSON.AddField("volume", 1);
            trackJSON.AddField("stereoPan", 0);
            trackJSON.AddField("spatialBlend", 0);
#endif

            JSONObject clipsIndexArr = trackJSON.GetField("clips");
            IEnumerable <TimelineClip> timelineClipList = audioTrack.GetClips();
            int num = 0;
            foreach (TimelineClip timelineClip in timelineClipList)
            {
                JSONObject clipJSON = GenerateBaseTimelineClip(timelineClip, PlaybaleClipTypeMap["Audio"]);
                JSONObject clipData = new JSONObject(JSONObject.Type.OBJECT);
                clipJSON.AddField("data", clipData);

                AudioPlayableAsset asset = (AudioPlayableAsset)timelineClip.asset;
                if ((UnityEngine.Object)asset.clip != (UnityEngine.Object)null)
                {
                    WXAudioClip converter = new WXAudioClip(asset.clip, gameObject);
                    string      clipPath  = AddDependencies(converter);
                    clipData.AddField("clip", clipPath);
                }
                else
                {
                    clipData.AddField("clip", JSONObject.nullJO);
                }
                // clipData.AddField("clipCaps", ClipCapsMap.ContainsKey(timelineClip.clipCaps) ? ClipCapsMap[timelineClip.clipCaps] : ClipCapsMap[ClipCaps.None]);
                // clipData.AddField("duration", (float)asset.duration);

                // 兼容2017没有loop
                UnityEditor.SerializedObject assetSerializedObject = new UnityEditor.SerializedObject(asset);
                bool loop = assetSerializedObject.FindProperty("m_Loop").boolValue;
                clipData.AddField("loop", loop);

#if UNITY_2019_1_OR_NEWER
                UnityEditor.SerializedProperty clipProperties = assetSerializedObject.FindProperty("m_ClipProperties");
                float clipVolume = clipProperties.FindPropertyRelative("volume").floatValue;
                clipData.AddField("volume", clipVolume);
#else
                clipData.AddField("volume", 1);
#endif

                clipsIndexArr.Add(ExportTimelineClip(clipJSON, clipListArr));
                num++;
            }
            return(ExportTrack(trackJSON, trackListArr));
        }
Example #2
0
        protected override JSONObject ToJSON(WXHierarchyContext context)
        {
            JSONObject json           = new JSONObject(JSONObject.Type.OBJECT);
            JSONObject data           = new JSONObject(JSONObject.Type.OBJECT);
            JSONObject effectNodeData = new JSONObject(JSONObject.Type.OBJECT);
            JSONObject pannerNodeData = new JSONObject(JSONObject.Type.OBJECT);

            data.AddField("effectNodeData", effectNodeData);
            data.AddField("pannerNodeData", pannerNodeData);
            json.AddField("type", getTypeName());
            json.AddField("data", data);

            if ((UnityEngine.Object)audioSource.clip != (UnityEngine.Object)null)
            {
                WXAudioClip converter     = new WXAudioClip(audioSource.clip, gameObject);
                string      audioClipPath = converter.Export(context.preset);
                if (audioClipPath != null && audioClipPath != "")
                {
                    data.AddField("clip", audioClipPath);
                    effectNodeData.AddField("clip", audioClipPath);
                    context.AddResource(audioClipPath);
                }
            }
            else
            {
                data.AddField("clip", JSONObject.nullJO);
                effectNodeData.AddField("clip", JSONObject.nullJO);
            }
            string outputAudioMixerGroup = "";

            if ((UnityEngine.Object)audioSource.outputAudioMixerGroup != (UnityEngine.Object)null)
            {
                EditorUtility.DisplayDialog("Error", "暂不支持导出Audio Mixer Group", "确定");
            }
            if (string.IsNullOrEmpty(outputAudioMixerGroup))
            {
                data.AddField("output", JSONObject.nullJO);
            }
            else
            {
                data.AddField("output", outputAudioMixerGroup);
            }
            // audiosource本身的字段
            data.AddField("audioPriority", (uint)audioSource.priority);
            data.AddField("playOnAwake", audioSource.playOnAwake);
            data.AddField("bypassEffects", audioSource.bypassEffects);
            data.AddField("bypassListenerEffects", audioSource.bypassListenerEffects);
            data.AddField("bypassReverbZones", audioSource.bypassReverbZones);
            data.AddField("reverbZoneMix", (float)audioSource.reverbZoneMix);

            // audiosourceNode字段
            effectNodeData.AddField("id", this._genId());
            effectNodeData.AddField("mute", audioSource.mute);
            effectNodeData.AddField("loop", audioSource.loop);
            effectNodeData.AddField("volume", (float)audioSource.volume);
            effectNodeData.AddField("pitch", (float)audioSource.pitch);
            effectNodeData.AddField("__typeName", "AudioSourceNode");

            // pannerNode字段
            pannerNodeData.AddField("id", this._genId());
            pannerNodeData.AddField("stereoPan", (float)audioSource.panStereo);
            pannerNodeData.AddField("spatialBlend", (float)audioSource.spatialBlend);
            string rolloffMode;

            AudioRolloffModeMap.TryGetValue(audioSource.rolloffMode, out rolloffMode);
            pannerNodeData.AddField("distanceModel", rolloffMode);
            pannerNodeData.AddField("maxDistance", audioSource.maxDistance);
            pannerNodeData.AddField("minDistance", audioSource.minDistance);
            effectNodeData.AddField("__typeName", "AudioPannerNode");

            return(json);
        }