JsonUIData.h
#pragma once
#include "Storable.h"
#include "JsonUIFloatType.h"
struct JsonUIData
{
std::string uiName;
std::array<float, JsonUIFloatType::NUM> floats;
int uiIndex;
int parentUIIndex = -1;
std::string imagePath;
std::string koreanImagePath;
std::string englishImagePath;
std::string japaneseImagePath;
int imagePriority;
std::vector<int> openTargets;
std::vector<int> closeTargets;
std::vector<int> disablePropagationTargets;
std::vector<int> enablePropagationTargets;
std::vector<int> hoverEnableTargets;
std::vector<float> color;
std::vector<float> pivot;
std::vector<float> anchor;
std::vector<float> anchoredPosition;
std::vector<float> enableOffset;
std::vector<float> disableOffset;
bool popUpX, popUpY, popUpZ;
bool popDownX, popDownY, popDownZ;
std::vector<int> numberDigits;
int numberFontSet;
std::vector<int> numberFontSetImages;
bool numberCeil;
bool numberShowZero;
std::string soundOnClick;
std::string soundOnHover;
std::string soundOnEnable;
std::string soundOnDisable;
int enableCurveType;
int disableCurveType;
int dependentUpgrade{ -1 };
vector<float> linearClipOnEnableStart;
vector<float> linearClipOnEnableDir;
int linearClipOnEnableCurveType;
vector<float> linearClipOnDisableStart;
vector<float> linearClipOnDisableDir;
int linearClipOnDisableCurveType;
vector<float> colorTintOnEnableStart;
vector<float> colorTintOnEnableEnd;
int colorTintOnEnableCurveType;
vector<float> colorTintOnDisableStart;
vector<float> colorTintOnDisableEnd;
int colorTintOnDisableCurveType;
int barCells_CellNumber;
bool disableOnStartEdtior;
bool disableOnStartExe;
string musicPlayOnEnable_musicClip;
string musicPlayOnDisable_musicClip;
std::vector<int> exclusiveEnableGroup;
string animatedSpriteFolderPath;
bool animatedSpriteIsRepeat;
bool duplicate_poolable;
string videoPath1;
string videoPath2;
bool videoUnscaledDeltaTime;
bool centerAlign;
bool reAlignOnDisable;
int customFlags;
int customFlags2;
int enumID;
int soundEnumID;
FROM_JSON(JsonUIData);
};
(Json 형식으로 저장되는 UI 객체 하나의 정보)
UIExportFlag.h
enum class UIExportFlag
{
None = 0,
IsButton = 1 << 0,
CloseButton = 1 << 1,
OpeningButton = 1 << 2,
GrayScaleDisable = 1 << 4,
IsPoppingUp = 1 << 5,
IsPoppingDown = 1 << 6,
IsIncludingTooltips = 1 << 7,
DisableOnStart = 1 << 8,
IsToggle = 1 << 9,
IsTranslatingOnEnable = 1 << 10,
IsTranslatingOnDisable = 1 << 11,
CanAdjustHeight = 1 << 13,
CanAdjustWidth = 1 << 14,
CanAdjustRadialFill = 1 << 15,
IsBlankImage = 1 << 16,
NoOverlaying = 1 << 17,
IsPulsing = 1 << 18,
IsNumber = 1 << 19,
PlaySoundOnClick = 1 << 20,
PlaySoundOnHover = 1 << 21,
PlaySoundOnEnable = 1 << 22,
PlaySoundOnDisable = 1 << 23,
PriorityLayout = 1 << 24,
IsDigitFont = 1 << 25,
IsSkillUpgrade = 1 << 26,
ScaledByResolution = 1 << 27,
TimeStopOnEnable = 1 << 28,
TimeContinueOnDisable = 1 << 29,
ColorTintOnEnable = 1 << 30,
ColorTintOnDisable = 1 << 31,
};
enum class UIExportFlag2
{
None = 0,
LinearClipOnEnable = 1 << 0,
LinearClipOnDisable = 1 << 1,
Duplicatable = 1 << 2,
IsBarCells = 1 << 3,
AdjustLinearClip = 1 << 4,
PlayMusicOnEnable = 1 << 5,
PlayMusicOnDisable = 1 << 6,
PauseMusicOnEnable = 1 << 7,
UnPauseMusicOnDisable = 1 << 8,
MultiplyMusicVolumeOnEnableDisable = 1 << 9,
ExclusiveEnable = 1 << 10,
DisableAfterEnable = 1 << 11,
Dialogue_Manual = 1 << 12,
Dialogue_Timed = 1 << 13,
RedundantEnable = 1 << 14,
AnimatedSprite = 1 << 15,
ScriptUI = 1 << 16,
EnumSound = 1 << 17,
Rotating = 1 << 18,
StartGameButton = 1 << 19,
ReturnToTitleButton = 1 << 20,
Video = 1 << 21,
PropagateEnable = 1 << 22,
PropagateDisable = 1 << 23,
CapsuleClip = 1 << 24,
DisableOnlyOnImport = 1 << 25,
MultiLanguage = 1 << 26,
};
( UI 객체의 속성을 나타내는 플래그 )
UIEnumID
#pragma once
#include "PodStructs.h"
enum class UIEnumID
{
None = 0,
CharInfo_Robin,
CharInfo_Ursula,
CharInfo_Hansel,
CharInfo_Robin_Left,
CharInfo_Ursula_Left,
CharInfo_Hansel_Left,
CharInfo_Portrait,
CharInfo_PortraitBloodOverlay,
CharInfo_NameTag,
CharInfo_HP_Fill,
CharInfo_HP_Number_Current,
CharInfo_HP_Number_Max,
CharInfo_Buff_Bleeding,
CharInfo_Buff_Blinding,
CharInfo_Buff_Paralysis,
CharInfo_Buff_KnockBack,
CharInfo_Buff_Taunted,
CharInfo_Buff_UrsulaSelf,
CharInfo_Buff_HanselBuff,
CharInfo_Buff_HanselDebuff,
CharInfo_Skill_Use_Q,
CharInfo_Skill_Use_Q_Overlay,
CharInfo_Skill_Use_Q_Cooltime_Number,
CharInfo_Skill_Use_W,
CharInfo_Skill_Use_W_Overlay,
CharInfo_Skill_Use_W_Cooltime_Number,
Toggle_TacticMode,
Toggle_TacticMode_Overlay,
Toggle_TacticMode_Cooltime_Number,
ManaBar1,
ManaBar2,
ManaBarSpendOverlay1,
ManaBarSpendOverlay2,
Mana_Text_CurrentMP,
Mana_Text_CurrentMP_Tactic,
Mana_Text_MaxMP,
Mana_Text_MaxMP_Tactic,
Sound_On,
Sound_Off,
Music_On,
Music_Off,
Ingame_Bottom_Layout,
Ingame_MenuButton,
Ingame_Combo_Number,
Ingame_Combo_Text,
Ingame_Combo_DescriptionTitleImg,
Ingame_Combo_Description1,
Ingame_Combo_DescriptionImageUnfinished1,
Ingame_Combo_DescriptionImageFinished1,
Ingame_Combo_TargetNumUnfinished1,
Ingame_Combo_TargetNumFinished1,
Ingame_Combo_Check1,
Ingame_Combo_Description2,
Ingame_Combo_DescriptionImageUnFinished2,
Ingame_Combo_DescriptionImageFinished2,
Ingame_Combo_TargetNumUnfinished2,
Ingame_Combo_TargetNumFinished2,
Ingame_Combo_Check2,
Ingame_Combo_Description3,
Ingame_Combo_DescriptionImageUnFinished3,
Ingame_Combo_DescriptionImageFinished3,
Ingame_Combo_TargetNumUnfinished3,
Ingame_Combo_TargetNumFinished3,
Ingame_Combo_Check3,
Ingame_Vinetting,
BlackMask_Alpha,
BlackMask_RightToLeft,
BlackMask_TopToBottom,
BlackMask_LeftToRight,
BlackMask_BottomToTop,
BlackMask_GameLoad,
BlackMask_GameEnd,
LetterBox_Top,
LetterBox_Bottom,
InGame_SkiltreeMenu_Active,
InGame_SkiltreeMenu_InActive,
SkillPoint_Number,
SkillUpgradeButtonRobin00,
SkillUpgradeButtonRobin11,
SkillUpgradeButtonRobin12,
SkillUpgradeButtonRobin21,
SkillUpgradeButtonRobin22,
SkillUpgradeButtonUrsula00,
SkillUpgradeButtonUrsula11,
SkillUpgradeButtonUrsula12,
SkillUpgradeButtonUrsula21,
SkillUpgradeButtonUrsula22,
SkillUpgradeButtonHansel00,
SkillUpgradeButtonHansel11,
SkillUpgradeButtonHansel12,
SkillUpgradeButtonHansel21,
SkillUpgradeButtonHansel22,
SkillUpgradeButton_UpgradedImage,
SkillUpgradeButton_Upgradable,
SkillUpgradeButton_InUpgradableImage,
PopUpMessage_NotEnoughSP,
PopUpMessage_RequirementNotMet,
PopUpMessage_PermissionForUpgrade,
PopUpMessage_PermissionForUpgradeProceedButton,
PopUpMessage_WarningForRestart,
PopUpMessage_WarningForRestart_ProceedButton,
StatusBar_Elite,
StatusBar_MeleeEnemy,
StatusBar_Hero_Robin,
StatusBar_Hero_Ursula,
StatusBar_Hero_Hansel,
StatusBar_Boss,
StatusBar_LeftDoor,
StatusBar_RightDoor,
StatusBar_Boss_Tactic,
StatusBar_LeftDoor_Tactic,
StatusBar_RightDoor_Tactic,
StatusBar_HP_Number_Current,
StatusBar_HP_Number_Max,
StatusBar_HP_Cells,
StatusBar_HP_Fill,
StatusBar_SelectionName,
TitleRoot,
Quit_Proceed,
MouseCursor,
MouseCursor_Free,
MouseCursor_Skill,
MouseCursor_AttackMove,
MouseCursor_OnButton,
MouseCursor_OnEnemy,
MouseCursor_OnAlly,
MoveTargetFeedbackAnimSprites,
AttackMoveTargetFeedbackAnimSprites,
ErrorPopup_NoMana,
ErrorPopup_Cooltime,
ErrorPopup_CantLand,
ErrorPopup_TacticQueueFull,
VictoryPage,
DefeatPage,
TacticModeIngameUI,
TacticModeRevertButton_Active,
TacticModeRevertButton_InActive,
TacticModeCommandIcon1,
TacticModeCommandIcon2,
TacticModeCommandIcon3,
TacticModeCommandIcon4,
TacticModeCommandIcon5,
TacticModeCommandIcon6,
TacticModeCommandIcon7,
TacticModeCommandIcon8,
TacticModeCommandIcon9,
TacticModeCommandIcon10,
TacticModeCommandIcon11,
TacticModeCommandIcon12,
BeaconOutside_Robin,
BeaconOutside_Ursula,
BeaconOutside_Hansel,
BeaconOutside_Arrow,
DamageIndicator_Default,
DamageIndicator_Critical,
DamageIndicator_Default_RedFont,
DamageIndicator_Critical_RedFont,
DamageIndicator_Default_BlueFont,
DamageIndicator_Critical_BlueFont,
DamageIndicator_Default_Cyan,
DamageIndicator_Critical_Cyan,
DamageIndicator_Default_BlackWhiteFont,
DamageIndicator_Critical_BlackWhiteFont,
DamageIndicator_Missed,
DamageIndicator_Number,
BossUI_Default,
BossUI_Tactic,
CheckPointReached,
LoadCheckPointButton1,
LoadCheckPointButton2,
InGameMenu,
Localization,
};
( 특정 UI들의 고유한 ID를 나타내는 Enum )
UIYutility.cs, 유니티에서 UI 데이터를 내보내는데 쓰이는 클래스
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.IO;
using UnityEngine.Windows.Speech;
using Newtonsoft.Json.Serialization;
using UnityEngine.UI;
using UnityEngine.Assertions;
using JetBrains.Annotations;
using System;
using System.Linq;
public class UIYutility : MonoBehaviour
{
[Serializable]
public class UIDataList : List<UIExportJsonData>
{
public List<UIExportJsonData> dataList = new List<UIExportJsonData>();
}
[MenuItem("Yutility/Export ui data")]
private static void ExportUIData()
{
string path = EditorUtility.SaveFilePanel("Save file as...", "", "new iwui data", "iwui");
if (path == "")
{
return;
}
Dictionary<GameObject, int> uiIDDictanary = new Dictionary<GameObject, int>();
HashSet<string> foundManualDialogues = new HashSet<string>();
HashSet<string> foundTimedDialogues = new HashSet<string>();
HashSet<string> foundScriptUI = new HashSet<string>();
HashSet<SoundEnumComp.SoundEnumID> foundSounds = new HashSet<SoundEnumComp.SoundEnumID>();
HashSet<UIEnumIDComp.UIEnumID> foundUIIds = new HashSet<UIEnumIDComp.UIEnumID>();
UIDataList uilist = new UIDataList();
bool failedAlready = false;
string jsonString = "";
List<GameObject> roots = new List<GameObject>();
List<GameObject> taggedObjects = new List<GameObject>();
UnityEngine.SceneManagement.Scene currentScene = SceneManager.GetActiveScene();
currentScene.GetRootGameObjects(roots);
foreach (var each in roots)
{
DFS(each, "UIExportTarget", taggedObjects, uiIDDictanary);
}
foreach (var each in taggedObjects)
{
try
{
each.transform.localScale = Vector3.one;
UIExportJsonData data = new UIExportJsonData();
data.floats = new float[(int)JsonUIFloatType.NUM];
data.uiName = each.name;
data.uiIndex = uiIDDictanary[each];
if (each.transform.parent && each.transform.parent.tag == "UIExportTarget")
{
data.parentUIIndex = uiIDDictanary[each.transform.parent.gameObject];
}
var imageComp = each.GetComponent<UnityEngine.UI.Image>();
if (imageComp)
{
data.imagePath = AssetDatabase.GetAssetPath(imageComp.sprite);
data.imagePath = data.imagePath.Replace("Assets/Resources/", "");
if (data.imagePath == "")
{
data.customFlags |= (int)UIExportFlag.IsBlankImage;
}
data.color = new float[] { imageComp.color.r, imageComp.color.g, imageComp.color.b, imageComp.color.a };
}
var rectTransform = each.GetComponent<RectTransform>();
Assert.IsTrue(rectTransform.anchorMin == rectTransform.anchorMax);
data.pivot = new float[] { rectTransform.pivot.x, rectTransform.pivot.y };
data.anchor = new float[] { rectTransform.anchorMax.x, rectTransform.anchorMax.y };
data.anchoredPosition = new float[] { rectTransform.anchoredPosition.x, rectTransform.anchoredPosition.y };
data.floats[(int)JsonUIFloatType.rotation] = rectTransform.localRotation.eulerAngles.z;
data.floats[(int)JsonUIFloatType.width] = rectTransform.sizeDelta.x;
data.floats[(int)JsonUIFloatType.height] = rectTransform.sizeDelta.y;
if (each.GetComponent<AnchoredPosMustBeZero>())
{
data.anchoredPosition[0] = 0;
data.anchoredPosition[1] = 0;
}
if (each.GetComponent<UIDoesPopup>())
{
var comp = each.GetComponent<UIDoesPopup>();
data.customFlags |= (int)UIExportFlag.IsPoppingUp;
data.floats[(int)JsonUIFloatType.popUpDuration] = comp.popUpDuration;
data.floats[(int)JsonUIFloatType.popUpFrom] = comp.popUpFrom;
data.floats[(int)JsonUIFloatType.popUpTo] = comp.popUpTo;
data.popUpX = comp.popUpX;
data.popUpY = comp.popUpY;
data.popUpZ = comp.popUpZ;
}
if (each.GetComponent<UIDoesPopDown>())
{
var comp = each.GetComponent<UIDoesPopDown>();
data.customFlags |= (int)UIExportFlag.IsPoppingDown;
data.floats[(int)JsonUIFloatType.popDownDuration] = comp.popDownDuration;
data.floats[(int)JsonUIFloatType.popDownFrom] = comp.popDownFrom;
data.floats[(int)JsonUIFloatType.popDownTo] = comp.popDownTo;
data.popDownX = comp.popDownX;
data.popDownY = comp.popDownY;
data.popDownZ = comp.popDownZ;
}
if (each.GetComponent<UIIncludingTooltips>())
{
var comp = each.GetComponent<UIIncludingTooltips>();
data.customFlags |= (int)UIExportFlag.IsButton;
data.customFlags |= (int)UIExportFlag.IsIncludingTooltips;
data.hoverEnableTargets = comp.tooltips.Select(each => uiIDDictanary[each]).ToArray();
}
if (each.GetComponent<UIIsOpeningButton>())
{
var comp = each.GetComponent<UIIsOpeningButton>();
data.customFlags |= (int)UIExportFlag.IsButton;
data.customFlags |= (int)UIExportFlag.OpeningButton;
if (each.GetComponent<UIIsOpeningButton>().canToggle)
{
data.customFlags |= (int)UIExportFlag.IsToggle;
}
if (comp.targets != null)
{
foreach (var eachOpenTarget in comp.targets)
{
if (eachOpenTarget == null)
{
Debug.LogError("null target at " + comp.gameObject.name, comp.gameObject);
}
}
data.openTargets = comp.targets.Where(each => each != null).Select(each => uiIDDictanary[each]).ToArray();
}
}
if (each.GetComponent<UICloseButton>())
{
var comp = each.GetComponent<UICloseButton>();
data.customFlags |= (int)UIExportFlag.IsButton;
data.customFlags |= (int)UIExportFlag.CloseButton;
if (comp.targets != null)
{
foreach (var eachCloseTarget in comp.targets)
{
if (eachCloseTarget == null)
{
Debug.LogError("null target at " + comp.gameObject.name, comp.gameObject);
}
}
data.closeTargets = comp.targets.Select(each => uiIDDictanary[each]).ToArray();
}
}
if (each.GetComponent<PropagateDisable>())
{
var comp = each.GetComponent<PropagateDisable>();
data.customFlags2 |= (int)UIExportFlag2.PropagateDisable;
if (comp.targets != null)
{
data.disablePropagationTargets = comp.targets.Select(each => uiIDDictanary[each]).ToArray();
}
}
if (each.GetComponent<PropagateEnable>())
{
var comp = each.GetComponent<PropagateEnable>();
data.customFlags2 |= (int)UIExportFlag2.PropagateEnable;
if (comp.targets != null)
{
data.enablePropagationTargets = comp.targets.Select(each => uiIDDictanary[each]).ToArray();
}
}
if (each.GetComponent<UITranslatingOnEnable>())
{
var comp = each.GetComponent<UITranslatingOnEnable>();
data.customFlags |= (int)UIExportFlag.IsTranslatingOnEnable;
data.floats[(int)JsonUIFloatType.enableDelay] = comp.delayTime;
data.floats[(int)JsonUIFloatType.enableDuration] = comp.transitioningDuration;
data.enableOffset = new float[] { comp.offset.x, comp.offset.y };
data.enableCurveType = (int)comp.curveType;
}
if (each.GetComponent<UITranslatingOnDisable>())
{
var comp = each.GetComponent<UITranslatingOnDisable>();
data.customFlags |= (int)UIExportFlag.IsTranslatingOnDisable;
data.floats[(int)JsonUIFloatType.disableDelay] = comp.delayTime;
data.floats[(int)JsonUIFloatType.disableDuration] = comp.transitioningDuration;
data.disableOffset = new float[] { comp.offset.x, comp.offset.y };
data.disableCurveType = (int)comp.curveType;
}
if (each.GetComponent<CanAdjustHeight>())
{
data.customFlags |= (int)UIExportFlag.CanAdjustHeight;
data.floats[(int)JsonUIFloatType.adjustingRate] = each.GetComponent<CanAdjustHeight>().adjustingRate;
}
if (each.GetComponent<CanAdjustWidth>())
{
data.customFlags |= (int)UIExportFlag.CanAdjustWidth;
data.floats[(int)JsonUIFloatType.adjustingRate] = each.GetComponent<CanAdjustWidth>().adjustingRate;
}
if (each.GetComponent<CanAdjustRadialFill>())
{
data.customFlags |= (int)UIExportFlag.CanAdjustRadialFill;
data.floats[(int)JsonUIFloatType.adjustingRate] = each.GetComponent<CanAdjustRadialFill>().adjustingRate;
}
if (each.GetComponent<DisableOnStart>())
{
data.customFlags |= (int)UIExportFlag.DisableOnStart;
data.disableOnStartEdtior = each.GetComponent<DisableOnStart>().disableOnStartEditor;
data.disableOnStartExe = each.GetComponent<DisableOnStart>().disableOnStartExe;
if (each.GetComponent<DisableOnStart>().disableOnlyOnImport)
{
data.customFlags2 |= (int)UIExportFlag2.DisableOnlyOnImport;
}
}
if (each.GetComponent<UINoOverlaying>())
{
data.customFlags |= (int)UIExportFlag.NoOverlaying;
}
if (each.GetComponent<CapsuleClip>())
{
data.customFlags2 |= (int)UIExportFlag2.CapsuleClip;
}
if (each.GetComponent<IsPulsing>())
{
var comp = each.GetComponent<IsPulsing>();
data.customFlags |= (int)UIExportFlag.IsPulsing;
data.floats[(int)JsonUIFloatType.pulsingMax] = comp.pulsingSizeMax;
data.floats[(int)JsonUIFloatType.pulsingMin] = comp.pulsingSizeMin;
data.floats[(int)JsonUIFloatType.pulsingPeriod] = comp.pulsingPeriod;
}
if (each.GetComponent<PlaySoundOnClick>())
{
data.customFlags |= (int)UIExportFlag.PlaySoundOnClick;
data.soundOnClick = AssetDatabase.GetAssetPath(each.GetComponent<PlaySoundOnClick>().sound);
data.soundOnClick = data.soundOnClick.Replace("Assets/Resources/", "");
}
if (each.GetComponent<PlaySoundOnHover>())
{
data.customFlags |= (int)UIExportFlag.PlaySoundOnHover;
data.soundOnHover = AssetDatabase.GetAssetPath(each.GetComponent<PlaySoundOnHover>().sound);
data.soundOnHover = data.soundOnHover.Replace("Assets/Resources/", "");
}
if (each.GetComponent<PlaySoundOnEnable>())
{
data.customFlags |= (int)UIExportFlag.PlaySoundOnEnable;
data.soundOnEnable = AssetDatabase.GetAssetPath(each.GetComponent<PlaySoundOnEnable>().sound);
data.soundOnEnable = data.soundOnEnable.Replace("Assets/Resources/", "");
}
if (each.GetComponent<PlaySoundOnDisable>())
{
data.customFlags |= (int)UIExportFlag.PlaySoundOnDisable;
data.soundOnDisable = AssetDatabase.GetAssetPath(each.GetComponent<PlaySoundOnDisable>().sound);
data.soundOnDisable = data.soundOnDisable.Replace("Assets/Resources/", "");
}
if (each.GetComponent<IsNumber>())
{
var comp = each.GetComponent<IsNumber>();
data.customFlags |= (int)UIExportFlag.IsNumber;
data.numberCeil = comp.ceil;
data.numberShowZero = comp.showZero;
try
{
data.numberDigits = comp.digits.Select(each => uiIDDictanary[each.gameObject]).ToArray();
}
catch (Exception e)
{
Debug.LogError(e.Message, each.gameObject);
throw e;
}
data.numberFontSet = uiIDDictanary[comp.font.gameObject];
}
if (each.GetComponent<PriorityLayout>())
{
var comp = each.GetComponent<PriorityLayout>();
data.customFlags |= (int)UIExportFlag.PriorityLayout;
data.floats[(int)JsonUIFloatType.layoutNormalizingTime] = comp.normalizingTime;
data.centerAlign = comp.centerAlign;
data.reAlignOnDisable = comp.reAlignOnDisable;
}
if (each.GetComponent<SkillUpgradeButton>())
{
var comp = each.GetComponent<SkillUpgradeButton>();
data.customFlags |= (int)UIExportFlag.IsSkillUpgrade;
if (comp.dependentButton)
{
data.dependentUpgrade = uiIDDictanary[comp.dependentButton.gameObject];
}
else
{
data.dependentUpgrade = -1;
}
}
if (each.GetComponent<DigitFont>())
{
data.customFlags |= (int)UIExportFlag.IsDigitFont;
data.numberFontSetImages = each.GetComponentsInChildren<Image>().Select(each => uiIDDictanary[each.gameObject]).ToArray();
}
if (each.GetComponent<ImagePriority>())
{
var comp = each.GetComponent<ImagePriority>();
data.imagePriority = comp.priority;
}
if (each.GetComponent<TimeStopOnEnable>())
{
var comp = each.GetComponent<TimeStopOnEnable>();
data.customFlags |= (int)UIExportFlag.TimeStopOnEnable;
data.floats[(int)JsonUIFloatType.timeStoppingDuration] = comp.timeStoppingDuration;
}
if (each.GetComponent<TimeContinueOnDisable>())
{
data.customFlags |= (int)UIExportFlag.TimeContinueOnDisable;
}
if (each.GetComponent<ColorTintOnEnable>())
{
var comp = each.GetComponent<ColorTintOnEnable>();
data.customFlags |= (int)UIExportFlag.ColorTintOnEnable;
data.colorTintOnEnableStart = new float[] { comp.startColor.r, comp.startColor.g, comp.startColor.b, comp.startColor.a };
data.colorTintOnEnableEnd = new float[] { comp.endColor.r, comp.endColor.g, comp.endColor.b, comp.endColor.a };
data.colorTintOnEnableCurveType = (int)comp.curveType;
data.floats[(int)JsonUIFloatType.colorTintOnEnableDuration] = comp.duration;
}
if (each.GetComponent<ColorTintOnDisable>())
{
var comp = each.GetComponent<ColorTintOnDisable>();
data.customFlags |= (int)UIExportFlag.ColorTintOnDisable;
data.colorTintOnDisableStart = new float[] { comp.startColor.r, comp.startColor.g, comp.startColor.b, comp.startColor.a };
data.colorTintOnDisableEnd = new float[] { comp.endColor.r, comp.endColor.g, comp.endColor.b, comp.endColor.a };
data.colorTintOnDisableCurveType = (int)comp.curveType;
data.floats[(int)JsonUIFloatType.colorTintOnDisableDuration] = comp.duration;
}
if (each.GetComponent<LinearClipOnEnable>())
{
var comp = each.GetComponent<LinearClipOnEnable>();
data.customFlags2 |= (int)UIExportFlag2.LinearClipOnEnable;
data.linearClipOnEnableStart = new float[] { comp.startPos.x, comp.startPos.y };
data.linearClipOnEnableDir = new float[] { comp.clipDirection.x, comp.clipDirection.y };
data.floats[(int)JsonUIFloatType.linearClipOnEnableDuration] = comp.clipDuration;
data.linearClipOnEnableCurveType = (int)comp.curveType;
}
if (each.GetComponent<LinearClipOnDisable>())
{
var comp = each.GetComponent<LinearClipOnDisable>();
data.customFlags2 |= (int)UIExportFlag2.LinearClipOnDisable;
data.linearClipOnDisableStart = new float[] { comp.startPos.x, comp.startPos.y };
data.linearClipOnDisableDir = new float[] { comp.clipDirection.x, comp.clipDirection.y };
data.floats[(int)JsonUIFloatType.linearClipOnDisableDuration] = comp.clipDuration;
data.linearClipOnDisableCurveType = (int)comp.curveType;
}
if (each.GetComponent<IsDuplicatable>())
{
var comp = each.GetComponent<IsDuplicatable>();
data.customFlags2 |= (int)UIExportFlag2.Duplicatable;
data.duplicate_poolable = comp.poolable;
}
if (each.GetComponent<BarCells>())
{
var comp = each.GetComponent<BarCells>();
data.customFlags2 |= (int)UIExportFlag2.IsBarCells;
data.floats[(int)JsonUIFloatType.barCells_BarWidth] = comp.gaugeFill.rectTransform.sizeDelta.x;
data.floats[(int)JsonUIFloatType.barCells_BarHeight] = comp.gaugeFill.rectTransform.sizeDelta.y;
data.barCells_CellNumber = comp.cellCount;
data.floats[(int)JsonUIFloatType.barCells_GaugePerCell] = comp.gaugePerCell;
}
if (each.GetComponent<AdjustLinearClip>())
{
var comp = each.GetComponent<AdjustLinearClip>();
data.customFlags2 |= (int)UIExportFlag2.AdjustLinearClip;
data.floats[(int)JsonUIFloatType.adjustLinearClipDirectionX] = comp.clipDirection.x;
data.floats[(int)JsonUIFloatType.adjustLinearClipDirectionY] = comp.clipDirection.y;
data.floats[(int)JsonUIFloatType.adjustLinearClipStartX] = comp.clipStart.x;
data.floats[(int)JsonUIFloatType.adjustLinearClipStartY] = comp.clipStart.y;
data.floats[(int)JsonUIFloatType.adjustLinearClipAdjustingRate] = comp.adjustingRate;
}
if (each.GetComponent<UIPlayMusicOnEnable>())
{
var comp = each.GetComponent<UIPlayMusicOnEnable>();
data.customFlags2 |= (int)UIExportFlag2.MusicPlayOnEnable;
data.floats[(int)JsonUIFloatType.musicPlayOnEnable_fadeIn] = comp.fadeInTime;
data.floats[(int)JsonUIFloatType.musicPlayOnEnable_fadeOut] = comp.fadeOutTime;
if (comp.clip != null)
{
data.musicPlayOnEnable_musicClip = AssetDatabase.GetAssetPath(comp.clip);
data.musicPlayOnEnable_musicClip = data.musicPlayOnEnable_musicClip.Replace("Assets/Resources/", "");
}
}
if (each.GetComponent<UIPlayMusicOnDisable>())
{
var comp = each.GetComponent<UIPlayMusicOnDisable>();
data.customFlags2 |= (int)UIExportFlag2.MusicPlayOnDisable;
data.floats[(int)JsonUIFloatType.musicPlayOnDisable_fadeIn] = comp.fadeInTime;
data.floats[(int)JsonUIFloatType.musicPlayOnDisable_fadeOut] = comp.fadeOutTime;
if (comp.clip != null)
{
data.musicPlayOnDisable_musicClip = AssetDatabase.GetAssetPath(comp.clip);
data.musicPlayOnDisable_musicClip = data.musicPlayOnDisable_musicClip.Replace("Assets/Resources/", "");
}
}
if (each.GetComponent<MusicUnpauseOnDisable>())
{
data.customFlags2 |= (int)UIExportFlag2.MusicUnpauseOnDisable;
}
if (each.GetComponent<MusicPauseOnEnable>())
{
data.customFlags2 |= (int)UIExportFlag2.MusicPauseOnEnable;
}
if (each.GetComponent<MusicMultiplyVolumeOnEnableDisable>())
{
var comp = each.GetComponent<MusicMultiplyVolumeOnEnableDisable>();
data.customFlags2 |= (int)UIExportFlag2.MusicMultiplyVolumeOnEnableDisable;
data.floats[(int)JsonUIFloatType.musicMultiplyVolumeOnEnableDisable_enableFactor] = comp.enableFactor;
data.floats[(int)JsonUIFloatType.musicMultiplyVolumeOnEnableDisable_fadeDuration] = comp.fadeDuration;
}
if (each.GetComponent<ExclusiveEnable>())
{
var comp = each.GetComponent<ExclusiveEnable>();
data.customFlags2 |= (int)UIExportFlag2.ExclusiveEnable;
data.exclusiveEnableGroup = comp.exclusiveGroup.Select(each => uiIDDictanary[each]).ToArray();
}
if (each.GetComponent<DisableAfterEnable>())
{
var comp = each.GetComponent<DisableAfterEnable>();
data.customFlags2 |= (int)UIExportFlag2.DisableAfterEnable;
data.floats[(int)JsonUIFloatType.disableAfterEnable_delayUntilDisable] = comp.delayUntilDisable;
}
if (each.GetComponent<Dialogue_Manual>())
{
var comp = each.GetComponent<Dialogue_Manual>();
if (foundManualDialogues.Contains(comp.gameObject.name))
{
Debug.LogError("Dialogue_Manual이 중복됩니다! : ", each);
failedAlready = true;
break;
}
foundManualDialogues.Add(comp.gameObject.name);
data.customFlags2 |= (int)UIExportFlag2.Dialogue_Manual;
}
if (each.GetComponent<Dialogue_Timed>())
{
var comp = each.GetComponent<Dialogue_Timed>();
if (foundTimedDialogues.Contains(comp.gameObject.name))
{
Debug.LogError("Dialogue_Timed이 중복됩니다! : ", each);
failedAlready = true;
break;
}
foundTimedDialogues.Add(comp.gameObject.name);
data.customFlags2 |= (int)UIExportFlag2.Dialogue_Timed;
}
if (each.GetComponent<ScriptUI>())
{
var comp = each.GetComponent<ScriptUI>();
if (foundScriptUI.Contains(comp.gameObject.name))
{
Debug.LogError("ScriptUI의 이름이 중복됩니다! : ", each);
failedAlready = true;
break;
}
foundScriptUI.Add(comp.gameObject.name);
data.customFlags2 |= (int)UIExportFlag2.ScriptUI;
}
if (each.GetComponent<SoundEnumComp>() && each.GetComponent<SoundEnumComp>().soundEnumID != SoundEnumComp.SoundEnumID.None)
{
var comp = each.GetComponent<SoundEnumComp>();
if (foundSounds.Contains(comp.soundEnumID))
{
Debug.LogError("sound id가 중복됩니다! : ", each);
failedAlready = true;
break;
}
foundSounds.Add(comp.soundEnumID);
data.soundEnumID = (int)comp.soundEnumID;
data.customFlags2 |= (int)UIExportFlag2.EnumSound;
}
if (each.GetComponent<RedundantEnable>())
{
var comp = each.GetComponent<RedundantEnable>();
data.customFlags2 |= (int)UIExportFlag2.RedundantEnable;
}
if (each.GetComponent<RotatingUI>())
{
var comp = each.GetComponent<RotatingUI>();
data.customFlags2 |= (int)UIExportFlag2.Rotating;
data.floats[(int)JsonUIFloatType.rotatingSpeed] = comp.rotateSpeed;
data.floats[(int)JsonUIFloatType.rotatingInitialRotation] = comp.transform.localRotation.eulerAngles.z;
}
if (each.GetComponent<StartGameButton>())
{
var comp = each.GetComponent<StartGameButton>();
data.customFlags2 |= (int)UIExportFlag2.StartGameButton;
}
if (each.GetComponent<ReturnToTitleButton>())
{
var comp = each.GetComponent<ReturnToTitleButton>();
data.customFlags2 |= (int)UIExportFlag2.ReturnToTitleButton;
}
if (each.GetComponent<Video>())
{
var comp = each.GetComponent<Video>();
data.customFlags2 |= (int)UIExportFlag2.Video;
data.floats[(int)JsonUIFloatType.videoDuration1] = comp.videoDuration1;
data.videoUnscaledDeltaTime = comp.isDeltatimeUnscaled;
if (comp.video1 != null)
{
data.videoPath1 = AssetDatabase.GetAssetPath(comp.video1);
data.videoPath1 = data.videoPath1.Replace("Assets/Resources/", "");
}
if (comp.video2 != null)
{
data.videoPath2 = AssetDatabase.GetAssetPath(comp.video2);
data.videoPath2 = data.videoPath2.Replace("Assets/Resources/", "");
}
}
if (each.GetComponent<AnimatedSprite>())
{
var comp = each.GetComponent<AnimatedSprite>();
data.customFlags2 |= (int)UIExportFlag2.AnimatedSprite;
data.animatedSpriteFolderPath = AssetDatabase.GetAssetPath(comp.Sprite);
data.animatedSpriteFolderPath = Path.GetDirectoryName(data.animatedSpriteFolderPath);
data.animatedSpriteFolderPath = data.animatedSpriteFolderPath.Replace("\\", "/");
data.animatedSpriteFolderPath = data.animatedSpriteFolderPath.Replace("Assets/Resources/", "");
data.animatedSpriteIsRepeat = comp.repeat;
Debug.Log(data.animatedSpriteFolderPath);
}
if (each.GetComponent<MultiLanguageImage>())
{
var comp = each.GetComponent<MultiLanguageImage>();
data.customFlags2 |= (int)UIExportFlag2.MultiLanguage;
data.koreanImagePath = AssetDatabase.GetAssetPath(comp.koreanImg);
data.koreanImagePath = data.koreanImagePath.Replace("Assets/Resources/", "");
data.englishImagePath = AssetDatabase.GetAssetPath(comp.englishImg);
data.englishImagePath = data.englishImagePath.Replace("Assets/Resources/", "");
data.japaneseImagePath = AssetDatabase.GetAssetPath(comp.japaneseImg);
data.japaneseImagePath = data.japaneseImagePath.Replace("Assets/Resources/", "");
}
if (each.GetComponent<UIEnumIDComp>())
{
var id = each.GetComponent<UIEnumIDComp>().uiEnumID;
data.enumID = (int)id;
if (id != UIEnumIDComp.UIEnumID.None && foundUIIds.Contains(id))
{
Debug.LogError("UI Enum ID가 다음 객체에서 중복됩니다! : ", each);
}
var parentUI = each.transform.parent;
bool skip = false;
while (parentUI)
{
if (parentUI.GetComponent<IsDuplicatable>())
{
skip = true;
break;
}
parentUI = parentUI.transform.parent;
}
if (!skip)
{
foundUIIds.Add(id);
}
}
uilist.dataList.Add(data);
}
catch (Exception e)
{
Debug.LogError(e.Message, each);
failedAlready = true;
break;
}
}
if (!failedAlready)
{
jsonString = JsonUtility.ToJson(uilist, true);
System.IO.File.WriteAllText(path, jsonString);
}
}
private static void DFS(GameObject gameObject, string tagName, List<GameObject> list, Dictionary<GameObject, int> uiIDDict)
{
if (gameObject.tag == tagName)
{
list.Add(gameObject);
uiIDDict.Add(gameObject, uiIDDict.Count);
}
foreach (Transform each in gameObject.transform)
{
DFS(each.gameObject, tagName, list, uiIDDict);
}
}
}