Files
2026-05-08 11:04:00 +08:00

128 lines
4.8 KiB
C#

using UnityEngine;
using UnityEditor;
using System.IO;
using System;
using System.Linq;
namespace Assets.PathBerserker2d.Scripts.PathBerserker2d.Upgrade
{
class MissingScriptResolver
{
string navAgentFI;
string navSurfaceFI;
string navSegmentSubstractorFI;
string navAreaMarkerFI;
string dynamicObstacleFI;
public static void UpdateReferences()
{
string dllGuid = "45d3c5b18a3fb854b94b339e477774af";
int navAgentFI = -1018851484;
string navAgentGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs");
int navSurfaceFI = -567900050;
string navSurfaceGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs");
int navLinkFI = -546232842;
string navLinkGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs");
int navLinkClusterFI = 1837436107;
string navLinkClusterGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs");
int navSegmentSubstractorFI = -274983532;
string navSegmentSubstractorGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs");
int navAreaMarkerFI = 709968320;
string navAreaMarkerGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs");
int dynamicObstacleFI = -721922897;
string dynamicObstacleGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs");
int pathBerserker2dSettingsFI = -1515731982;
string pathBerserker2dSettingsGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs");
int[] fis = new int[] {
navAgentFI,
navSurfaceFI,
navSegmentSubstractorFI,
navAreaMarkerFI,
dynamicObstacleFI,
pathBerserker2dSettingsFI,
navLinkFI,
navLinkClusterFI
};
string[] guids = new string[] {
navAgentGUID,
navSurfaceGUID,
navSegmentSubstractorGUID,
navAreaMarkerGUID,
dynamicObstacleGUID,
pathBerserker2dSettingsGUID,
navLinkGUID,
navLinkClusterGUID
};
for (int i = 0; i < guids.Length; i++)
{
if (guids[i] == null)
{
Debug.LogError("One or multiple cs files could not be found. Aborting upgrade. Please make sure that the Plugin files are in Assets/PathBerserker2d");
return;
}
}
// first patch settings
foreach (var metaFile in Directory.EnumerateFiles(System.IO.Path.Combine(Application.dataPath, "PathBerserker2d/Resources/"), "*.asset", SearchOption.AllDirectories))
{
FixFile(metaFile, fis, dllGuid, guids);
}
// patch everything else
foreach (var metaFile in Directory.EnumerateFiles(Application.dataPath, "*", SearchOption.AllDirectories).Where(f => f.EndsWith(".unity") || f.EndsWith(".prefab")))
{
FixFile(metaFile, fis, dllGuid, guids);
}
Debug.Log("Finished!");
}
private static void FixFile(string path, int[] fis, string dllGuid, string[] guids)
{
try
{
FileInfo file = new FileInfo(path);
bool isHidden = (file.Attributes & FileAttributes.Hidden) != 0;
file.Attributes &= ~FileAttributes.Hidden;
string prevText = File.ReadAllText(path);
string text = prevText;
for (int i = 0; i < fis.Length; i++)
{
text = text.Replace($"fileID: {fis[i]}, guid: {dllGuid}",
$"fileID: 11500000, guid: {guids[i]}");
}
File.WriteAllText(path, text);
if (isHidden)
file.Attributes |= FileAttributes.Hidden;
if (prevText != text)
{
Debug.Log("Updated " + path);
}
}
catch (UnauthorizedAccessException e)
{
Debug.LogError(e);
}
catch (IOException e)
{
Debug.LogError(e);
}
}
}
}