using System.IO; using System.Linq; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; namespace BinxForge.CoinRoom.Editor { public static class CreateCoinRoom { private const string Root = "Assets/ForgeStarter/"; [MenuItem("Forge/Create Coin Room Scene")] public static void Create() { const string scenePath = Root + "Scenes/CoinRoom.unity"; if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return; if (File.Exists(scenePath) && !EditorUtility.DisplayDialog("Replace tutorial scene?", "This replaces only Assets/ForgeStarter/Scenes/CoinRoom.unity. Keep a copy of your changes first.", "Replace", "Cancel")) return; if (!File.Exists(Root + "Art/forge-sprites.png")) { Debug.LogError("Copy the complete ForgeStarter folder, including Art."); return; } Directory.CreateDirectory(Root + "Generated"); Directory.CreateDirectory(Root + "Scenes"); var texture = new Texture2D(2, 2); texture.SetPixels(new[] { Color.white, Color.white, Color.white, Color.white }); texture.Apply(); File.WriteAllBytes(Root + "Generated/White.png", texture.EncodeToPNG()); Object.DestroyImmediate(texture); AssetDatabase.Refresh(); ConfigureTexture(Root + "Generated/White.png", 2); ConfigureTexture(Root + "Art/forge-sprites.png", 32); var square = AssetDatabase.LoadAssetAtPath(Root + "Generated/White.png"); var sheet = AssetDatabase.LoadAssetAtPath(Root + "Art/forge-sprites.png"); if (square == null || sheet == null) { Debug.LogError("Texture import failed; inspect Console before continuing."); return; } var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); var camera = new GameObject("Main Camera").AddComponent(); camera.tag = "MainCamera"; camera.transform.position = new Vector3(0, 0, -10); camera.orthographic = true; camera.orthographicSize = 5; camera.clearFlags = CameraClearFlags.SolidColor; camera.backgroundColor = new Color(0.04f, 0.06f, 0.12f); var room = new GameObject("Coin Room").AddComponent(); room.worldCamera = camera; var player = Shape("Player", square, room.spawn, new Vector2(0.8f, 0.8f), Color.cyan); var playerBody = player.AddComponent(); playerBody.gravityScale = 0; playerBody.freezeRotation = true; playerBody.collisionDetectionMode = CollisionDetectionMode2D.Continuous; playerBody.interpolation = RigidbodyInterpolation2D.Interpolate; player.AddComponent(); room.player = playerBody; var idle = player.AddComponent(); idle.sheet = sheet; idle.room = room; Wall("North", new Vector2(0, 4), new Vector2(14, 0.5f), square); Wall("South", new Vector2(0, -4), new Vector2(14, 0.5f), square); Wall("West", new Vector2(-7, 0), new Vector2(0.5f, 8), square); Wall("East", new Vector2(7, 0), new Vector2(0.5f, 8), square); Wall("Divider", new Vector2(0, 1), new Vector2(0.5f, 3), square); Vector2[] positions = { new Vector2(-5, 3), new Vector2(5, 3), new Vector2(5, -3) }; room.coins = new Pickup[positions.Length]; for (int i = 0; i < positions.Length; i++) { var obj = Shape("Coin " + i, square, positions[i], new Vector2(0.45f, 0.45f), Color.yellow); obj.AddComponent().isTrigger = true; var coin = obj.AddComponent(); coin.room = room; coin.coinId = i; room.coins[i] = coin; } var enemy = Shape("Red Patrol", square, new Vector2(-1, -2), new Vector2(0.8f, 0.8f), Color.red); var enemyBody = enemy.AddComponent(); enemyBody.bodyType = RigidbodyType2D.Kinematic; enemyBody.useFullKinematicContacts = true; enemy.AddComponent().isTrigger = true; room.patrol = enemy.AddComponent(); room.patrol.room = room; EditorSceneManager.SaveScene(scene, scenePath); var scenes = EditorBuildSettings.scenes.Where(s => s.path != scenePath).ToList(); scenes.Add(new EditorBuildSettingsScene(scenePath, true)); EditorBuildSettings.scenes = scenes.ToArray(); Selection.activeGameObject = room.gameObject; Debug.Log("Coin Room source scene created. Editor/Play Mode/build acceptance must be checked on this machine."); } private static void ConfigureTexture(string path, float pixelsPerUnit) { var importer = (TextureImporter)AssetImporter.GetAtPath(path); importer.textureType = TextureImporterType.Sprite; importer.spriteImportMode = SpriteImportMode.Single; importer.spritePixelsPerUnit = pixelsPerUnit; importer.filterMode = FilterMode.Point; importer.textureCompression = TextureImporterCompression.Uncompressed; importer.isReadable = true; importer.mipmapEnabled = false; importer.SaveAndReimport(); } private static GameObject Shape(string name, Sprite sprite, Vector2 position, Vector2 size, Color color) { var obj = new GameObject(name); obj.transform.position = position; obj.transform.localScale = new Vector3(size.x, size.y, 1); var renderer = obj.AddComponent(); renderer.sprite = sprite; renderer.color = color; return obj; } private static void Wall(string name, Vector2 position, Vector2 size, Sprite square) { Shape(name, square, position, size, new Color(0.3f, 0.35f, 0.5f)).AddComponent(); } } }