Skip to content

Commit 51d3beb

Browse files
committed
v1.0.0.0
1 parent 4ed1cdc commit 51d3beb

15 files changed

+388
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
.DS_Store

CustomBuildUpdater.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CustomBuildUpdater/Editor.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using UnityEngine;
2+
3+
namespace RimuruDev.Unity_CustomBuildUpdater.CustomBuildUpdater.Editor
4+
{
5+
[CreateAssetMenu(fileName = "BuildConfig", menuName = "Configs/Build/BuildConfig", order = 1)]
6+
public class BuildConfig : ScriptableObject
7+
{
8+
public string companyName = "AbyssMoth";
9+
public string productName = "SuperGame";
10+
public BuildPathType buildPathType = BuildPathType.Default;
11+
public string customBuildPath = "Builds";
12+
public bool archiveBuild = true;
13+
public VersionType versionType = VersionType.Build;
14+
public string versionPattern = "com.{company}.{product}.v{version}";
15+
}
16+
}

CustomBuildUpdater/Editor/BuildConfig.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using UnityEditor;
2+
using UnityEngine;
3+
4+
namespace RimuruDev.Unity_CustomBuildUpdater.CustomBuildUpdater.Editor
5+
{
6+
[CustomEditor(typeof(BuildConfig))]
7+
public class BuildConfigEditor : UnityEditor.Editor
8+
{
9+
public override void OnInspectorGUI()
10+
{
11+
var config = (BuildConfig)target;
12+
13+
config.companyName = EditorGUILayout.TextField("Company Name", config.companyName);
14+
config.productName = EditorGUILayout.TextField("Product Name", config.productName);
15+
config.buildPathType = (BuildPathType)EditorGUILayout.EnumPopup("Build Path Type", config.buildPathType);
16+
17+
if (config.buildPathType == BuildPathType.Custom)
18+
{
19+
config.customBuildPath = EditorGUILayout.TextField("Custom Build Path", config.customBuildPath);
20+
}
21+
22+
config.archiveBuild = EditorGUILayout.Toggle("Archive Build", config.archiveBuild);
23+
config.versionType = (VersionType)EditorGUILayout.EnumPopup("Version Type", config.versionType);
24+
config.versionPattern = EditorGUILayout.TextField("Version Pattern", config.versionPattern);
25+
26+
if (GUILayout.Button("Initialize BuildConfig"))
27+
{
28+
CreateOrSelectBuildConfig();
29+
}
30+
31+
if (GUI.changed)
32+
{
33+
EditorUtility.SetDirty(config);
34+
}
35+
}
36+
37+
[MenuItem("RimuruDev Tools/Initialize BuildConfig")]
38+
private static void CreateOrSelectBuildConfig()
39+
{
40+
var path = "Assets/Resources/Editor/BuildConfig.asset";
41+
var config = AssetDatabase.LoadAssetAtPath<BuildConfig>(path);
42+
43+
if (config == null)
44+
{
45+
config = CreateInstance<BuildConfig>();
46+
config.companyName = PlayerSettings.companyName;
47+
config.productName = PlayerSettings.productName;
48+
49+
if (!AssetDatabase.IsValidFolder("Assets/Resources"))
50+
{
51+
AssetDatabase.CreateFolder("Assets", "Resources");
52+
}
53+
54+
if (!AssetDatabase.IsValidFolder("Assets/Resources/Editor"))
55+
{
56+
AssetDatabase.CreateFolder("Assets/Resources", "Editor");
57+
}
58+
59+
AssetDatabase.CreateAsset(config, path);
60+
AssetDatabase.SaveAssets();
61+
Debug.Log("BuildConfig created at " + path);
62+
}
63+
else
64+
{
65+
Debug.Log("BuildConfig already exists at " + path);
66+
}
67+
68+
EditorUtility.FocusProjectWindow();
69+
Selection.activeObject = config;
70+
}
71+
}
72+
}

CustomBuildUpdater/Editor/BuildConfigEditor.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace RimuruDev.Unity_CustomBuildUpdater.CustomBuildUpdater.Editor
2+
{
3+
public enum BuildPathType : byte
4+
{
5+
Custom = 0,
6+
Default = 1,
7+
}
8+
}

CustomBuildUpdater/Editor/BuildPathType.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
using System.IO;
2+
using System.IO.Compression;
3+
using System.Threading;
4+
using UnityEditor;
5+
using UnityEditor.Build;
6+
using UnityEditor.Build.Reporting;
7+
using UnityEngine;
8+
9+
namespace RimuruDev.Unity_CustomBuildUpdater.CustomBuildUpdater.Editor
10+
{
11+
public class BuildVersionUpdater : IPreprocessBuildWithReport, IPostprocessBuildWithReport
12+
{
13+
public int callbackOrder => 0;
14+
15+
private static BuildConfig config;
16+
private static string defaultBuildPath = "Builds";
17+
18+
private void LoadConfig()
19+
{
20+
config = Resources.Load<BuildConfig>("Editor/BuildConfig");
21+
if (config == null)
22+
{
23+
Debug.LogError("BuildConfig not found. Please create it in the Resources/Editor folder.");
24+
}
25+
}
26+
27+
public void OnPreprocessBuild(BuildReport report)
28+
{
29+
LoadConfig();
30+
31+
if (config == null)
32+
return;
33+
34+
EnsureVersionFileExists();
35+
36+
var version = GetNextVersion();
37+
PlayerSettings.bundleVersion = version;
38+
39+
PlayerSettings.productName = config.productName;
40+
PlayerSettings.companyName = config.companyName;
41+
42+
Debug.Log($"New version: {version}");
43+
}
44+
45+
public void OnPostprocessBuild(BuildReport report)
46+
{
47+
LoadConfig();
48+
49+
if (config == null)
50+
return;
51+
52+
var buildPath = report.summary.outputPath;
53+
var extension = GetBuildExtension(report.summary.platform);
54+
var finalBuildPath = GetFinalBuildPath(buildPath, extension);
55+
56+
if (Directory.Exists(buildPath) || File.Exists(buildPath))
57+
{
58+
RenameBuildPath(buildPath, finalBuildPath);
59+
Debug.Log($"Build renamed to: {finalBuildPath}");
60+
}
61+
62+
Thread.Sleep(1000);
63+
64+
if (config.archiveBuild)
65+
{
66+
ArchiveBuild(finalBuildPath);
67+
}
68+
}
69+
70+
private void EnsureVersionFileExists()
71+
{
72+
var versionFilePath = Path.Combine(Application.dataPath, "Resources/Editor/version.txt");
73+
if (!File.Exists(versionFilePath))
74+
{
75+
Directory.CreateDirectory(Path.GetDirectoryName(versionFilePath));
76+
File.WriteAllText(versionFilePath, "1.0.0.0");
77+
}
78+
}
79+
80+
private string GetNextVersion()
81+
{
82+
var versionFilePath = Path.Combine(Application.dataPath, "Resources/Editor/version.txt");
83+
var version = File.ReadAllText(versionFilePath);
84+
var versionParts = version.Split('.');
85+
var major = int.Parse(versionParts[0]);
86+
var feature = int.Parse(versionParts[1]);
87+
var bugfix = int.Parse(versionParts[2]);
88+
var build = int.Parse(versionParts[3]);
89+
build++;
90+
91+
switch (config.versionType)
92+
{
93+
case VersionType.Major:
94+
major++;
95+
feature = 0;
96+
bugfix = 0;
97+
build = 1;
98+
break;
99+
case VersionType.Feature:
100+
feature++;
101+
bugfix = 0;
102+
build = 1;
103+
break;
104+
case VersionType.Bugfix:
105+
bugfix++;
106+
build = 1;
107+
break;
108+
case VersionType.Build:
109+
break;
110+
}
111+
112+
version = $"{major}.{feature}.{bugfix}.{build}";
113+
File.WriteAllText(versionFilePath, version);
114+
return version;
115+
}
116+
117+
private string GetBuildExtension(BuildTarget platform)
118+
{
119+
switch (platform)
120+
{
121+
case BuildTarget.StandaloneWindows:
122+
case BuildTarget.StandaloneWindows64:
123+
return ".exe";
124+
case BuildTarget.WebGL:
125+
return "";
126+
default:
127+
return "";
128+
}
129+
}
130+
131+
private string GetFinalBuildPath(string buildPath, string extension)
132+
{
133+
string finalPath;
134+
if (config.buildPathType == BuildPathType.Default)
135+
{
136+
finalPath = Path.Combine(Application.dataPath, "..", defaultBuildPath,
137+
$"{config.companyName}.{config.productName}.v{PlayerSettings.bundleVersion}{extension}");
138+
}
139+
else
140+
{
141+
finalPath = Path.Combine(config.customBuildPath,
142+
$"{config.companyName}.{config.productName}.v{PlayerSettings.bundleVersion}{extension}");
143+
}
144+
145+
return finalPath;
146+
}
147+
148+
private void RenameBuildPath(string oldPath, string newPath)
149+
{
150+
try
151+
{
152+
if (Directory.Exists(oldPath))
153+
{
154+
Directory.Move(oldPath, newPath);
155+
}
156+
else if (File.Exists(oldPath))
157+
{
158+
File.Move(oldPath, newPath);
159+
}
160+
}
161+
catch (DirectoryNotFoundException directoryNotFoundException)
162+
{
163+
Debug.Log(
164+
"<color=red>You have collected the project in the wrong folder that you specified in the settings!!!</color>");
165+
Debug.LogException(directoryNotFoundException);
166+
}
167+
}
168+
169+
private void ArchiveBuild(string buildPath)
170+
{
171+
var archivePath = buildPath + ".zip";
172+
173+
if (!File.Exists(archivePath))
174+
{
175+
CreateZipFromDirectory(buildPath, archivePath);
176+
}
177+
else
178+
{
179+
for (var i = 1; i < 100; i++)
180+
{
181+
var numberedArchivePath = buildPath + $"_{i}.zip";
182+
if (!File.Exists(numberedArchivePath))
183+
{
184+
CreateZipFromDirectory(buildPath, numberedArchivePath);
185+
break;
186+
}
187+
}
188+
}
189+
190+
Debug.Log($"Build archived to: {archivePath}");
191+
}
192+
193+
private void CreateZipFromDirectory(string sourceDir, string zipFile)
194+
{
195+
using (var zip = ZipFile.Open(zipFile, ZipArchiveMode.Create))
196+
{
197+
var dirInfo = new DirectoryInfo(sourceDir);
198+
199+
foreach (var file in dirInfo.GetFiles())
200+
{
201+
zip.CreateEntryFromFile(file.FullName, file.Name);
202+
}
203+
204+
foreach (var dir in dirInfo.GetDirectories())
205+
{
206+
AddDirectoryToZip(zip, dir, dir.Name);
207+
}
208+
}
209+
}
210+
211+
private void AddDirectoryToZip(ZipArchive zip, DirectoryInfo dir, string entryName)
212+
{
213+
foreach (var file in dir.GetFiles())
214+
{
215+
zip.CreateEntryFromFile(file.FullName, Path.Combine(entryName, file.Name));
216+
}
217+
218+
foreach (var subDir in dir.GetDirectories())
219+
{
220+
AddDirectoryToZip(zip, subDir, Path.Combine(entryName, subDir.Name));
221+
}
222+
}
223+
}
224+
}

0 commit comments

Comments
 (0)