Цвет -- в _BaseColor (URP), раньше всё было белым. Настройка 3D-рендерера добавляет его в URP Asset каждого уровня качества (в проекте URP задан только в Quality) + отдельная команда меню. Карта мира: замок со стенами и башнями, города -- домики, лагеря -- шатры с костром, кристаллы точек, рощи. 3D-поселение: здания с двускатными крышами и приметами, ели и лиственные, песчаные берега, снег на скалах. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
120 lines
5.8 KiB
C#
120 lines
5.8 KiB
C#
using UnityEditor;
|
||
using UnityEditor.SceneManagement;
|
||
using UnityEngine;
|
||
using UnityEngine.Rendering;
|
||
using UnityEngine.Rendering.Universal;
|
||
using UnityEngine.SceneManagement;
|
||
|
||
// Создаёт сцену 3D-поселения (прототип, этап I ТЗ «Система строительства поселения» от 04.11.2026):
|
||
// Tools -> Bogatyri -> 3D-город: создать сцену City3D.
|
||
//
|
||
// Что делает:
|
||
// 1. Добавляет в настройки URP второй рендерер -- обычный 3D (Assets/Settings/Renderer3D.asset).
|
||
// Старые 2D-сцены продолжают рисоваться 2D-рендерером: он остаётся рендерером по умолчанию.
|
||
// 2. Создаёт Assets/Scenes/City3D.unity: камера (3D-рендерер, перспектива), солнце с тенями,
|
||
// объект City3D с City3DController -- всё остальное (земля, деревья, здания) он строит сам при запуске.
|
||
// 3. Добавляет сцену в Build Settings и открывает её. Дальше -- просто Play.
|
||
public static class City3DSetup
|
||
{
|
||
const string ScenePath = "Assets/Scenes/City3D.unity";
|
||
const string RendererPath = "Assets/Settings/Renderer3D.asset";
|
||
|
||
[MenuItem("Tools/Bogatyri/3D-город: создать сцену City3D")]
|
||
static void Create()
|
||
{
|
||
if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return;
|
||
|
||
int rendererIndex = EnsureRenderer3D();
|
||
|
||
var scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single);
|
||
|
||
var camGo = new GameObject("Main Camera") { tag = "MainCamera" };
|
||
var cam = camGo.AddComponent<Camera>();
|
||
cam.orthographic = false;
|
||
cam.fieldOfView = 40f;
|
||
cam.nearClipPlane = 0.3f;
|
||
cam.farClipPlane = 300f;
|
||
cam.clearFlags = CameraClearFlags.SolidColor;
|
||
cam.backgroundColor = new Color(0.55f, 0.72f, 0.9f);
|
||
camGo.AddComponent<AudioListener>();
|
||
var data = camGo.AddComponent<UniversalAdditionalCameraData>();
|
||
if (rendererIndex >= 0) data.SetRenderer(rendererIndex);
|
||
camGo.AddComponent<City3DCamera>();
|
||
|
||
var sunGo = new GameObject("Sun");
|
||
var sun = sunGo.AddComponent<Light>();
|
||
sun.type = LightType.Directional;
|
||
sun.intensity = 1.2f;
|
||
sun.shadows = LightShadows.Soft;
|
||
sunGo.transform.rotation = Quaternion.Euler(50f, -30f, 0f);
|
||
RenderSettings.ambientMode = AmbientMode.Flat;
|
||
RenderSettings.ambientLight = new Color(0.55f, 0.58f, 0.62f);
|
||
|
||
new GameObject("City3D").AddComponent<City3DController>();
|
||
|
||
EditorSceneManager.SaveScene(scene, ScenePath);
|
||
AddToBuildSettings();
|
||
Debug.Log($"[3D-ГОРОД] Сцена создана: {ScenePath}. 3D-рендерер: индекс {rendererIndex}. Нажмите Play.");
|
||
}
|
||
|
||
// Второй рендерер URP -- обычный (3D). Добавляется в URP Asset из Graphics Settings и из КАЖДОГО уровня качества
|
||
// (в этом проекте URP задан только в Quality). Возвращает индекс рендерера в списке (или -1)
|
||
[MenuItem("Tools/Bogatyri/3D: добавить 3D-рендерер в URP")]
|
||
static void AddRendererMenu()
|
||
{
|
||
int index = EnsureRenderer3D();
|
||
Debug.Log(index >= 0 ? $"[3D] 3D-рендерер подключён (индекс {index}). Можно запускать карту мира и City3D."
|
||
: "[3D] URP Asset не найден ни в Graphics, ни в Quality Settings.");
|
||
}
|
||
|
||
static int EnsureRenderer3D()
|
||
{
|
||
var pipelines = new System.Collections.Generic.List<UniversalRenderPipelineAsset>();
|
||
void Add(RenderPipelineAsset a) { if (a is UniversalRenderPipelineAsset u && !pipelines.Contains(u)) pipelines.Add(u); }
|
||
Add(GraphicsSettings.defaultRenderPipeline);
|
||
for (int q = 0; q < QualitySettings.names.Length; q++) Add(QualitySettings.GetRenderPipelineAssetAt(q));
|
||
if (pipelines.Count == 0)
|
||
{
|
||
Debug.LogWarning("[3D-ГОРОД] Нет URP Asset ни в Graphics, ни в Quality Settings -- камера будет рисовать рендерером по умолчанию");
|
||
return -1;
|
||
}
|
||
|
||
var renderer = AssetDatabase.LoadAssetAtPath<UniversalRendererData>(RendererPath);
|
||
if (renderer == null)
|
||
{
|
||
renderer = ScriptableObject.CreateInstance<UniversalRendererData>();
|
||
AssetDatabase.CreateAsset(renderer, RendererPath);
|
||
AssetDatabase.SaveAssets();
|
||
}
|
||
|
||
int result = -1;
|
||
foreach (var pipeline in pipelines)
|
||
{
|
||
var so = new SerializedObject(pipeline);
|
||
var list = so.FindProperty("m_RendererDataList");
|
||
int found = -1;
|
||
for (int i = 0; i < list.arraySize; i++)
|
||
if (list.GetArrayElementAtIndex(i).objectReferenceValue == renderer) found = i;
|
||
if (found < 0)
|
||
{
|
||
list.arraySize++;
|
||
list.GetArrayElementAtIndex(list.arraySize - 1).objectReferenceValue = renderer;
|
||
so.ApplyModifiedProperties();
|
||
EditorUtility.SetDirty(pipeline);
|
||
found = list.arraySize - 1;
|
||
}
|
||
if (result < 0) result = found;
|
||
}
|
||
AssetDatabase.SaveAssets();
|
||
return result;
|
||
}
|
||
|
||
static void AddToBuildSettings()
|
||
{
|
||
var scenes = new System.Collections.Generic.List<EditorBuildSettingsScene>(EditorBuildSettings.scenes);
|
||
foreach (var s in scenes) if (s.path == ScenePath) return;
|
||
scenes.Add(new EditorBuildSettingsScene(ScenePath, true));
|
||
EditorBuildSettings.scenes = scenes.ToArray();
|
||
}
|
||
}
|