Files
unity-flash-tools/Assets/FlashTools/Scripts/Internal/Editor/SwfAnimationAssetEditor.cs
2016-08-29 23:19:05 +07:00

252 lines
6.6 KiB
C#

using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
namespace FlashTools.Internal {
[CustomEditor(typeof(SwfAnimationAsset)), CanEditMultipleObjects]
public class SwfAnimationAssetEditor : Editor {
List<SwfAnimationAsset> _assets = new List<SwfAnimationAsset>();
bool _settingsFoldout = false;
//
//
//
static string GetAssetPath(SwfAnimationAsset asset) {
return asset
? AssetDatabase.GetAssetPath(asset)
: string.Empty;
}
static string GetSwfPath(SwfAnimationAsset asset) {
var asset_path = GetAssetPath(asset);
return string.IsNullOrEmpty(asset_path)
? string.Empty
: Path.ChangeExtension(asset_path, ".swf");
}
static string GetPrefabPath(SwfAnimationAsset asset) {
var asset_path = GetAssetPath(asset);
return string.IsNullOrEmpty(asset_path)
? string.Empty
: Path.ChangeExtension(asset_path, ".prefab");
}
//
//
//
static void RevertOverriddenSettings(SwfAnimationAsset asset) {
asset.Overridden = asset.Settings;
}
static void OverriddenSettingsToDefault(SwfAnimationAsset asset) {
asset.Overridden = SwfConverterSettings.GetDefaultSettings();
}
static void ApplyOverriddenSettings(SwfAnimationAsset asset) {
if ( File.Exists(GetSwfPath(asset)) ) {
asset.Settings = asset.Overridden;
ReconvertAnimationAsset(asset);
} else {
Debug.LogErrorFormat(
"Swf source for animation not found: '{0}'",
GetSwfPath(asset));
RevertOverriddenSettings(asset);
}
}
static void ReconvertAnimationAsset(SwfAnimationAsset asset) {
AssetDatabase.ImportAsset(
GetSwfPath(asset),
ImportAssetOptions.ForceUpdate);
}
static GameObject CreateAnimationGO(SwfAnimationAsset asset) {
if ( asset ) {
var anim_go = new GameObject(asset.name);
anim_go.AddComponent<MeshFilter>();
anim_go.AddComponent<MeshRenderer>();
anim_go.AddComponent<SwfAnimation>().asset = asset;
anim_go.AddComponent<SwfAnimationController>();
return anim_go;
}
return null;
}
static void CreateAnimationPrefab(SwfAnimationAsset asset) {
var anim_go = CreateAnimationGO(asset);
if ( anim_go ) {
var prefab_path = GetPrefabPath(asset);
if ( !string.IsNullOrEmpty(prefab_path) ) {
var prefab = AssetDatabase.LoadMainAssetAtPath(prefab_path);
if ( !prefab ) {
prefab = PrefabUtility.CreateEmptyPrefab(prefab_path);
}
PrefabUtility.ReplacePrefab(
anim_go,
prefab,
ReplacePrefabOptions.ConnectToPrefab);
}
GameObject.DestroyImmediate(anim_go, true);
}
}
static void CreateAnimationOnScene(SwfAnimationAsset asset) {
var anim_go = CreateAnimationGO(asset);
if ( anim_go ) {
Undo.RegisterCreatedObjectUndo(anim_go, "Instance SwfAnimation");
}
}
//
//
//
void AllAssetsForeach(Action<SwfAnimationAsset> act) {
foreach ( var asset in _assets ) {
act(asset);
}
}
void AllOverriddenSettingsToDefault() {
AllAssetsForeach(p => OverriddenSettingsToDefault(p));
}
void RevertAllOverriddenSettings() {
AllAssetsForeach(p => RevertOverriddenSettings(p));
}
void ApplyAllOverriddenSettings() {
AllAssetsForeach(p => ApplyOverriddenSettings(p));
}
void CreateAllAnimationPrefabs() {
AllAssetsForeach(p => CreateAnimationPrefab(p));
}
void CreateAllAnimationsOnScene() {
AllAssetsForeach(p => CreateAnimationOnScene(p));
}
//
//
//
void ShowUnappliedDialog() {
var unapplied = _assets
.Where(p => !p.Settings.CheckEquals(p.Overridden))
.ToArray();
if ( unapplied.Length > 0 ) {
var title =
"Unapplied swf animation settings";
var message = unapplied.Length == 1
? string.Format(
"Unapplied swf animation settings for '{0}'",
GetAssetPath(unapplied[0]))
: string.Format(
"Unapplied multiple({0}) swf animation settings",
unapplied.Length);
if ( EditorUtility.DisplayDialog(title, message, "Apply", "Revert") ) {
ApplyAllOverriddenSettings();
} else {
RevertAllOverriddenSettings();
}
}
}
void DrawGUISettings() {
SwfEditorUtils.DoWithEnabledGUI(false, () => {
var script_prop = SwfEditorUtils.GetPropertyByName(serializedObject, "m_Script");
EditorGUILayout.PropertyField(script_prop, true);
var atlas_prop = SwfEditorUtils.GetPropertyByName(serializedObject, "Atlas");
EditorGUILayout.PropertyField(atlas_prop, true);
var frames_prop = SwfEditorUtils.GetPropertyByName(serializedObject, "Frames");
if ( frames_prop.isArray ) {
SwfEditorUtils.DoWithMixedValue(
frames_prop.hasMultipleDifferentValues, () => {
EditorGUILayout.IntField("Frame count", frames_prop.arraySize);
});
}
});
_settingsFoldout = EditorGUILayout.Foldout(_settingsFoldout, "Settings");
if ( _settingsFoldout ) {
var it = SwfEditorUtils.GetPropertyByName(serializedObject, "Overridden");
while ( it.NextVisible(true) ) {
EditorGUILayout.PropertyField(it, true);
}
DrawGUISettingsControls();
}
}
void DrawGUISettingsControls() {
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
{
var default_settings = SwfConverterSettings.GetDefaultSettings();
SwfEditorUtils.DoWithEnabledGUI(
_assets.Any(p => !p.Overridden.CheckEquals(default_settings)), () => {
if ( GUILayout.Button("Default") ) {
AllOverriddenSettingsToDefault();
}
});
SwfEditorUtils.DoWithEnabledGUI(
_assets.Any(p => !p.Overridden.CheckEquals(p.Settings)), () => {
if ( GUILayout.Button("Revert") ) {
RevertAllOverriddenSettings();
}
if ( GUILayout.Button("Apply") ) {
ApplyAllOverriddenSettings();
}
});
}
GUILayout.EndHorizontal();
}
void DrawGUIAnimation() {
GUILayout.BeginHorizontal();
{
if ( GUILayout.Button("Create prefab") ) {
CreateAllAnimationPrefabs();
}
if ( GUILayout.Button("Instance to scene") ) {
CreateAllAnimationsOnScene();
}
}
GUILayout.EndHorizontal();
}
// ---------------------------------------------------------------------
//
// Messages
//
// ---------------------------------------------------------------------
void OnEnable() {
_assets = targets
.OfType<SwfAnimationAsset>()
.ToList();
_settingsFoldout =
_assets.Any(p => !p.Settings.CheckEquals(SwfConverterSettings.GetDefaultSettings()));
}
void OnDisable() {
ShowUnappliedDialog();
}
public override void OnInspectorGUI() {
serializedObject.Update();
DrawGUISettings();
DrawGUIAnimation();
if ( GUI.changed ) {
serializedObject.ApplyModifiedProperties();
}
}
}
}