#if UNITY_2018_3_OR_NEWER
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace UnityAtoms.Editor
{
///
/// Internal utility class to regenerate all Atoms. Reachable via top menu bar and `Tools/Unity Atoms/Regenerate All Atoms`.
///
internal class RegenereateAllAtoms
{
private class RegenerateItem
{
public string ValueType { get; set; }
public string BaseWritePath { get; set; }
public bool IsValueEquatable { get; set; }
public List AtomTypesToGenerate { get; set; }
public string ValueTypeNamespace { get; set; }
public string SubUnityAtomsNamespace { get; set; }
public RegenerateItem(string valueType, string baseWritePath, bool isValueEquatable, List atomTypesToGenerate, string typeNamespace, string subUnityAtomsNamespace)
{
this.ValueType = valueType;
this.BaseWritePath = baseWritePath;
this.IsValueEquatable = isValueEquatable;
this.AtomTypesToGenerate = atomTypesToGenerate;
this.ValueTypeNamespace = typeNamespace;
this.SubUnityAtomsNamespace = subUnityAtomsNamespace;
}
}
[MenuItem("Tools/Unity Atoms/Regenerate Atoms from Assets")]
static void RegenereateAssets()
{
if (!EditorUtility.DisplayDialog("Regenerate", "This will regenerate all Atoms from Generation-Assets",
"Ok", "Cancel"))
{
return;
}
var guids = AssetDatabase.FindAssets($"t:{nameof(AtomGenerator)}");
foreach (var guid in guids)
{
var path = AssetDatabase.GUIDToAssetPath(guid);
AssetDatabase.LoadAssetAtPath(path).Generate();
}
}
///
/// Create the editor window.
///
[MenuItem("Tools/Unity Atoms/Regenerate all Atoms")]
static void Regenereate()
{
if (!Runtime.IsUnityAtomsRepo)
{
Debug.LogWarning("This is currently only available working in the Unity Atoms project...");
}
string path = EditorUtility.OpenFolderPanel("Select the 'Packages' folder (containing Core)", ".", "");
if (string.IsNullOrEmpty(path))
{
Debug.LogWarning("Empty path. Abort.");
return;
}
path = new Uri(Application.dataPath).MakeRelativeUri(new Uri(path)).ToString();
var i = EditorUtility.DisplayDialogComplex("Regenerate Atoms",
$"Do you want to regenerate all Atoms and write them to '{path}'?\n",
"Yes, I know what I'm doing!", "Cancel", "");
if (i == 1)
{
Debug.LogWarning("Cancelled generating Atoms.");
return;
}
var itemsToRegenerate = new List()
{
// Base Atoms
new RegenerateItem(
valueType: "Void",
baseWritePath: Path.Combine(path, "BaseAtoms"),
isValueEquatable: false,
atomTypesToGenerate: new List() { AtomTypes.EVENT, AtomTypes.UNITY_EVENT, AtomTypes.BASE_EVENT_REFERENCE, AtomTypes.EVENT_INSTANCER, AtomTypes.BASE_EVENT_REFERENCE_LISTENER },
typeNamespace: "",
subUnityAtomsNamespace: "BaseAtoms"
),
new RegenerateItem(valueType: "bool", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "Color", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityEngine", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "float", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "GameObject", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: false, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityEngine", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "int", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "string", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "Vector2", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityEngine", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(valueType: "Vector3", baseWritePath: Path.Combine(path, "BaseAtoms"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityEngine", subUnityAtomsNamespace: "BaseAtoms"),
new RegenerateItem(
valueType: "AtomBaseVariable",
baseWritePath: Path.Combine(path, "BaseAtoms"),
isValueEquatable: false,
atomTypesToGenerate: new List() { AtomTypes.EVENT, AtomTypes.ACTION, AtomTypes.UNITY_EVENT, AtomTypes.BASE_EVENT_REFERENCE, AtomTypes.EVENT_INSTANCER, AtomTypes.BASE_EVENT_REFERENCE_LISTENER },
typeNamespace: "",
subUnityAtomsNamespace: "BaseAtoms"
),
new RegenerateItem
(
valueType: "double",
baseWritePath: Path.Combine(path, "BaseAtoms"),
isValueEquatable: true,
atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES,
typeNamespace: "",
subUnityAtomsNamespace: "BaseAtoms"
),
new RegenerateItem
(
valueType: "Quaternion",
baseWritePath: Path.Combine(path, "BaseAtoms"),
isValueEquatable: true,
atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES,
typeNamespace: "UnityEngine",
subUnityAtomsNamespace: "BaseAtoms"
),
//MonoHooks
new RegenerateItem(valueType: "ColliderGameObject", baseWritePath: Path.Combine(path, "MonoHooks"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityAtoms.MonoHooks", subUnityAtomsNamespace: "MonoHooks"),
new RegenerateItem(valueType: "Collider2DGameObject", baseWritePath: Path.Combine(path, "MonoHooks"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityAtoms.MonoHooks", subUnityAtomsNamespace: "MonoHooks"),
new RegenerateItem(valueType: "CollisionGameObject", baseWritePath: Path.Combine(path, "MonoHooks"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityAtoms.MonoHooks", subUnityAtomsNamespace: "MonoHooks"),
new RegenerateItem(valueType: "Collision2DGameObject", baseWritePath: Path.Combine(path, "MonoHooks"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityAtoms.MonoHooks", subUnityAtomsNamespace: "MonoHooks"),
//Mobile
new RegenerateItem(valueType: "TouchUserInput", baseWritePath: Path.Combine(path, "Mobile"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityAtoms.Mobile", subUnityAtomsNamespace: "Mobile"),
//SceneMgmt
new RegenerateItem(valueType: "SceneField", baseWritePath: Path.Combine(path, "SceneMgmt"), isValueEquatable: true, atomTypesToGenerate: AtomTypes.ALL_ATOM_TYPES, typeNamespace: "UnityAtoms.SceneMgmt", subUnityAtomsNamespace: "SceneMgmt"),
//FSM
new RegenerateItem(
valueType: "FSMTransitionData",
baseWritePath: Path.Combine(path, "FSM"),
isValueEquatable: false,
atomTypesToGenerate: new List() { AtomTypes.EVENT, AtomTypes.ACTION, AtomTypes.UNITY_EVENT, AtomTypes.BASE_EVENT_REFERENCE, AtomTypes.EVENT_INSTANCER, AtomTypes.BASE_EVENT_REFERENCE_LISTENER },
typeNamespace: "",
subUnityAtomsNamespace: "FSM"
),
//Input System
new RegenerateItem
(
valueType: "PlayerInput",
baseWritePath: Path.Combine(path, "InputSystem"),
isValueEquatable: false,
atomTypesToGenerate: new List()
{ AtomTypes.EVENT, AtomTypes.ACTION, AtomTypes.UNITY_EVENT, AtomTypes.EVENT_INSTANCER },
typeNamespace: "UnityEngine.InputSystem",
subUnityAtomsNamespace: "InputSystem"
),
new RegenerateItem
(
valueType: "InputAction.CallbackContext",
baseWritePath: Path.Combine(path, "InputSystem"),
isValueEquatable: false,
atomTypesToGenerate: new List()
{ AtomTypes.EVENT, AtomTypes.ACTION, AtomTypes.UNITY_EVENT, AtomTypes.EVENT_INSTANCER },
typeNamespace: "UnityEngine.InputSystem",
subUnityAtomsNamespace: "InputSystem"
),
};
foreach (var item in itemsToRegenerate)
{
var templates = Generator.GetTemplatePaths();
var templateConditions = Generator.CreateTemplateConditions(item.IsValueEquatable, item.ValueTypeNamespace, item.SubUnityAtomsNamespace, item.ValueType);
var templateVariables = Generator.CreateTemplateVariablesMap(item.ValueType, item.ValueTypeNamespace, item.SubUnityAtomsNamespace);
var capitalizedValueType = item.ValueType.Replace('.', '_').Capitalize();
foreach (var atomType in item.AtomTypesToGenerate)
{
templateVariables["VALUE_TYPE_NAME"] = atomType.IsValuePair ? $"{capitalizedValueType}Pair" : capitalizedValueType;
var valueType = atomType.IsValuePair ? $"{capitalizedValueType}Pair" : item.ValueType;
templateVariables["VALUE_TYPE"] = valueType;
Generator.Generate(new AtomReceipe(atomType, valueType), item.BaseWritePath, templates, templateConditions, templateVariables);
}
}
AssetDatabase.Refresh();
}
}
}
#endif