// 导出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)); }
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); }