XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

AshfallFrontier

【Unity】灰烬边境,一款生存策略游戏

公开
关注 0 Fork 0 Star 0
UTF-8
using System;
using System.IO;
using Ashfall.Core;
using UnityEditor;
using UnityEditor.Build.Reporting;
using UnityEditor.SceneManagement;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

namespace Ashfall.Editor
{
    public static class ProjectSetup
    {
        private const string ScenePath = "Assets/Ashfall/Scenes/Frontier.unity";
        [InitializeOnLoadMethod]
        private static void OnLoaded()
        {
            EditorApplication.delayCall += () =>
            {
                if (EditorApplication.isPlayingOrWillChangePlaymode || EditorApplication.isCompiling) return;
                if (!File.Exists(ScenePath)) Configure();
            };
        }
        [MenuItem("Ashfall/Configure project")]
        public static void Configure()
        {
            Directory.CreateDirectory("Assets/Ashfall/Settings"); Directory.CreateDirectory("Assets/Ashfall/Scenes");
            AssetDatabase.Refresh();
            var renderer = AssetDatabase.LoadAssetAtPath<Renderer2DData>("Assets/Ashfall/Settings/FrontierRenderer.asset");
            if (renderer == null)
            {
                renderer = ScriptableObject.CreateInstance<Renderer2DData>();
                AssetDatabase.CreateAsset(renderer, "Assets/Ashfall/Settings/FrontierRenderer.asset");
            }
            var pipeline = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>("Assets/Ashfall/Settings/FrontierPipeline.asset");
            if (pipeline == null)
            {
                pipeline = UniversalRenderPipelineAsset.Create(renderer);
                AssetDatabase.CreateAsset(pipeline, "Assets/Ashfall/Settings/FrontierPipeline.asset");
            }
            GraphicsSettings.defaultRenderPipeline = pipeline; QualitySettings.renderPipeline = pipeline;
            pipeline.msaaSampleCount = 1; pipeline.renderScale = 1;
            PlayerSettings.companyName = "XFEstudio"; PlayerSettings.productName = "Ashfall Frontier";
            PlayerSettings.bundleVersion = "0.1.0"; PlayerSettings.runInBackground = true;
            PlayerSettings.defaultScreenWidth = 1440; PlayerSettings.defaultScreenHeight = 900;
            PlayerSettings.fullScreenMode = FullScreenMode.Windowed;
            PlayerSettings.colorSpace = ColorSpace.Linear;
            var settings = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/ProjectSettings.asset")[0]);
            var input = settings.FindProperty("activeInputHandler"); if (input != null) input.intValue = 1;
            settings.ApplyModifiedPropertiesWithoutUndo();
            foreach (string path in new[] { "Assets/Ashfall/Resources/Art/ExpeditionAtlas.png", "Assets/Ashfall/Resources/Art/LifeformsAtlas.png" })
                if (AssetImporter.GetAtPath(path) is TextureImporter importer)
                {
                    importer.textureType = TextureImporterType.Default; importer.alphaIsTransparency = true;
                    importer.mipmapEnabled = false; importer.maxTextureSize = 2048; importer.filterMode = FilterMode.Bilinear;
                    importer.textureCompression = TextureImporterCompression.Uncompressed; importer.SaveAndReimport();
                }
            if (!File.Exists(ScenePath))
            {
                var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
                var camera = new GameObject("Main Camera"); camera.tag = "MainCamera";
                camera.AddComponent<Camera>().orthographic = true; camera.AddComponent<AudioListener>();
                camera.transform.position = new Vector3(0, 0, -20);
                EditorSceneManager.SaveScene(scene, ScenePath);
            }
            EditorBuildSettings.scenes = new[] { new EditorBuildSettingsScene(ScenePath, true) };
            AssetDatabase.SaveAssets();
            var catalog = ContentCatalog.CreateDefault(); catalog.Validate();
            var content = AssetDatabase.LoadAssetAtPath<Ashfall.Runtime.GameContentAsset>("Assets/Ashfall/Resources/ContentCatalog.asset");
            if (content == null)
            {
                content = ScriptableObject.CreateInstance<Ashfall.Runtime.GameContentAsset>(); content.catalog = catalog;
                AssetDatabase.CreateAsset(content, "Assets/Ashfall/Resources/ContentCatalog.asset");
            }
            AssetDatabase.SaveAssets();
            Directory.CreateDirectory("Docs"); File.WriteAllText("Docs/content-catalog.json", JsonUtility.ToJson(catalog, true));
            Debug.Log("ASHFALL_SETUP_OK: URP 2D, scene, sprites and catalog configured.");
        }
        [MenuItem("Ashfall/Build Windows prototype")]
        public static void BuildWindows()
        {
            Configure();
            Directory.CreateDirectory("Builds/Windows");
            var report = BuildPipeline.BuildPlayer(new BuildPlayerOptions
            {
                scenes = new[] { ScenePath }, locationPathName = "Builds/Windows/AshfallFrontier.exe",
                target = BuildTarget.StandaloneWindows64, options = BuildOptions.Development
            });
            if (report.summary.result != BuildResult.Succeeded) throw new InvalidOperationException("Windows build failed: " + report.summary.result);
            Debug.Log("ASHFALL_BUILD_OK: " + report.summary.totalSize + " bytes");
        }
    }
}