Skip to content

Commit 3d6de56

Browse files
committed
UniMasterLinker v0.0.1
1 parent 9181b98 commit 3d6de56

30 files changed

+650
-22
lines changed

Assets/UniMasterLinker.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.

Assets/UniMasterLinker/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: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "UniMasterLinkerEditor",
3+
"rootNamespace": "",
4+
"references": [
5+
"GUID:f51ebe6a0ceec4240a699833d6309b23",
6+
"GUID:6e39405796c454faf92785f4f1c7ff0e",
7+
"GUID:343deaaf83e0cee4ca978e7df0b80d21"
8+
],
9+
"includePlatforms": [],
10+
"excludePlatforms": [
11+
"Editor"
12+
],
13+
"allowUnsafeCode": false,
14+
"overrideReferences": false,
15+
"precompiledReferences": [],
16+
"autoReferenced": true,
17+
"defineConstraints": [],
18+
"versionDefines": [],
19+
"noEngineReferences": false
20+
}

Assets/UniMasterLinker/Editor/UniMasterLinkerEditor.asmdef.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#if UNITY_EDITOR
2+
3+
using System.Threading;
4+
using Cysharp.Threading.Tasks;
5+
using UniMasterLinker.API;
6+
using UniMasterLinker.Util;
7+
using UnityEditor;
8+
9+
namespace UniMasterLinker.Editor
10+
{
11+
/// <summary>
12+
/// ゲームデータオブジェクトの更新
13+
/// </summary>
14+
public class UpdateGameDataObject : EditorWindow
15+
{
16+
private static CancellationTokenSource _cancellationTokenSource;
17+
18+
/// <summary>
19+
/// ゲームデータオブジェクトの更新
20+
/// </summary>
21+
[MenuItem("UniMasterLinker/ゲームデータオブジェクトの更新")]
22+
private static void UpdateDataObject()
23+
{
24+
_cancellationTokenSource = new CancellationTokenSource();
25+
UpdateDataObjectInternal(_cancellationTokenSource.Token).Forget();
26+
}
27+
28+
/// <summary>
29+
/// ゲームデータオブジェクトの更新
30+
/// </summary>
31+
/// <param name="token"></param>
32+
public static async UniTask UpdateDataObject(CancellationToken token)
33+
{
34+
await UpdateDataObjectInternal(token);
35+
}
36+
37+
/// <summary>
38+
/// ゲームデータオブジェクトの更新
39+
/// </summary>
40+
/// <param name="token"></param>
41+
private static async UniTask UpdateDataObjectInternal(CancellationToken token)
42+
{
43+
// 実装例
44+
// var enemyResponse = GoogleSheetUtil.GetGameInfo<EnemyResponse>(Constant.Constant.GameMasterSheetURL,
45+
// Constant.Constant.EnemySheetName, token);
46+
// var enemy = await UniTask.WhenAll(enemyResponse);
47+
//
48+
// UpdateDataObject(enemy);
49+
50+
// ゲームデータオブジェクトの更新
51+
AssetDatabase.SaveAssets();
52+
AssetDatabase.Refresh();
53+
}
54+
55+
/// <summary>
56+
/// ゲームデータオブジェクトの更新
57+
/// </summary>
58+
/// <param name="responseBase"></param>
59+
/// <typeparam name="T"></typeparam>
60+
private static DataObjectBase<T> UpdateDataObject<T>(ResponseBase<T> responseBase)
61+
{
62+
var data = AssetDatabase.LoadAssetAtPath<DataObjectBase<T>>(Constant.Constant.DataObjectPath +
63+
GetDataObjectName(responseBase));
64+
data.SetData(responseBase.gameInfo);
65+
66+
EditorUtility.SetDirty(data);
67+
return data;
68+
}
69+
70+
/// <summary>
71+
/// レスポンスクラス名からデータオブジェクト名を取得する
72+
/// </summary>
73+
/// <param name="responseClassName"></param>
74+
/// <typeparam name="T"></typeparam>
75+
/// <returns></returns>
76+
private static string GetDataObjectName<T>(T responseClassName)
77+
{
78+
return responseClassName.GetType().Name.Replace("Response", "DataObject.asset");
79+
}
80+
}
81+
}
82+
#endif

Assets/UniMasterLinker/Editor/UpdateGameDataObject.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: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
#if UNITY_EDITOR
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Text;
5+
using Cysharp.Threading.Tasks;
6+
using UniMasterLinker.Util;
7+
using UnityEditor;
8+
using UnityEngine;
9+
10+
namespace UniMasterLinker.Editor
11+
{
12+
/// <summary>
13+
/// ゲームマスターのAPIクラスを更新するエディタ拡張
14+
/// </summary>
15+
public class UpdateGameMasterAPIClass : EditorWindow
16+
{
17+
private const string DataRootPath = "/UniMasterLinker/Scripts/API/";
18+
19+
/// <summary>
20+
/// APIクラスの更新
21+
/// </summary>
22+
[MenuItem("UniMasterLinker/APIクラスの更新")]
23+
private static async void UpdateAPIClassFile()
24+
{
25+
// 実装例
26+
// var playerGameInfo = GoogleSheetUtil.GetGameInfo(Constant.Constant.GameMasterSheetURL,
27+
// Constant.Constant.PlayerSheetName);
28+
//
29+
// var (playerPramJson) =
30+
// await UniTask.WhenAll(playerGameInfo);
31+
//
32+
// // プレイヤーの初期パラメータAPIクラスを生成
33+
// CreateParamAPIClassFile(playerPramJson, Constant.Constant.PlayerSheetName);
34+
}
35+
36+
/// <summary>
37+
/// パラメータのAPIクラスの作成
38+
/// </summary>
39+
/// <param name="paramJson"></param>
40+
/// <param name="fileName"></param>
41+
private static void CreateParamAPIClassFile(string paramJson, string fileName)
42+
{
43+
var paramString = CreateParameterContents(paramJson);
44+
var scriptContent = CreateScriptContent(fileName, paramString);
45+
CreateScript(fileName, scriptContent);
46+
}
47+
48+
/// <summary>
49+
/// スクリプトファイルを生成
50+
/// </summary>
51+
/// <param name="path"></param>
52+
/// <param name="content"></param>
53+
private static void CreateScript(string path, string content)
54+
{
55+
path = Application.dataPath + "/" + path;
56+
57+
using (var writer = new StreamWriter(path, false))
58+
{
59+
writer.WriteLine(content);
60+
}
61+
62+
AssetDatabase.Refresh();
63+
}
64+
65+
/// <summary>
66+
/// スクリプトの内容を生成
67+
/// </summary>
68+
/// <param name="className"></param>
69+
/// <param name="parameterContents"></param>
70+
/// <returns></returns>
71+
private static string CreateScriptContent(string className, string parameterContents)
72+
{
73+
return $@"// <auto-generated/>
74+
// このコードは自動生成されたものです。手動で編集しないでください。
75+
using System.Collections.Generic;
76+
using UnityEngine;
77+
78+
namespace API
79+
{{
80+
/// <summary>
81+
/// マスターデータから取得する際の{className}パラメータクラス
82+
/// </summary>
83+
[System.Serializable]
84+
public partial class {className}Data
85+
{{
86+
{parameterContents}
87+
}}
88+
89+
/// <summary>
90+
/// マスターデータから取得する際にレスポンスクラス
91+
/// </summary>
92+
[System.Serializable]
93+
public class {className}Response : ResponseBase<{className}Data>
94+
{{
95+
}}
96+
}}";
97+
}
98+
99+
/// <summary>
100+
/// パラメータの内容を生成
101+
/// </summary>
102+
/// <returns></returns>
103+
private static string CreateParameterContents(string paramJson)
104+
{
105+
var parameterKeyList = GoogleSheetUtil.GetParameterKeyList(paramJson);
106+
var parameterTypeList = GoogleSheetUtil.GetParameterTypeList(paramJson);
107+
var parameterDescriptionList = GoogleSheetUtil.GetParameterDescriptionList(paramJson);
108+
return CreateParameterClassContents(parameterKeyList, parameterTypeList, parameterDescriptionList);
109+
}
110+
111+
/// <summary>
112+
/// パラメータの内容を生成
113+
/// </summary>
114+
/// <param name="keys"></param>
115+
/// <param name="types"></param>
116+
/// <param name="descriptions"></param>
117+
/// <returns></returns>
118+
private static string CreateParameterClassContents(IReadOnlyList<string> keys, IReadOnlyList<string> types,
119+
IReadOnlyList<string> descriptions)
120+
{
121+
var parameterString = new StringBuilder();
122+
123+
for (var keyIndex = 0; keyIndex < keys.Count; keyIndex++)
124+
{
125+
var key = keys[keyIndex];
126+
// Summary文の作成
127+
var descriptionValue = string.IsNullOrEmpty(descriptions[keyIndex]) ? key : descriptions[keyIndex];
128+
var summaryString = $"/// <summary>\n /// {descriptionValue}\n /// </summary>\n";
129+
if (keyIndex == 0)
130+
{
131+
parameterString.Append(
132+
$"{summaryString} public {types[keyIndex]} " +
133+
key +
134+
";\n\n");
135+
}
136+
else if (keyIndex == keys.Count - 1)
137+
{
138+
parameterString.Append(
139+
$"\t\t{summaryString} public {types[keyIndex]} " +
140+
key + ";");
141+
}
142+
else
143+
{
144+
parameterString.Append(
145+
$"\t\t{summaryString} public {types[keyIndex]} " +
146+
key + ";\n\n");
147+
}
148+
}
149+
150+
return parameterString.ToString();
151+
}
152+
}
153+
}
154+
#endif

Assets/UniMasterLinker/Editor/UpdateGameMasterAPIClass.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.

Assets/UniMasterLinker/Scripts.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.

Assets/UniMasterLinker/Scripts/API.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.

0 commit comments

Comments
 (0)