using System; using System.IO; using System.Text; using UnityEditor; using UnityEngine; namespace ServiceSim.EditorTools { /// /// 地図の上で道を引く確かめ(依頼 v9 の 7 章 A)。 /// /// 店も人も建てず、回さない。サイトの JSON と地図だけで、 /// 受け渡し口から全卓へ道を引いて、サイトの routes と突き合わせる。 /// 中身は ServiceSim.MapPlanCheck(Unity の外からも同じものを呼べる)。 /// public static class ServiceSimMapPlanner { const string P1Path = "Assets/ServiceSim/Store/StoreLayout_p1_efficient_corner.asset"; const string P5Path = "Assets/ServiceSim/Store/StoreLayout_p5_crammed.asset"; [MenuItem("ServiceSim/Map Planner/③⑦ 確かめ A(地図で道を引く・回さない)", false, 34)] public static void CheckBoth() { StringBuilder sb = new StringBuilder(); sb.AppendLine("# 確かめ A:人のいない店で、受け渡し口から全卓へ道を引く(依頼 v9 の 7 章 A)"); sb.AppendLine("作った日時: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); sb.AppendLine("店も人も建てていない(JSON と地図だけで引いた)"); sb.AppendLine(); RobotSpec spec = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.RobotSpecPath); if (spec == null) sb.AppendLine("※ RobotSpec が見つからないので、道の引き方は既定の値で引きました"); bool ok = true; ok &= One(sb, P1Path, "③ 効率重視型・入口が左下の角", spec); sb.AppendLine(); ok &= One(sb, P5Path, "⑦ ぎっしり型", spec); sb.AppendLine(); sb.AppendLine(ok ? "→ ③⑦ ともに確かめ A は通った" : "→ 通っていないものがある(上の × を見てください)"); ExperimentPlan plan = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.ExperimentPlanPath); string outDir = plan != null ? plan.screenshotDir : null; if (!string.IsNullOrEmpty(outDir)) { try { Directory.CreateDirectory(outDir); string txt = Path.Combine(outDir, DateTime.Now.ToString("yyyyMMdd_HHmm") + "_map_planner_checkA.txt"); File.WriteAllText(txt, sb.ToString(), new UTF8Encoding(false)); sb.AppendLine("書き出し: " + txt); } catch (Exception e) { sb.AppendLine("書き出せません: " + e.Message); } } if (ok) Debug.Log("[ServiceSim] " + sb.ToString()); else Debug.LogError("[ServiceSim] " + sb.ToString()); } static bool One(StringBuilder sb, string assetPath, string label, RobotSpec spec) { JsonStoreLayout layout = AssetDatabase.LoadAssetAtPath(assetPath); if (layout == null) { sb.AppendLine("## " + label + "\n 店の形が見つかりません: " + assetPath); return false; } if (layout.layoutJson == null || layout.mapJson == null) { sb.AppendLine("## " + label + "(" + layout.layoutFileName + ")"); sb.AppendLine(" " + (layout.layoutJson == null ? "layoutJson" : "mapJson") + " が入っていません(依頼 v9 の 0 章を確かめてください)"); return false; } MapPlanCheck.Result res = MapPlanCheck.Run( label + "(" + layout.layoutFileName + ")", layout.layoutJson.text, layout.mapJson.text, spec); sb.AppendLine(res.report); ExperimentPlan plan = AssetDatabase.LoadAssetAtPath(ServiceSimSetup.ExperimentPlanPath); string outDir = plan != null ? plan.screenshotDir : null; if (!string.IsNullOrEmpty(outDir) && res.rows.Count > 0) { try { Directory.CreateDirectory(outDir); string csv = Path.Combine(outDir, DateTime.Now.ToString("yyyyMMdd_HHmm") + "_map_plan_" + layout.layoutFileName + ".csv"); File.WriteAllText(csv, res.Csv(), new UTF8Encoding(false)); sb.AppendLine(" CSV: " + csv); } catch (Exception e) { sb.AppendLine(" CSV を書けません: " + e.Message); } } return res.ok; } } }