mirror of
https://github.com/BlackMATov/unity-flash-tools.git
synced 2025-12-17 06:29:20 +07:00
252 lines
6.6 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
} |