diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..499d569 --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 998de5b9fe51f3848967851e68354d90 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/AutoBuild.cs b/Assets/Editor/AutoBuild.cs new file mode 100644 index 0000000..e0343ad --- /dev/null +++ b/Assets/Editor/AutoBuild.cs @@ -0,0 +1,378 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.Callbacks; +#if UNITY_ANDROID +#elif UNITY_IOS +using UnityEditor.iOS.Xcode; +using UnityEditor.iOS.Xcode.Extensions; +using Facebook.Unity.Settings; +#endif +using UnityEngine; + +public static class AutoBuild +{ + static string path_dev = "AndroidData/mysticatshop_Test_"; + static string path_dev_onestore = "AndroidData/mysticatshop_Test_OneStore_"; + static string path_live = "AndroidData/mysticatshop_Live_"; + static string path_live_onestore = "AndroidData/mysticatshop_Live_OneStore"; + + // 툴씬 이름 목록 + private static readonly string[] toolScenes = + { + "96_Tool_MobScale", + "97_Tool_Effect", + "98_Tool_Mob", + "99_Tool" + }; + private static List backupScenes; + + static void Common(BuildTargetGroup _btg, BuildTarget _bt) + { + // 씬 빼기 + backupScenes = EditorBuildSettings.scenes.ToList(); + var filtered = backupScenes + .Where(scene => !toolScenes.Any(tool => scene.path.Contains(tool))) + .ToList(); + EditorBuildSettings.scenes = filtered.ToArray(); + + PlayerSettings.applicationIdentifier = "com.nerdnavis.mysticatshop"; + EditorUserBuildSettings.SwitchActiveBuildTarget(_btg, _bt); + + if (_bt == BuildTarget.Android) + { + PlayerSettings.Android.splitApplicationBinary = false; + File.WriteAllText("Assets/Resources/VersionCode.txt", PlayerSettings.Android.bundleVersionCode.ToString()); + PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64; + } + else + { + File.WriteAllText("Assets/Resources/VersionCode.txt", PlayerSettings.iOS.buildNumber); + PlayerSettings.iOS.appleDeveloperTeamID = "788PYWMPC6"; // 필굿밴디츠 + //PlayerSettings.iOS.appleDeveloperTeamID = "A9997B8HR5"; // 나인탭 + PlayerSettings.iOS.appleEnableAutomaticSigning = true; + PlayerSettings.iOS.sdkVersion = iOSSdkVersion.DeviceSDK; + } + } + static void Common_End() + { + // 씬 넣기 + if (backupScenes != null) + { + EditorBuildSettings.scenes = backupScenes.ToArray(); + } + EmptySymbol(); + } + + static void Show_BuildFolder(BuildTarget _bt) + { + if (_bt == BuildTarget.Android) System.Diagnostics.Process.Start("AndroidData"); + else System.Diagnostics.Process.Start("IOSData"); + } + static void BuildStart(string path, BuildTarget _bt) + { + BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, path, _bt, BuildOptions.None); + Show_BuildFolder(_bt); + } +#if UNITY_ANDROID + [MenuItem("AutoBuild/EmptySymbol")] + static void EmptySymbol() + { + PlayerSettings.SetScriptingDefineSymbols(UnityEditor.Build.NamedBuildTarget.Android, ""); + } + [MenuItem("AutoBuild/Set_AndroidKeyStore")] + static void Set_AndroidKeyStore() + { + PlayerSettings.Android.useCustomKeystore = true; + PlayerSettings.Android.keystoreName = "AndroidData/mysticatshop.keystore"; + PlayerSettings.Android.keyaliasName = "nerdnavis"; + PlayerSettings.Android.keystorePass = PlayerSettings.Android.keyaliasPass = "nerdnavis!!098"; + } + [MenuItem("AutoBuild/Set_OneStoreKeyStore")] + static void Set_OneStoreKeyStore() + { + PlayerSettings.Android.useCustomKeystore = true; + PlayerSettings.Android.keystoreName = "AndroidData/mysticatshop_One.keystore"; + PlayerSettings.Android.keyaliasName = "nerdnavis"; + PlayerSettings.Android.keystorePass = PlayerSettings.Android.keyaliasPass = "nerdnavis!!098"; + } + [MenuItem("AutoBuild/Build APK with KeyStore")] + static void Build_APK_with_KeyStore() + { + Common(BuildTargetGroup.Android, BuildTarget.Android); + Set_AndroidKeyStore(); + //PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel23; + + var curVer = PlayerSettings.bundleVersion; + PlayerSettings.bundleVersion = "9.9.9"; + EditorUserBuildSettings.buildAppBundle = false; + BuildStart(path_dev + Application.version + "_(" + PlayerSettings.Android.bundleVersionCode + ").apk", BuildTarget.Android); + PlayerSettings.bundleVersion = curVer; + Common_End(); + } + [MenuItem("AutoBuild/Build APK with KeyStore (OneStore)")] + static void Build_APK_OneStore() + { + Common(BuildTargetGroup.Android, BuildTarget.Android); + Set_OneStoreKeyStore(); + //PlayerSettings.Android.minSdkVersion = AndroidSdkVersions.AndroidApiLevel23; + + EditorUserBuildSettings.buildAppBundle = false; + BuildStart(path_dev_onestore + Application.version + "_(" + PlayerSettings.Android.bundleVersionCode + ").apk", BuildTarget.Android); + Common_End(); + } + [MenuItem("AutoBuild/Build Live AAB")] + static void Build_AAB() + { + ++PlayerSettings.Android.bundleVersionCode; + Common(BuildTargetGroup.Android, BuildTarget.Android); + Set_AndroidKeyStore(); + + PlayerSettings.SetScriptingDefineSymbols(UnityEditor.Build.NamedBuildTarget.Android, ""); + EditorUserBuildSettings.buildAppBundle = true; + BuildStart(path_live + Application.version + "_(" + PlayerSettings.Android.bundleVersionCode + ").aab", BuildTarget.Android); + Common_End(); + //if (EditorUtility.DisplayDialog("라이브 빌드", "현재 버전 : " + PlayerSettings.bundleVersion + " " + PlayerSettings.Android.bundleVersionCode.ToString(), "OK", "Not Build")) + // AppBundlePublisher.Build(); + } + [MenuItem("AutoBuild/Build Live AAB (OneStore)")] + static void Build_AAB_OneStore() + { + ++PlayerSettings.Android.bundleVersionCode; + Common(BuildTargetGroup.Android, BuildTarget.Android); + Set_OneStoreKeyStore(); + + PlayerSettings.SetScriptingDefineSymbols(UnityEditor.Build.NamedBuildTarget.Android, ""); + EditorUserBuildSettings.buildAppBundle = true; + BuildStart(path_live_onestore + Application.version + "_(" + PlayerSettings.Android.bundleVersionCode + ").aab", BuildTarget.Android); + Common_End(); + //if (EditorUtility.DisplayDialog("라이브 빌드", "현재 버전 : " + PlayerSettings.bundleVersion + " " + PlayerSettings.Android.bundleVersionCode.ToString(), "OK", "Not Build")) + // AppBundlePublisher.Build(); + } +#endif +#if UNITY_IOS + [MenuItem("AutoBuild/IOS Xcode")] + static void Build_IOS_Xcode() + { + PlayerSettings.iOS.buildNumber = (int.Parse(PlayerSettings.iOS.buildNumber) + 1).ToString(); + PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iOS, "FGB_LIVE"); + Common(BuildTargetGroup.iOS, BuildTarget.iOS); + + BuildStart("IOSData/IOSXcodeLive_" + Application.version + "_" + PlayerSettings.iOS.buildNumber, BuildTarget.iOS); + PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iOS, ""); + } + [MenuItem("AutoBuild/IOS Xcode Test")] + static void Build_IOS_Xcode_Test() + { + PlayerSettings.iOS.buildNumber = (int.Parse(PlayerSettings.iOS.buildNumber) + 1).ToString(); + Common(BuildTargetGroup.iOS, BuildTarget.iOS); + + BuildStart("IOSData/IOSSRDebugOn_" + Application.version + "_" + PlayerSettings.iOS.buildNumber, BuildTarget.iOS); + } + [MenuItem("AutoBuild/Test IOS Simulator")] + static void Build_Test_IOS_Simulator() + { + Common(BuildTargetGroup.iOS, BuildTarget.iOS); + PlayerSettings.iOS.sdkVersion = iOSSdkVersion.SimulatorSDK; + + BuildStart("IOSData/IOSTestBuild_" + Application.version + "_" + PlayerSettings.iOS.buildNumber, BuildTarget.iOS); + } +#endif + + [PostProcessBuild(1)] + static void OnPostProcessBuild(BuildTarget buildTarget, string path) + { + if (buildTarget == BuildTarget.iOS) + { +#if UNITY_IOS + Debug.Log("OnPostProcessBuild : " + path); + + var plistPath = Path.Combine(path, "Info.plist"); + var plist = new PlistDocument(); + plist.ReadFromFile(plistPath); + + PlistElementDict allowsDict = plist.root.CreateDict("NSAppTransportSecurity"); + allowsDict.SetBoolean("NSAllowsArbitraryLoads", true); + PlistElementDict exceptionsDict = allowsDict.CreateDict("NSExceptionDomains"); + PlistElementDict domainDict = exceptionsDict.CreateDict("amazonaws.com"); + domainDict.SetBoolean("NSExceptionAllowsInsecureHTTPLoads", true); + domainDict.SetBoolean("NSIncludesSubdomains", true); + domainDict = exceptionsDict.CreateDict("inonotebook.iptime.org"); + domainDict.SetBoolean("NSExceptionAllowsInsecureHTTPLoads", true); + domainDict.SetBoolean("NSIncludesSubdomains", true); + + plist.root.SetBoolean("GADIsAdManagerApp", true); + plist.root.SetBoolean("FirebaseMessagingAutoInitEnabled", false); + plist.root.SetBoolean("FirebaseAppStoreReceiptURLCheckEnabled", false); + plist.root.SetBoolean("ITSAppUsesNonExemptEncryption", false); + plist.root.SetString("NSAdvertisingAttributionReportEndpoint", "https://appsflyer-skadnetwork.com/"); + + // Add string setting + // SKAdNetwork IDs integration(for iOS14+) + var arraySKAdNetworkItems = plist.root.CreateArray("SKAdNetworkItems"); + foreach (string id in SKAdNetworkIdentifiers) + { + var dict = arraySKAdNetworkItems.AddDict(); + dict.SetString("SKAdNetworkIdentifier", id); + } + + plist.root.SetString("FacebookAppID", FacebookSettings.AppId); + plist.root.SetString("FacebookDisplayName", Application.productName); + // Add URL Scheme + var array = plist.root.CreateArray("CFBundleURLTypes"); + var urlDict = array.AddDict(); + urlDict.SetString("CFBundleURLName", Application.identifier); + var urlInnerArray = urlDict.CreateArray("CFBundleURLSchemes"); + urlInnerArray.AddString("fb" + FacebookSettings.AppId); + var googleiosurlscheme = urlDict.CreateArray("CFBundleURLSchemes"); + googleiosurlscheme.AddString("com.googleusercontent.apps.107333004578-n74n1eaap2bgtg2od6ia1vk4ls5c139j"); + + var fbArray = plist.root.CreateArray("LSApplicationQueriesSchemes"); + fbArray.AddString("fbapi"); + fbArray.AddString("fb-messenger-api"); + fbArray.AddString("fbauth2"); + fbArray.AddString("fbshareextension"); + + plist.WriteToFile(plistPath); + + // get project info + string pbxPath = PBXProject.GetPBXProjectPath(path); + var proj = new PBXProject(); + proj.ReadFromFile(pbxPath); + var guid = proj.GetUnityMainTargetGuid(); + var unitytest = proj.TargetGuidByName(PBXProject.GetUnityTestTargetName()); + var unityframework = proj.GetUnityFrameworkTargetGuid(); + + proj.AddBuildProperty(guid, "OTHER_LDFLAGS", "-lc++"); + proj.SetBuildProperty(guid, "ENABLE_BITCODE", "NO"); + proj.SetBuildProperty(guid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES"); + proj.SetBuildProperty(unitytest, "ENABLE_BITCODE", "NO"); + proj.SetBuildProperty(unityframework, "ENABLE_BITCODE", "NO"); + proj.SetBuildProperty(unityframework, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "NO"); + + // Add Push framework + proj.AddFrameworkToProject(guid, "UserNotifications.framework", false); + + proj.WriteToFile(pbxPath); + + // get entitlements path + string[] idArray = Application.identifier.Split('.'); + var entitlementsPath = $"Unity-iPhone/{idArray[idArray.Length - 1]}.entitlements"; + + // create capabilities manager + var capManager = new ProjectCapabilityManager(pbxPath, entitlementsPath, null, guid); + + // Add necessary capabilities + capManager.AddPushNotifications(true); + capManager.AddSignInWithApple(); + capManager.AddBackgroundModes(BackgroundModesOptions.RemoteNotifications); + + // Write to file + capManager.WriteToFile(); + + Debug.Log("OnPostProcessBuild end"); +#endif + } + } + [PostProcessBuild(45)]//must be between 40 and 50 to ensure that it's not overriden by Podfile generation (40) and that it's added before "pod install" (50) + public static void FixPodFile(BuildTarget buildTarget, string buildPath) + { + if (buildTarget != BuildTarget.iOS) + { + return; + } + Debug.Log("FixPodFile"); + using (StreamWriter sw = File.AppendText(buildPath + "/Podfile")) + { + sw.WriteLine("post_install do |installer|"); + sw.WriteLine("installer.generated_projects.each do |project|"); + sw.WriteLine("project.targets.each do |target|"); + sw.WriteLine("target.build_configurations.each do |config|"); + sw.WriteLine("config.build_settings[\"DEVELOPMENT_TEAM\"] = \"788PYWMPC6\""); + sw.WriteLine("end\nend\nend\nend"); + } + + //string podfilePath = Path.Combine(buildPath, "Podfile"); + //if (File.Exists(podfilePath)) + //{ + // string[] lines = File.ReadAllLines(podfilePath); + // for (int i = 0; i < lines.Length; i++) + // { + // if (lines[i].Contains("Firebase/Auth")) + // lines[i] = " pod 'Firebase/Auth', '10.28.1'"; + // else if (lines[i].Contains("GoogleSignIn")) + // lines[i] = " pod 'GoogleSignIn', '5.0.0'"; + // else if (lines[i].Contains("GTMSessionFetcher/Core'")) + // lines[i] = " pod 'GTMSessionFetcher/Core'', '2.1'"; + // } + // File.WriteAllLines(podfilePath, lines); + //} + } + + private static readonly string[] SKAdNetworkIdentifiers = new string[] + { + "v9wttpbfk9.skadnetwork", + "n38lu8286q.skadnetwork", + "su67r6k2v3.skadnetwork", + "9t245vhmpl.skadnetwork", + "m8dbw4sv7c.skadnetwork", + "tl55sbb4fm.skadnetwork", + "wzmmz9fp6w.skadnetwork", + "4fzdc2evr5.skadnetwork", + "294l99pt4k.skadnetwork", + "4w7y6s5ca2.skadnetwork", + "7ug5zh24hu.skadnetwork", + "5l3tpt7t6e.skadnetwork", + "t38b2kh725.skadnetwork", + "c6k4g5qg8m.skadnetwork", + "wg4vff78zm.skadnetwork", + "v72qych5uu.skadnetwork", + "mp6xlyr22a.skadnetwork", + "cstr6suwn9.skadnetwork", + "4pfyvq9l8r.skadnetwork", + "w9q455wk68.skadnetwork", + "44jx6755aq.skadnetwork", + "k6y4y55b64.skadnetwork", + "8s468mfl3y.skadnetwork", + "mlmmfzh3r3.skadnetwork", + "4dzt52r2t5.skadnetwork", + "ydx93a7ass.skadnetwork", + "3qy4746246.skadnetwork", + "prcb7njmu6.skadnetwork", + "v79kvwwj4g.skadnetwork", + "glqzh8vgby.skadnetwork", + "s39g8k73mm.skadnetwork", + "238da6jt44.skadnetwork", + "424m5254lk.skadnetwork", + "5a6flpkh64.skadnetwork", + "hs6bdukanm.skadnetwork", + "x44k69ngh6.skadnetwork", + "a8cz6cu7e5.skadnetwork", + "488r3q3dtq.skadnetwork", + "32z4fx6l9h.skadnetwork", + "22mmun2rn5.skadnetwork", + "3rd42ekr43.skadnetwork", + "6yxyv74ff7.skadnetwork", + "ppxm28t8ap.skadnetwork", + "lr83yxwka7.skadnetwork", + "578prtvx9j.skadnetwork", + "a2p9lx4jpn.skadnetwork", + "av6w8kgt66.skadnetwork", + "4468km3ulz.skadnetwork", + "9rd848q2bz.skadnetwork", + "5lm9lj6jb7.skadnetwork", + "f7s53z58qe.skadnetwork", + "k674qkevps.skadnetwork", + "kbd757ywx3.skadnetwork", + "yclnxrl5pm.skadnetwork", + "zq492l623r.skadnetwork", + "zmvfpc5aq8.skadnetwork", + "f73kdq92p3.skadnetwork", + "f38h382jlk.skadnetwork", + "2u9pt9hc89.skadnetwork", + "5tjdwbrq8w.skadnetwork", + "3sh42y64q3.skadnetwork", + "9nlqeag3gk.skadnetwork" + }; +} \ No newline at end of file diff --git a/Assets/Editor/AutoBuild.cs.meta b/Assets/Editor/AutoBuild.cs.meta new file mode 100644 index 0000000..a519630 --- /dev/null +++ b/Assets/Editor/AutoBuild.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e7f08087432fca54d824025a36d4f1aa \ No newline at end of file diff --git a/Assets/Editor/MyEditorUtil.cs b/Assets/Editor/MyEditorUtil.cs new file mode 100644 index 0000000..0e79634 --- /dev/null +++ b/Assets/Editor/MyEditorUtil.cs @@ -0,0 +1,506 @@ +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; +using UnityEngine.AI; + +public static class MyEditorUtil +{ + struct TransformData + { + public Vector3 localPosition; + public Quaternion localRotation; + public Vector3 localScale; + + public TransformData(Vector3 localPosition, Quaternion localRotation, Vector3 localScale) + { + this.localPosition = localPosition; + this.localRotation = localRotation; + this.localScale = localScale; + } + } + private static TransformData _data; + + [MenuItem("Edit/Copy Transform Values &%#q", false, -101)] + public static void CopyTransformValues() + { + if (Selection.gameObjects.Length == 0) return; + var selectionTr = Selection.gameObjects[0].transform; + _data = new TransformData(selectionTr.localPosition, selectionTr.localRotation, selectionTr.localScale); + } + + [MenuItem("Edit/Paste Transform Values &%#w", false, -101)] + public static void PasteTransformValues() + { + foreach (var selection in Selection.gameObjects) + { + Transform selectionTr = selection.transform; + Undo.RecordObject(selectionTr, "Paste Transform Values"); + selectionTr.localPosition = _data.localPosition; + selectionTr.localRotation = _data.localRotation; + selectionTr.localScale = _data.localScale; + } + } + + [MenuItem("Edit/Del All Child", false, -102)] + public static void DelAllChild() + { + foreach (var selection in Selection.gameObjects) + { + Transform selectionTr = selection.transform; + for (int i = 0; i < selectionTr.childCount; i++) + { + GameObject.DestroyImmediate(selectionTr.GetChild(i).gameObject); + --i; + } + } + } + + [MenuItem("Edit/Set Mob Data", false, -103)] + public static void SetMobData() + { // 설정된 몹 프리팹을 지우고 몹 데이터만 남긴다. 해당 데이터로 게임 내에서 몹을 동적 로딩한다. + //foreach (var selection in Selection.gameObjects) + //{ + // var mobs = selection.GetComponentsInChildren(); + // var dic_wave = new Dictionary(); + // for (int i = 0; i < mobs.Length; i++) + // { + // var parent = mobs[i].transform.parent; + // if (!dic_wave.ContainsKey(parent.name)) + // { + // var loaddata = parent.GetComponent(); + // if (loaddata == null) loaddata = parent.gameObject.AddComponent(); + // dic_wave.Add(parent.name, loaddata); + // } + + // var detaildata = new LoadMobDetailData + // { + // m_Position = mobs[i].transform.position, + // m_Rotation = mobs[i].transform.rotation, + // m_Role = mobs[i].m_Role, + // m_SubRole = mobs[i].m_SubRole, + // m_MagicID = (mobs[i] as MobActor).MagicID, + // }; + + // if (mobs[i].name.Contains("(")) + // { + // var split = mobs[i].name.Split(' '); + // detaildata.m_PrefabName = ""; + // if (split.Length == 2) + // detaildata.m_PrefabName = split[0]; + // else + // for (int j = 0; j < split.Length - 1; j++) + // { + // if (j == split.Length - 2) + // detaildata.m_PrefabName += split[j]; + // else + // detaildata.m_PrefabName += split[j] + " "; + // } + // } + // else + // detaildata.m_PrefabName = mobs[i].name; + + // var witch = mobs[i] as WitchEnemyActor; + // if (witch != null) + // detaildata.list_MagicID = witch.list_MagicID; + + // dic_wave[parent.name].list_mobdata.Add(detaildata); + // GameObject.DestroyImmediate(mobs[i].gameObject); + // } + //} + } + + [MenuItem("Edit/GetFolderFileNames", false, -105)] + public static void GetFolderFileNames() + { + DirectoryInfo di = new DirectoryInfo("Assets/ResWork/UIPrefabs/Title"); + var ext = ".prefab"; // ".mat"; + + var filenames = ""; + foreach (FileInfo file in di.GetFiles("*" + ext)) + filenames += file.Name.Replace(ext, "") + "\n"; + Debug.Log(filenames); + } + + private static List objectSettingsList = new List(); + + [MenuItem("Edit/MobSetting &s", false, -1001)] + static void MobSetting() + { + //var selectedObjects = Selection.gameObjects; + + //foreach (var go in selectedObjects) + //{ + // var ma = go.GetComponent(); + // if (ma == null) ma = go.AddComponent(); + + // var m_bc = go.GetComponent(); + // if (m_bc == null) m_bc = go.AddComponent(); + + // CommonSetting(go, ObstacleAvoidanceType.LowQualityObstacleAvoidance, 0, "Actor"); + //} + } + + [MenuItem("Edit/PetSetting", false, -1002)] + static void PetSetting() + { + //var selectedObjects = Selection.gameObjects; + + //foreach (var go in selectedObjects) + //{ + // var ma = go.GetComponent(); + // if (ma == null) ma = go.AddComponent(); + // ma.m_Role = eRole.Pet; + + // CommonSetting(go, ObstacleAvoidanceType.NoObstacleAvoidance, 99, "Actor"); + //} + } + [MenuItem("Edit/PCSetting", false, -1003)] + static void PCSetting() + { + //var selectedObjects = Selection.gameObjects; + + //foreach (var go in selectedObjects) + //{ + // // 프리팹 에셋 경로 가져오기 + // string prefabPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(go); + + // // Prefab인지 확인 + // if (!string.IsNullOrEmpty(prefabPath)) + // { + // // Prefab Asset 가져오기 + // var prefabAsset = PrefabUtility.LoadPrefabContents(prefabPath); + + // var ma = prefabAsset.GetComponent(); + // if (ma == null) ma = prefabAsset.AddComponent(); + // ma.m_Role = eRole.PC; + + // var navmesh = prefabAsset.GetComponent(); + // if (navmesh == null) navmesh = prefabAsset.AddComponent(); + // navmesh.speed = 6f; + // navmesh.angularSpeed = 300f; + // navmesh.acceleration = 140f; + // navmesh.stoppingDistance = 4f; + // navmesh.autoBraking = true; + // navmesh.radius = 0.4f; + // navmesh.height = 2f; + // navmesh.avoidancePriority = 50; + // navmesh.obstacleAvoidanceType = ObstacleAvoidanceType.LowQualityObstacleAvoidance; + + // Set_CommonRigidBody(prefabAsset, "Actor"); + + // var cc = prefabAsset.GetComponent(); + // if (cc == null) cc = prefabAsset.AddComponent(); + // cc.center = Vector3.up * 0.79f; + // cc.radius = 0.55f; + // cc.height = 1.58f; + // cc.direction = 1; + + // var pcactor = prefabAsset.GetComponent(); + // List list_tr = new List(); + + // // 프리팹 내부 수정 + // var wristL = FindDeepChild(prefabAsset.transform, "Wrist_L"); + // var wristR = FindDeepChild(prefabAsset.transform, "Wrist_R"); + + // if (wristL != null) + // { + // var strName = "w_shield"; + // var shield = FindDeepChild(prefabAsset.transform, strName); + // if (shield == null) shield = new GameObject(strName).transform; + // shield.parent = wristL; + // shield.localPosition = new Vector3(0.0184f, -0.0158f, 0.0261f); + // shield.localEulerAngles = new Vector3(-21.84897f, 162.9937f, -171.4406f); + // shield.localScale = Vector3.one * 0.6f; + // list_tr.Add(shield); + // } + // if (wristR != null) + // { + // var strName = "w_righthand"; + // var mace = FindDeepChild(prefabAsset.transform, strName); + // if (mace == null) mace = new GameObject(strName).transform; + // mace.parent = wristR; + // mace.localPosition = new Vector3(-0.0749f, 0.1431f, -0.024f); + // mace.localEulerAngles = new Vector3(0, 0, 10.6f); + // mace.localScale = new Vector3(1f, 0.7f, 1f); + // list_tr.Add(mace); + // } + + // if (wristR != null) + // { + // var strName = "w_onehand"; + // var onehand = FindDeepChild(prefabAsset.transform, strName); + // if (onehand == null) onehand = new GameObject(strName).transform; + // onehand.parent = wristR; + // onehand.localPosition = new Vector3(-0.0546f, -0.001f, -0.0271f); + // onehand.localEulerAngles = new Vector3(0f, 107.83f, 0f); + // onehand.localScale = Vector3.one * 0.8f; + // list_tr.Add(onehand); + // } + + // if (wristL != null) + // { + // var strName = "w_bladedancer_l"; + // var bd_l = FindDeepChild(prefabAsset.transform, strName); + // if (bd_l == null) bd_l = new GameObject(strName).transform; + // bd_l.parent = wristL; + // bd_l.localPosition = new Vector3(0.0413f, 0.015f, 0.0255f); + // bd_l.localEulerAngles = new Vector3(6.747354f, -168.0254f, 157.2563f); + // bd_l.localScale = Vector3.one; + // list_tr.Add(bd_l); + // } + // if (wristR != null) + // { + // var strName = "w_bladedancer_r"; + // var bd_r = FindDeepChild(prefabAsset.transform, strName); + // if (bd_r == null) bd_r = new GameObject(strName).transform; + // bd_r.parent = wristR; + // bd_r.localPosition = new Vector3(-0.0546f, -0.001f, -0.0271f); + // bd_r.localEulerAngles = new Vector3(0f, 107.83f, 0f); + // bd_r.localScale = Vector3.one * 0.8f; + // list_tr.Add(bd_r); + // } + // if (wristR != null) + // { + // var strName = "w_orb"; + // var bd_r = FindDeepChild(prefabAsset.transform, strName); + // if (bd_r == null) bd_r = new GameObject(strName).transform; + // bd_r.parent = wristR; + // bd_r.localPosition = new Vector3(-0.05439695f, -0.00136376f, -0.02748983f); + // bd_r.localEulerAngles = new Vector3(-1.791351f, 107.4387f, 1.349683f); + // bd_r.localScale = Vector3.one * 0.1f; + // list_tr.Add(bd_r); + // } + + // if (wristL != null) + // { + // var strName = "w_archer_l"; + // var bow_l = FindDeepChild(prefabAsset.transform, strName); + // if (bow_l == null) bow_l = new GameObject(strName).transform; + // bow_l.parent = wristL; + // bow_l.localPosition = new Vector3(0.069f, -0.01f, 0.034f); + // bow_l.localEulerAngles = new Vector3(-2.139496f, 0f, -3.480011f); + // bow_l.localScale = Vector3.one * 1.3f; + // list_tr.Add(bow_l); + // } + + // pcactor.tfs_weapon = list_tr.ToArray(); + + // // 수정한 프리팹 저장 + // PrefabUtility.SaveAsPrefabAsset(prefabAsset, prefabPath); + // PrefabUtility.UnloadPrefabContents(prefabAsset); + // } + // else + // { + // Debug.LogError($"{go.name}은(는) 프리팹 인스턴스가 아닙니다!"); + // } + //} + } + static Transform FindDeepChild(Transform parent, string name) + { + foreach (Transform child in parent) + { + if (child.name == name) + return child; + var result = FindDeepChild(child, name); + if (result != null) + return result; + } + return null; + } + + static void CommonSetting(GameObject go, ObstacleAvoidanceType avoid, int avoidancePriority, string layer) + { + Set_Collideer(go); + + var navmesh = go.GetComponent(); + if (navmesh == null) navmesh = go.AddComponent(); + navmesh.speed = 4.5f; + navmesh.angularSpeed = 300f; + navmesh.acceleration = 140f; + navmesh.stoppingDistance = 0.1f; + navmesh.autoBraking = true; + navmesh.radius = 0.25f; + navmesh.avoidancePriority = avoidancePriority; + navmesh.obstacleAvoidanceType = avoid; + + Set_CommonRigidBody(go, layer); + } + static void Set_CommonRigidBody(GameObject go, string layer) + { + go.layer = LayerMask.NameToLayer(layer); + var rigidbody = go.GetComponent(); + if (rigidbody == null) rigidbody = go.AddComponent(); + rigidbody.useGravity = false; + rigidbody.mass = 1; + rigidbody.linearDamping = 0; + rigidbody.angularDamping = 0.05f; + rigidbody.automaticCenterOfMass = true; + rigidbody.automaticInertiaTensor = true; + rigidbody.collisionDetectionMode = CollisionDetectionMode.Discrete; + rigidbody.constraints = RigidbodyConstraints.FreezeAll; + } + + private static void UpdateAllObjects() + { + for (int i = objectSettingsList.Count - 1; i >= 0; i--) + { + var settings = objectSettingsList[i]; + if (settings.tick < 0) + { + var bounds = settings.m_smr.bounds; + settings.m_bc.center = bounds.center; + settings.m_bc.size = bounds.size + Vector3.up; + settings.m_smr.updateWhenOffscreen = false; + settings.go.transform.localScale = settings.m_Scale; + objectSettingsList.RemoveAt(i); + } + else + { + settings.tick--; + } + } + + if (objectSettingsList.Count == 0) + { + EditorApplication.update -= UpdateAllObjects; + } + } + + private class ObjectSettings + { + public GameObject go; + public Vector3 m_Scale; + public BoxCollider m_bc; + public SkinnedMeshRenderer m_smr; + public int tick; + } + + + [MenuItem("Edit/SetCollider", false, -2000)] + static void SetCollider() + { + foreach (var go in Selection.gameObjects) + Set_Collideer(go); + } + static void Set_Collideer(GameObject go) + { + var objData = new ObjectSettings { go = go, m_Scale = go.transform.localScale, tick = 10 }; + go.transform.localScale = Vector3.one; + + var m_bc = go.GetComponent(); + if (m_bc == null) m_bc = go.AddComponent(); + objData.m_bc = m_bc; + + var rds = go.GetComponentsInChildren(); + SkinnedMeshRenderer m_smr = null; + if (rds.Length == 1) m_smr = rds[0]; + else + { + for (int i = 0; i < rds.Length; i++) + { + if (rds[i].name.ToLower().Contains("skin")) + { + m_smr = rds[i]; + break; + } + } + if (m_smr == null) m_smr = rds[0]; + } + + m_smr.updateWhenOffscreen = true; + objData.m_smr = m_smr; + + objectSettingsList.Add(objData); + + EditorApplication.update += UpdateAllObjects; + } + + [MenuItem("Tools/Del_AddrResource")] + static void Del_AddrResource() + { + bool result = EditorUtility.DisplayDialog( + "경고!", // 제목 + "모든 어드레서블 데이터를 삭제하시겠습니까?", // 메시지 + "확인", // 확인 버튼 + "취소" // 취소 버튼 + ); + + if (result) + { + Caching.ClearCache(); + EditorUtility.DisplayDialog("알림", "삭제 완료", "확인"); + } + } + + [MenuItem("Tools/MobActorImageFill", false, 1)] + static void MobActorImageFill() + { + var srs = Selection.activeGameObject.GetComponentsInChildren(); + for (int i = 0; i < srs.Length; i++) + { + var child = srs[i]; + if (child.name == "sr_actor") + child.GetComponent().sprite = + AssetDatabase.LoadAssetAtPath("Assets/Res_Addr/Monster/10001.png"); + } + } + [MenuItem("Tools/MobActorImageEmpty", false, 2)] + static void MobActorImageEmpty() + { + var srs = Selection.activeGameObject.GetComponentsInChildren(); + for (int i = 0; i < srs.Length; i++) + { + var child = srs[i]; + if (child.name == "sr_actor") + child.GetComponent().sprite = null; + } + } + //[MenuItem("Edit/Find All Particle", false, -103)] + //public static void FindAllParticle() + //{ + // foreach (var selection in Selection.gameObjects) + // { + // var pats = selection.transform.GetComponentsInChildren(); + // for (int i = 0; i < pats.Length; i++) + // Debug.Log(pats[i].name); + // } + //} + + + //[MenuItem("Ino/Test %g")] + //static void Ino_Test() + //{ + // ModelImporter modelImporter = (ModelImporter)AssetImporter.GetAtPath("Assets/ResWork/Quirky Series Vol.1 [v1.3]/Arctic Vol.1/Animations/Penguin_Animations.fbx"); + // for (int i = 0; i < modelImporter.clipAnimations.Length; i++) + // { + // switch(modelImporter.clipAnimations[i].name) + // { + // case "Attack": + // break; + // } + + // } + //} + + //[MenuItem("Ino/Test")] + //static void FindHUD() + //{ + // Debug.Log("시작"); + // for (int i = 0; i < Selection.gameObjects.Length; i++) + // { + // var hud = Selection.gameObjects[i].transform.Find("HUD"); + // if (hud == null) Debug.Log(Selection.gameObjects[i]); + // } + // Debug.Log("끝"); + //} + + //[MenuItem("Ino/Bip001 to Bip002")] + //static void ChangeBip01Bip02() + //{ + // var tf = Selection.activeGameObject.transform; + // ChangeName(tf); + //} + + // 자식까지 포함해서 레이어를 재귀적으로 설정하는 함수 +} \ No newline at end of file diff --git a/Assets/Editor/MyEditorUtil.cs.meta b/Assets/Editor/MyEditorUtil.cs.meta new file mode 100644 index 0000000..57b2189 --- /dev/null +++ b/Assets/Editor/MyEditorUtil.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 3334bb993485f194bb4fd632194b1518 \ No newline at end of file diff --git a/Assets/Editor/MyUIUtil.cs b/Assets/Editor/MyUIUtil.cs new file mode 100644 index 0000000..af10aee --- /dev/null +++ b/Assets/Editor/MyUIUtil.cs @@ -0,0 +1,497 @@ +using TMPro; +using UnityEditor; +using UnityEngine; +using UnityEngine.UI; + +public static class MyUIUtil +{ + static string path_whitebg = "Assets/ResWork/UI_Image/Common/whitebg.png"; + + static void SetLayerRecursively(GameObject obj, string newLayer = "UI") + { + obj.layer = LayerMask.NameToLayer(newLayer); + + foreach (Transform child in obj.transform) + SetLayerRecursively(child.gameObject, newLayer); // 재귀 호출로 자식까지 처리 + } + + [MenuItem("GameObject/UI/New Image &i")] // &i는 Alt + I를 의미 + static void CreateUIImage() + { + GameObject imageObject = new GameObject("New Image", typeof(Image)); + + // 생성된 오브젝트에 대한 Undo 기록 추가 + Undo.RegisterCreatedObjectUndo(imageObject, "New Image"); + + var img = imageObject.GetComponent(); + img.raycastTarget = false; + img.sprite = AssetDatabase.LoadAssetAtPath(path_whitebg); + + if (Selection.activeGameObject != null) + { + imageObject.transform.SetParent(Selection.activeGameObject.transform, false); + SetLayerRecursively(imageObject); + + // 새로 생성된 오브젝트를 선택 + Selection.activeGameObject = imageObject; + + // 씬 뷰에서 해당 오브젝트에 포커스 맞추기 + //SceneView.lastActiveSceneView.FrameSelected(); + } + } + + [MenuItem("GameObject/UI/Text Only &t")] // &t는 Alt + T를 의미 + static void CreateUITextMeshPro() + { + GameObject textObject = new GameObject("New TMP", typeof(TextMeshProUGUI)); + + // 생성된 오브젝트에 대한 Undo 기록 추가 + Undo.RegisterCreatedObjectUndo(textObject, "New TMP"); + + var tm = textObject.GetComponent(); + tm.raycastTarget = false; + tm.alignment = TextAlignmentOptions.Midline; + tm.textWrappingMode = TextWrappingModes.NoWrap; + if (Selection.activeGameObject != null) + { + textObject.transform.SetParent(Selection.activeGameObject.transform, false); + SetLayerRecursively(textObject); + + // 새로 생성된 오브젝트를 선택 + Selection.activeGameObject = textObject; + + // 씬 뷰에서 해당 오브젝트에 포커스 맞추기 + //SceneView.lastActiveSceneView.FrameSelected(); + } + } + [MenuItem("GameObject/UI/Text - Local &y")] + static void CreateUITextMeshProWithLocal() + { + GameObject textObject = new GameObject("Local TMP", typeof(TextMeshProUGUI)); + + // 생성된 오브젝트에 대한 Undo 기록 추가 + Undo.RegisterCreatedObjectUndo(textObject, "Local TMP"); + + textObject.AddComponent(); + var tm = textObject.GetComponent(); + tm.raycastTarget = false; + tm.alignment = TextAlignmentOptions.Midline; + tm.textWrappingMode = TextWrappingModes.NoWrap; + if (Selection.activeGameObject != null) + { + textObject.transform.SetParent(Selection.activeGameObject.transform, false); + SetLayerRecursively(textObject); + + // 새로 생성된 오브젝트를 선택 + Selection.activeGameObject = textObject; + + // 씬 뷰에서 해당 오브젝트에 포커스 맞추기 + //SceneView.lastActiveSceneView.FrameSelected(); + } + } + + [MenuItem("GameObject/UI/Button &b")] // Alt + B: Button 생성 (Image, Button, PlayClickSound_Only 추가) + static void CreateUIButton() + { + // 버튼 오브젝트 생성 (Image, Button 컴포넌트 포함) + GameObject buttonObject = new GameObject("btn_"); + + // 생성된 오브젝트에 대한 Undo 기록 추가 + Undo.RegisterCreatedObjectUndo(buttonObject, "btn_"); + + buttonObject.AddComponent().sprite = AssetDatabase.LoadAssetAtPath(path_whitebg); + buttonObject.AddComponent