You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HighGroundRoyaleFusion/Assets/Photon/Fusion/Editor/NetworkProjectConfigImporte...

139 lines
5.0 KiB
C#

3 weeks ago
namespace Fusion.Editor {
using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.AssetImporters;
using UnityEngine;
[CustomEditor(typeof(NetworkProjectConfigImporter))]
internal class NetworkProjectConfigImporterEditor : ScriptedImporterEditor {
private Exception _initializeException;
private static bool _versionExpanded;
private static string _version;
private static string _allVersionInfo;
public override bool showImportedObject => false;
protected override Type extraDataType => typeof(NetworkProjectConfigAsset);
public override void OnInspectorGUI() {
bool rebuildPrefabTable = false;
try {
if (_initializeException != null) {
EditorGUILayout.HelpBox(_initializeException.ToString(), MessageType.Error, true);
} else {
FusionEditorGUI.InjectScriptHeaderDrawer(extraDataSerializedObject);
FusionEditorGUI.ScriptPropertyField(extraDataSerializedObject);
VersionInfoGUI();
using (new EditorGUI.DisabledScope(HasModified())) {
rebuildPrefabTable = GUILayout.Button("Rebuild Prefab Table");
}
extraDataSerializedObject.Update();
EditorGUILayout.PropertyField(extraDataSerializedObject.FindPropertyOrThrow(nameof(NetworkProjectConfigAsset.Config)));
extraDataSerializedObject.ApplyModifiedProperties();
EditorGUILayout.PropertyField(serializedObject.FindProperty(nameof(NetworkProjectConfigImporter.PrefabOptions)));
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.LabelField("Auto-Generated", EditorStyles.boldLabel);
if (GUILayout.Button("Show Network Prefabs Inspector")) {
NetworkPrefabsInspector.ShowWindow();
}
// WORKAROUND: during initial failed imports, this may be an instance of UnityEngine.DefaultAsset instead of the actual asset
if (assetSerializedObject?.targetObject.GetType() == typeof(NetworkProjectConfigAsset)) {
// this has the tendency to overwrite the global enabled flag, so let's make sure it's reset once the scope exists
using (new FusionEditorGUI.EnabledScope(GUI.enabled)) {
EditorGUILayout.PropertyField(assetSerializedObject.FindPropertyOrThrow(nameof(NetworkProjectConfigAsset.Prefabs)));
EditorGUILayout.PropertyField(assetSerializedObject.FindPropertyOrThrow(nameof(NetworkProjectConfigAsset.BehaviourMeta)));
}
} else {
EditorGUILayout.HelpBox("Asset failed to deserialize correctly. Please reimport.", MessageType.Warning);
}
}
} finally {
ApplyRevertGUI();
}
if (rebuildPrefabTable) {
NetworkProjectConfigUtilities.RebuildPrefabTable();
}
}
private static void VersionInfoGUI() {
if (_allVersionInfo == null || _allVersionInfo == "") {
var asms = System.AppDomain.CurrentDomain.GetAssemblies();
for (int i = 0; i < asms.Length; ++i) {
var asm = asms[i];
var asmname = asm.FullName;
if (asmname.StartsWith("Fusion.Runtime,")) {
_version = NetworkRunner.BuildType + ": " + System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location).ProductVersion;
}
if (asmname.StartsWith("Fusion.") || asmname.StartsWith("Fusion,")) {
string fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(asm.Location).ToString();
_allVersionInfo += asmname.Substring(0, asmname.IndexOf(",")) + ": " + fvi + " " + "\n";
}
}
}
var r = EditorGUILayout.GetControlRect();
_versionExpanded = EditorGUI.Foldout(r, _versionExpanded, "");
EditorGUI.LabelField(r, "Fusion Version", _version);
if (_versionExpanded) {
EditorGUILayout.HelpBox(_allVersionInfo, MessageType.None);
}
}
protected override void Apply() {
base.Apply();
if (targets != null) {
for (int i = 0; i < extraDataTargets.Length; ++i) {
var importer = GetImporter(i);
var wrapper = GetConfigWrapper(i);
EditorUtility.SetDirty(importer);
var json = EditorJsonUtility.ToJson(wrapper.Config, true);
File.WriteAllText(importer.assetPath, json);
}
}
}
protected override void InitializeExtraDataInstance(UnityEngine.Object extraData, int targetIndex) {
try {
var importer = GetImporter(targetIndex);
var extra = (NetworkProjectConfigAsset)extraData;
extra.Config = NetworkProjectConfigImporter.LoadConfigFromFile(importer.assetPath);
_initializeException = null;
} catch (Exception ex) {
_initializeException = ex;
}
}
private NetworkProjectConfigImporter GetImporter(int i) {
return (NetworkProjectConfigImporter)targets[i];
}
private NetworkProjectConfigAsset GetConfigWrapper(int i) {
return (NetworkProjectConfigAsset)extraDataTargets[i];
}
}
}