Skip to content

Commit

Permalink
IEditorOnlyで消される問題対策
Browse files Browse the repository at this point in the history
  • Loading branch information
Narazaka committed Feb 17, 2024
1 parent 50907f3 commit 8c02147
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 107 deletions.
5 changes: 1 addition & 4 deletions Editor/AvatarParametersPresetPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,7 @@ protected override void Configure()
var parameterName = ParameterName(presets.AvatarParametersSaverPresetGroup, presets.gameObject);
var animator = MakeAnimator(presets.AvatarParametersSaverPresetGroup, parameterName);
StoreAssets(presets.AvatarParametersSaverPresetGroup, presets.gameObject, parameterName, animator);
if (!EditorApplication.isPlaying)
{
Object.DestroyImmediate(presets);
}
Object.DestroyImmediate(presets);
}
});
}
Expand Down
4 changes: 0 additions & 4 deletions Editor/AvatarParametersPresetsEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@ public override void OnInspectorGUI()
}
serializedObject.Update();
EditorGUILayout.PropertyField(AvatarParametersSaverPresetGroup);
if (serializedObject.hasModifiedProperties)
{
AvatarParametersSaverPlayModePersist.Store((AvatarParametersPresets)target);
}
serializedObject.ApplyModifiedProperties();
}
}
Expand Down
2 changes: 1 addition & 1 deletion Editor/AvatarParametersPresetsRuntimeEditor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public override void OnInspectorGUI()

if (serializedObject.hasModifiedProperties)
{
AvatarParametersSaverPlayModePersist.Store((AvatarParametersPresets)target);
AvatarParametersSaverPlayModePersist.Store((AvatarParametersSaverPlayModePersist.StoreDataGroupAsset)target);
}
serializedObject.ApplyModifiedProperties();
}
Expand Down
14 changes: 9 additions & 5 deletions Editor/AvatarParametersSaver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ public static void Open()
}

AvatarParametersPresetsRuntimeEditor PresetEditor;
AvatarParametersPresets Presets;
AvatarParametersSaverPlayModePersist.StoreDataGroupAsset Presets;

VRCAvatarDescriptor Avatar;
AvatarParametersPresets[] AvatarParametersPresetsList;
AvatarParametersSaverPlayModePersist.StoreDataGroupAsset[] AvatarParametersPresetsList;

void Update()
{
Expand All @@ -38,7 +38,11 @@ void OnGUI()
{
Debug.Log("Avatar changed");
Avatar = avatar;
AvatarParametersPresetsList = Avatar == null ? null : Avatar.GetComponentsInChildren<AvatarParametersPresets>();
AvatarParametersPresetsList = null;
}
if (AvatarParametersPresetsList == null)
{
AvatarParametersPresetsList = Avatar == null ? null : AvatarParametersSaverPlayModePersist.ForAvatar(Avatar);
}

if (Avatar == null)
Expand All @@ -59,7 +63,7 @@ void OnGUI()
EditorGUILayout.ObjectField("Avatar", Avatar, typeof(VRCAvatarDescriptor), true);
EditorGUI.EndDisabledGroup();

if (AvatarParametersPresetsList?.Length > 0)
if (AvatarParametersPresetsList != null && AvatarParametersPresetsList.Length > 0)
{
EditorGUILayout.LabelField("プリセット");
foreach (var presets in AvatarParametersPresetsList)
Expand All @@ -71,7 +75,7 @@ void OnGUI()
PresetEditor = Editor.CreateEditor(Presets, typeof(AvatarParametersPresetsRuntimeEditor)) as AvatarParametersPresetsRuntimeEditor;
}
EditorGUI.BeginDisabledGroup(true);
EditorGUILayout.ObjectField(presets, typeof(AvatarParametersPresets), true);
EditorGUILayout.ObjectField(presets, typeof(AvatarParametersSaverPlayModePersist.StoreDataGroupAsset), true);
EditorGUI.EndDisabledGroup();
EditorGUILayout.EndHorizontal();
}
Expand Down
207 changes: 152 additions & 55 deletions Editor/AvatarParametersSaverPlayModePersist.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
using net.narazaka.vrchat.avatar_parameters_saver.editor.util;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
using VRC.SDK3.Avatars.Components;

namespace net.narazaka.vrchat.avatar_parameters_saver.editor
{
Expand All @@ -14,91 +17,185 @@ public static class AvatarParametersSaverPlayModePersist
[Serializable]
public class StoreDataGroup
{
public int instanceID;
public int instanceId;
public int avatarObjectInstanceId;
public string name;
public AvatarParametersSaverPresetGroup avatarParametersSaverPresetGroup;
}

public class StoreDataGroupAsset : ScriptableObject
{
public int instanceId;
public int avatarObjectInstanceId;
public AvatarParametersSaverPresetGroup AvatarParametersSaverPresetGroup;

public StoreDataGroup ToStoreDataGroup() => new StoreDataGroup
{
instanceId = instanceId,
avatarObjectInstanceId = avatarObjectInstanceId,
name = name,
avatarParametersSaverPresetGroup = AvatarParametersSaverPresetGroup,
};
}

[Serializable]
public class StoreData
{
public StoreDataGroup[] StoreDataGroups;
}

static Dictionary<int, AvatarParametersSaverPresetGroup> data;

static AvatarParametersSaverPlayModePersist()
{
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
public static void PersistedToScene()
{
if (!EditorPrefs.HasKey(playModePersistKey)) return;
var json = EditorPrefs.GetString(playModePersistKey);
EditorPrefs.DeleteKey(playModePersistKey);
var storeData = JsonUtility.FromJson<StoreData>(json);
if (storeData != null)
{
foreach (var storeDataGroup in storeData.StoreDataGroups)
{
var obj = EditorUtility.InstanceIDToObject(storeDataGroup.instanceId) as AvatarParametersPresets;
if (obj == null) continue;
UndoUtility.RecordObject(obj, "play mode restore");
if (obj.AvatarParametersSaverPresetGroup == null) obj.AvatarParametersSaverPresetGroup = new AvatarParametersSaverPresetGroup();
obj.AvatarParametersSaverPresetGroup.parameterName = storeDataGroup.avatarParametersSaverPresetGroup.parameterName;
obj.AvatarParametersSaverPresetGroup.networkSynced = storeDataGroup.avatarParametersSaverPresetGroup.networkSynced;
obj.AvatarParametersSaverPresetGroup.presets = storeDataGroup.avatarParametersSaverPresetGroup.presets;
obj.AvatarParametersSaverPresetGroup.IndexOffset = storeDataGroup.avatarParametersSaverPresetGroup.IndexOffset;
obj.AvatarParametersSaverPresetGroup.icon = storeDataGroup.avatarParametersSaverPresetGroup.icon;
}
}
}
}

static void OnPlayModeStateChanged(PlayModeStateChange state)
class SceneData
{
if (state == PlayModeStateChange.EnteredEditMode)
public static void SceneToPersist()
{
Load();
if (EditorPrefs.HasKey(playModePersistKey)) EditorPrefs.DeleteKey(playModePersistKey);
var sceneData = new SceneData();
foreach (var preset in SceneManager.GetActiveScene().GetRootGameObjects().SelectMany(go => go.GetComponentsInChildren<AvatarParametersPresets>(true)))
{
sceneData.Store(preset);
}
sceneData.DataToPersist();
}
else if (state == PlayModeStateChange.ExitingPlayMode)

public Dictionary<int, StoreDataGroup> data;

public void Store(AvatarParametersPresets avatarParametersPresets)
{
Save();
var instanceId = avatarParametersPresets.GetInstanceID();
var avatarObject = avatarParametersPresets.GetComponentInParent<VRCAvatarDescriptor>()?.gameObject;
if (data == null) data = new Dictionary<int, StoreDataGroup>();
var storeDataGroup = data[instanceId] = new StoreDataGroup();
storeDataGroup.instanceId = instanceId;
storeDataGroup.avatarObjectInstanceId = avatarObject == null ? -1 : avatarObject.GetInstanceID();
storeDataGroup.name = avatarParametersPresets.name;
storeDataGroup.avatarParametersSaverPresetGroup = avatarParametersPresets.AvatarParametersSaverPresetGroup;
}
else if (state == PlayModeStateChange.EnteredPlayMode)

public void DataToPersist()
{
Initialize();
if (data == null) return;
var storeData = new StoreData();
storeData.StoreDataGroups = new StoreDataGroup[data.Count];
int i = 0;
foreach (var pair in data)
{
storeData.StoreDataGroups[i] = pair.Value;
i++;
}
var json = JsonUtility.ToJson(storeData);
EditorPrefs.SetString(playModePersistKey, json);
}
}

public static void Store(AvatarParametersPresets avatarParametersPresets)
class PlayData
{
if (!EditorApplication.isPlaying) return;
if (data == null) data = new Dictionary<int, AvatarParametersSaverPresetGroup>();
data[avatarParametersPresets.GetInstanceID()] = avatarParametersPresets.AvatarParametersSaverPresetGroup;
public static PlayData FromPersisted()
{
if (!EditorPrefs.HasKey(playModePersistKey)) return null;
var json = EditorPrefs.GetString(playModePersistKey);
EditorPrefs.DeleteKey(playModePersistKey);
var storeData = JsonUtility.FromJson<StoreData>(json);
if (storeData == null) return null;
var playData = new PlayData();
foreach (var storeDataGroup in storeData.StoreDataGroups)
{
playData.Restore(storeDataGroup.instanceId, storeDataGroup.avatarObjectInstanceId, storeDataGroup.name, storeDataGroup.avatarParametersSaverPresetGroup);
}
return playData;
}

public Dictionary<int, StoreDataGroupAsset> data;

public StoreDataGroupAsset[] ForAvatar(VRCAvatarDescriptor avatar)
{
if (data == null) return null;
var avatarObjectInstanceId = avatar.gameObject.GetInstanceID();
return data.Values.Where(d => d.avatarObjectInstanceId == avatarObjectInstanceId).ToArray();
}

public void Restore(int instanceId, int avatarObjectInstanceId, string name, AvatarParametersSaverPresetGroup avatarParametersSaverPresetGroup)
{
if (data == null) data = new Dictionary<int, StoreDataGroupAsset>();
var storeDataGroup = data[instanceId] = ScriptableObject.CreateInstance<StoreDataGroupAsset>();
storeDataGroup.instanceId = instanceId;
storeDataGroup.avatarObjectInstanceId = avatarObjectInstanceId;
storeDataGroup.name = name;
storeDataGroup.AvatarParametersSaverPresetGroup = avatarParametersSaverPresetGroup;
}

public void Store(StoreDataGroupAsset storeDataGroup)
{
data[storeDataGroup.instanceId].AvatarParametersSaverPresetGroup = storeDataGroup.AvatarParametersSaverPresetGroup;
}

public void DataToPersist()
{
if (data == null) return;
var storeData = new StoreData();
storeData.StoreDataGroups = new StoreDataGroup[data.Count];
int i = 0;
foreach (var pair in data)
{
storeData.StoreDataGroups[i] = pair.Value.ToStoreDataGroup();
i++;
}
var json = JsonUtility.ToJson(storeData);
EditorPrefs.SetString(playModePersistKey, json);
}
}

static void Initialize()
static PlayData playData;

static AvatarParametersSaverPlayModePersist()
{
if (EditorPrefs.HasKey(playModePersistKey)) EditorPrefs.DeleteKey(playModePersistKey);
data = null;
EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
}

static void Save()
static void OnPlayModeStateChanged(PlayModeStateChange state)
{
if (data == null) return;
var storeData = new StoreData();
storeData.StoreDataGroups = new StoreDataGroup[data.Count];
int i = 0;
foreach (var pair in data)
if (state == PlayModeStateChange.EnteredEditMode)
{
storeData.StoreDataGroups[i] = new StoreDataGroup();
storeData.StoreDataGroups[i].instanceID = pair.Key;
storeData.StoreDataGroups[i].avatarParametersSaverPresetGroup = pair.Value;
i++;
StoreData.PersistedToScene();
}
var json = JsonUtility.ToJson(storeData);
EditorPrefs.SetString(playModePersistKey, json);
}

public static void Load()
{
if (!EditorPrefs.HasKey(playModePersistKey)) return;
var json = EditorPrefs.GetString(playModePersistKey);
EditorPrefs.DeleteKey(playModePersistKey);
var storeData = JsonUtility.FromJson<StoreData>(json);
if (storeData != null)
else if (state == PlayModeStateChange.ExitingPlayMode)
{
if (data == null) data = new Dictionary<int, AvatarParametersSaverPresetGroup>();
foreach (var storeDataGroup in storeData.StoreDataGroups)
{
var obj = EditorUtility.InstanceIDToObject(storeDataGroup.instanceID) as AvatarParametersPresets;
if (obj == null) continue;
UndoUtility.RecordObject(obj, "play mode restore");
if (obj.AvatarParametersSaverPresetGroup == null) obj.AvatarParametersSaverPresetGroup = new AvatarParametersSaverPresetGroup();
obj.AvatarParametersSaverPresetGroup.parameterName = storeDataGroup.avatarParametersSaverPresetGroup.parameterName;
obj.AvatarParametersSaverPresetGroup.networkSynced = storeDataGroup.avatarParametersSaverPresetGroup.networkSynced;
obj.AvatarParametersSaverPresetGroup.presets = storeDataGroup.avatarParametersSaverPresetGroup.presets;
obj.AvatarParametersSaverPresetGroup.IndexOffset = storeDataGroup.avatarParametersSaverPresetGroup.IndexOffset;
obj.AvatarParametersSaverPresetGroup.icon = storeDataGroup.avatarParametersSaverPresetGroup.icon;
}
playData.DataToPersist();
}
else if (state == PlayModeStateChange.EnteredPlayMode)
{
playData = PlayData.FromPersisted();
}
else if (state == PlayModeStateChange.ExitingEditMode)
{
SceneData.SceneToPersist();
}
}

public static StoreDataGroupAsset[] ForAvatar(VRCAvatarDescriptor avatar) => playData?.ForAvatar(avatar);

public static void Store(StoreDataGroupAsset storeDataGroupAsset) => playData?.Store(storeDataGroupAsset);
}
}
27 changes: 0 additions & 27 deletions Scripts/AvatarParametersPresetsInformation.cs

This file was deleted.

11 changes: 0 additions & 11 deletions Scripts/AvatarParametersPresetsInformation.cs.meta

This file was deleted.

0 comments on commit 8c02147

Please sign in to comment.