работаю над светом

This commit is contained in:
vladislove 2026-07-09 15:12:40 +03:00
parent 448a69ceb1
commit fc12b3bab2
18 changed files with 2370 additions and 678 deletions

View File

@ -25,19 +25,16 @@ Material:
m_Parent: {fileID: 0} m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0 m_ModifiedSerializedProperties: 0
m_ValidKeywords: m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON - _SPECULAR_SETUP
- _SURFACE_TYPE_TRANSPARENT
m_InvalidKeywords: [] m_InvalidKeywords: []
m_LightmapFlags: 4 m_LightmapFlags: 4
m_EnableInstancingVariants: 1 m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0 m_DoubleSidedGI: 0
m_CustomRenderQueue: 3000 m_CustomRenderQueue: 2000
stringTagMap: stringTagMap:
RenderType: Transparent RenderType: Opaque
disabledShaderPasses: disabledShaderPasses:
- MOTIONVECTORS - MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties: m_LockedProperties:
m_SavedProperties: m_SavedProperties:
serializedVersion: 3 serializedVersion: 3
@ -112,30 +109,30 @@ Material:
- _Cutoff: 0.5 - _Cutoff: 0.5
- _DetailAlbedoMapScale: 1 - _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1 - _DetailNormalMapScale: 1
- _DstBlend: 10 - _DstBlend: 0
- _DstBlendAlpha: 10 - _DstBlendAlpha: 0
- _EnvironmentReflections: 1 - _EnvironmentReflections: 1
- _GlossMapScale: 0 - _GlossMapScale: 0
- _Glossiness: 0 - _Glossiness: 0
- _GlossyReflections: 0 - _GlossyReflections: 0
- _Metallic: 0.042 - _Metallic: 0
- _OcclusionStrength: 1 - _OcclusionStrength: 1
- _Parallax: 0.005 - _Parallax: 0.005
- _QueueOffset: 0 - _QueueOffset: 0
- _ReceiveShadows: 1 - _ReceiveShadows: 1
- _Smoothness: 0.7 - _Smoothness: 0.17
- _SmoothnessTextureChannel: 0 - _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1 - _SpecularHighlights: 1
- _SrcBlend: 1 - _SrcBlend: 1
- _SrcBlendAlpha: 1 - _SrcBlendAlpha: 1
- _Surface: 1 - _Surface: 0
- _WorkflowMode: 1 - _WorkflowMode: 0
- _XRMotionVectorsPass: 1 - _XRMotionVectorsPass: 1
- _ZWrite: 0 - _ZWrite: 1
m_Colors: m_Colors:
- _BaseColor: {r: 0.9433962, g: 0.8992202, b: 0.6897472, a: 1} - _BaseColor: {r: 0.9433962, g: 0.8992202, b: 0.68974715, a: 1}
- _Color: {r: 0.9433962, g: 0.8992202, b: 0.68974715, a: 1} - _Color: {r: 0.9433962, g: 0.8992202, b: 0.68974715, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _EmissionColor: {r: 0.103773594, g: 0.0430582, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: [] m_BuildTextureStacks: []
m_AllowLocking: 1 m_AllowLocking: 1

View File

@ -235,8 +235,8 @@ BoxCollider:
m_ProvidesContacts: 0 m_ProvidesContacts: 0
m_Enabled: 1 m_Enabled: 1
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 2, y: 0.69, z: 1.15} m_Size: {x: 2.06, y: 0.69, z: 1.15}
m_Center: {x: -0.15, y: 0.34, z: -0.165} m_Center: {x: -0.14, y: 0.34, z: -0.165}
--- !u!54 &592039360660023171 --- !u!54 &592039360660023171
Rigidbody: Rigidbody:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -29,7 +29,7 @@ LightingSettings:
m_XAtlasBlockAlign: 0 m_XAtlasBlockAlign: 0
m_XAtlasRepackUnderutilizedLightmaps: 1 m_XAtlasRepackUnderutilizedLightmaps: 1
m_AO: 1 m_AO: 1
m_AOMaxDistance: 5.63 m_AOMaxDistance: 0.14
m_CompAOExponent: 1 m_CompAOExponent: 1
m_CompAOExponentDirect: 0 m_CompAOExponentDirect: 0
m_ExtractAO: 0 m_ExtractAO: 0

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -1,143 +0,0 @@
fileFormatVersion: 2
guid: 2bf45dbf7e493494ab3af6ae34e05f96
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 1
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 3
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 11
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

View File

@ -1,143 +0,0 @@
fileFormatVersion: 2
guid: 58bf83d1060f2a847b525ef9ee9f9c6b
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 1
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 3
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 11
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 2
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@ -9,14 +9,15 @@ public class FurnitureController : MonoBehaviour
public GameObject currentPrefab; public GameObject currentPrefab;
public LayerMask floorLayer; public LayerMask floorLayer;
public LayerMask wallLayer; public LayerMask wallLayer;
[Tooltip("Слой мебели (чтобы кликать по уже стоящим объектам)")]
public LayerMask furnitureLayer; // НОВАЯ ПЕРЕМЕННАЯ
[SerializeField] private GameObject shopPanel; [SerializeField] private GameObject shopPanel;
[Header("Режим редактирования (UI)")] [Header("Режим редактирования (UI)")]
[SerializeField] private GameObject editPanel; [SerializeField] private GameObject editPanel;
[SerializeField] private GameObject rotate90Button;
[Tooltip("Кнопка поворота на 90 градусов")]
[SerializeField] private GameObject rotate90Button; // НОВАЯ ССЫЛКА НА КНОПКУ
public float rotationSpeed = 5f; public float rotationSpeed = 5f;
[Header("Связь с камерой")] [Header("Связь с камерой")]
@ -41,17 +42,17 @@ public class FurnitureController : MonoBehaviour
currentPrefab = null; currentPrefab = null;
editPanel.SetActive(false); editPanel.SetActive(false);
// Прячем кнопку поворота при старте (т.к. начальный инструмент - Move)
if (rotate90Button != null) rotate90Button.SetActive(false); if (rotate90Button != null) rotate90Button.SetActive(false);
} }
void Update() void Update()
{ {
// 1. Если мы УЖЕ редактируем объект
if (_activeFurniture != null) if (_activeFurniture != null)
{ {
HandleEditing(); HandleEditing();
} }
// 2. Если мы выбрали НОВУЮ мебель в магазине и хотим её поставить
else if (currentPrefab != null) else if (currentPrefab != null)
{ {
if (Input.GetMouseButtonDown(0) && !shopPanel.activeSelf && !IsPointerOverUI()) if (Input.GetMouseButtonDown(0) && !shopPanel.activeSelf && !IsPointerOverUI())
@ -59,6 +60,14 @@ public class FurnitureController : MonoBehaviour
TryPlaceFurniture(); TryPlaceFurniture();
} }
} }
// 3. НОВОЕ: Если ничего не выбрано, пытаемся кликнуть по УЖЕ СТОЯЩЕЙ мебели
else
{
if (Input.GetMouseButtonDown(0) && !shopPanel.activeSelf && !IsPointerOverUI())
{
TrySelectPlacedFurniture();
}
}
} }
private void HandleEditing() private void HandleEditing()
@ -170,6 +179,37 @@ public class FurnitureController : MonoBehaviour
} }
} }
// === НОВЫЙ МЕТОД: Выделение уже стоящей мебели ===
private void TrySelectPlacedFurniture()
{
Ray ray = _cam.ScreenPointToRay(Input.mousePosition);
// Пускаем луч, который ищет ТОЛЬКО объекты на слое FurnitureLayer
if (Physics.Raycast(ray, out RaycastHit hit, 100f, furnitureLayer))
{
// Ищем скрипт FurnitureObject на объекте (или его родителях)
FurnitureObject furnScript = hit.collider.GetComponentInParent<FurnitureObject>();
if (furnScript != null)
{
_activeFurniture = furnScript.gameObject;
_activeFurnitureScript = furnScript;
// Включаем зеленую подсветку
_activeFurnitureScript.SetEditMode(true);
// Сбрасываем инструмент на Move
_currentTool = EditTool.Move;
if (rotate90Button != null) rotate90Button.SetActive(false);
_isInteracting = false;
LockCamera(false);
// Моментально показываем меню над мебелью
UpdateUIPosition();
}
}
}
private void StartInteraction() private void StartInteraction()
{ {
_isInteracting = true; _isInteracting = true;
@ -197,15 +237,12 @@ public class FurnitureController : MonoBehaviour
float targetX = screenPos.x; float targetX = screenPos.x;
float targetY = screenPos.y + yOffset; float targetY = screenPos.y + yOffset;
// МАГИЯ: Ограничиваем выход меню за пределы экрана
RectTransform rect = editPanel.GetComponent<RectTransform>(); RectTransform rect = editPanel.GetComponent<RectTransform>();
if (rect != null) if (rect != null)
{ {
// Узнаем размер панели (с учетом скейла Canvas)
float paddingX = (rect.rect.width / 2f) * editPanel.transform.lossyScale.x; float paddingX = (rect.rect.width / 2f) * editPanel.transform.lossyScale.x;
float paddingY = (rect.rect.height / 2f) * editPanel.transform.lossyScale.y; float paddingY = (rect.rect.height / 2f) * editPanel.transform.lossyScale.y;
// Запрещаем выходить за края
targetX = Mathf.Clamp(targetX, paddingX, Screen.width - paddingX); targetX = Mathf.Clamp(targetX, paddingX, Screen.width - paddingX);
targetY = Mathf.Clamp(targetY, paddingY, Screen.height - paddingY); targetY = Mathf.Clamp(targetY, paddingY, Screen.height - paddingY);
} }
@ -228,7 +265,6 @@ public class FurnitureController : MonoBehaviour
_activeFurnitureScript.SetEditMode(true); _activeFurnitureScript.SetEditMode(true);
// Сбрасываем инструмент на Move по умолчанию и прячем кнопку Rotate90
_currentTool = EditTool.Move; _currentTool = EditTool.Move;
if (rotate90Button != null) rotate90Button.SetActive(false); if (rotate90Button != null) rotate90Button.SetActive(false);
@ -240,34 +276,27 @@ public class FurnitureController : MonoBehaviour
} }
} }
// === НОВЫЙ МЕТОД: Поворот строго на 90 градусов ===
public void Rotate90Degrees() public void Rotate90Degrees()
{ {
if (_activeFurniture != null) if (_activeFurniture != null)
{ {
// Берем текущий угол
float currentY = _activeFurniture.transform.eulerAngles.y; float currentY = _activeFurniture.transform.eulerAngles.y;
// Округляем до ближайшего числа, кратного 90 (чтобы сбросить кривой угол)
float snappedY = Mathf.Round(currentY / 90f) * 90f; float snappedY = Mathf.Round(currentY / 90f) * 90f;
// Добавляем 90
_activeFurniture.transform.rotation = Quaternion.Euler(0, snappedY + 90f, 0); _activeFurniture.transform.rotation = Quaternion.Euler(0, snappedY + 90f, 0);
} }
} }
// === ОБНОВЛЕННЫЕ МЕТОДЫ ВЫБОРА ===
public void SelectMoveTool() public void SelectMoveTool()
{ {
_currentTool = EditTool.Move; _currentTool = EditTool.Move;
if (rotate90Button != null) rotate90Button.SetActive(false); // Прячем кнопку поворота if (rotate90Button != null) rotate90Button.SetActive(false);
LockCamera(false); LockCamera(false);
} }
public void SelectRotateTool() public void SelectRotateTool()
{ {
_currentTool = EditTool.Rotate; _currentTool = EditTool.Rotate;
if (rotate90Button != null) rotate90Button.SetActive(true); // Показываем кнопку поворота if (rotate90Button != null) rotate90Button.SetActive(true);
LockCamera(true); LockCamera(true);
} }

View File

@ -24,44 +24,27 @@ public class RoomVisibilityController : MonoBehaviour
[Range(-0.5f, 0.5f)] [Range(-0.5f, 0.5f)]
public float hideThreshold = 0.1f; public float hideThreshold = 0.1f;
[Header("Настройки плавности (НОВОЕ)")]
public float fadeSpeed = 3f; // Скорость исчезновения (чем больше, тем быстрее)
private Camera _mainCamera; private Camera _mainCamera;
private Dictionary<GameObject, bool> _wallHiddenStates = new Dictionary<GameObject, bool>(); private Dictionary<GameObject, bool> _wallHiddenStates = new Dictionary<GameObject, bool>();
// Новые словари для контроля плавного исчезновения // Кэшируем Renderer'ы для оптимизации (чтобы не делать GetComponent каждый кадр)
private Dictionary<GameObject, float> _targetAlphas = new Dictionary<GameObject, float>();
private Dictionary<GameObject, List<Material>> _objectMaterials = new Dictionary<GameObject, List<Material>>();
private Dictionary<GameObject, Renderer[]> _objectRenderers = new Dictionary<GameObject, Renderer[]>(); private Dictionary<GameObject, Renderer[]> _objectRenderers = new Dictionary<GameObject, Renderer[]>();
void Start() void Start()
{ {
_mainCamera = Camera.main; _mainCamera = Camera.main;
// При старте игры находим и запоминаем все материалы стен и столбиков // При старте игры находим и запоминаем все Renderer'ы
foreach (var wall in walls) { InitializeFadingData(wall); } foreach (var wall in walls) { CacheRenderers(wall); }
foreach (var pillar in pillars) { InitializeFadingData(pillar.pillarObject); } foreach (var pillar in pillars) { CacheRenderers(pillar.pillarObject); }
} }
// Метод для кэширования материалов (чтобы не искать их каждый кадр) private void CacheRenderers(GameObject obj)
private void InitializeFadingData(GameObject obj)
{ {
if (obj == null || _objectMaterials.ContainsKey(obj)) return; if (obj != null && !_objectRenderers.ContainsKey(obj))
Renderer[] renderers = obj.GetComponentsInChildren<Renderer>();
List<Material> mats = new List<Material>();
foreach (Renderer r in renderers)
{ {
// Обращение к .materials создает уникальную копию материала для объекта. _objectRenderers[obj] = obj.GetComponentsInChildren<Renderer>();
// Это нужно, чтобы стены исчезали по отдельности, а не все разом.
mats.AddRange(r.materials);
} }
_objectRenderers[obj] = renderers;
_objectMaterials[obj] = mats;
_targetAlphas[obj] = 1f; // 1f - это 100% непрозрачности (видимый)
} }
void LateUpdate() void LateUpdate()
@ -82,8 +65,8 @@ public class RoomVisibilityController : MonoBehaviour
bool isHidden = Vector3.Dot(dirToCamera.normalized, dirToWall.normalized) > hideThreshold; bool isHidden = Vector3.Dot(dirToCamera.normalized, dirToWall.normalized) > hideThreshold;
// Вместо мгновенного выключения, задаем ЦЕЛЕВУЮ прозрачность (0 - скрыть, 1 - показать) // Включаем или выключаем графику стены моментально
_targetAlphas[wall] = isHidden ? 0f : 1f; SetVisibility(wall, !isHidden);
_wallHiddenStates[wall] = isHidden; _wallHiddenStates[wall] = isHidden;
Debug.DrawLine(roomCenter.position, targetPos, isHidden ? Color.red : Color.green); Debug.DrawLine(roomCenter.position, targetPos, isHidden ? Color.red : Color.green);
@ -98,57 +81,24 @@ public class RoomVisibilityController : MonoBehaviour
bool isWall1Hidden = _wallHiddenStates.ContainsKey(pillar.connectedWall1) && _wallHiddenStates[pillar.connectedWall1]; bool isWall1Hidden = _wallHiddenStates.ContainsKey(pillar.connectedWall1) && _wallHiddenStates[pillar.connectedWall1];
bool isWall2Hidden = _wallHiddenStates.ContainsKey(pillar.connectedWall2) && _wallHiddenStates[pillar.connectedWall2]; bool isWall2Hidden = _wallHiddenStates.ContainsKey(pillar.connectedWall2) && _wallHiddenStates[pillar.connectedWall2];
// Прячем столбик только если ОБЕ подключенные стены спрятаны
bool shouldHidePillar = isWall1Hidden && isWall2Hidden; bool shouldHidePillar = isWall1Hidden && isWall2Hidden;
// Задаем целевую прозрачность для столбика SetVisibility(pillar.pillarObject, !shouldHidePillar);
_targetAlphas[pillar.pillarObject] = shouldHidePillar ? 0f : 1f; }
} }
// 3. Вызываем функцию плавного изменения прозрачности // Метод для быстрого включения/выключения отрисовки объекта
UpdateFading(); private void SetVisibility(GameObject obj, bool isVisible)
}
// Метод, который плавно меняет Альфа-канал каждый кадр
private void UpdateFading()
{ {
foreach (var kvp in _objectMaterials) if (obj == null || !_objectRenderers.ContainsKey(obj)) return;
{
GameObject obj = kvp.Key;
float targetAlpha = _targetAlphas[obj];
List<Material> mats = kvp.Value;
if (mats.Count == 0) continue;
// Берем текущую прозрачность из первого материала
float currentAlpha = mats[0].color.a;
// Если текущая прозрачность не равна целевой (надо менять)
if (!Mathf.Approximately(currentAlpha, targetAlpha))
{
// Плавно меняем значение от текущего к целевому
float newAlpha = Mathf.MoveTowards(currentAlpha, targetAlpha, fadeSpeed * Time.deltaTime);
// Применяем новую прозрачность ко всем материалам объекта
foreach (Material mat in mats)
{
Color c = mat.color;
c.a = newAlpha;
mat.color = c;
}
// ОПТИМИЗАЦИЯ:
// Включаем Renderer, если прозрачность больше 0.
// Выключаем Renderer полностью, только когда он на 100% прозрачен.
Renderer[] renderers = _objectRenderers[obj]; Renderer[] renderers = _objectRenderers[obj];
bool shouldRender = newAlpha > 0f;
foreach (Renderer r in renderers) foreach (Renderer r in renderers)
{ {
if (r.enabled != shouldRender) if (r.enabled != isVisible)
{ {
r.enabled = shouldRender; r.enabled = isVisible;
}
}
} }
} }
} }

View File

@ -25,7 +25,7 @@ MonoBehaviour:
m_SupportsTerrainHoles: 1 m_SupportsTerrainHoles: 1
m_SupportsHDR: 1 m_SupportsHDR: 1
m_HDRColorBufferPrecision: 0 m_HDRColorBufferPrecision: 0
m_MSAA: 1 m_MSAA: 4
m_RenderScale: 1 m_RenderScale: 1
m_UpscalingFilter: 0 m_UpscalingFilter: 0
m_FsrOverrideSharpness: 0 m_FsrOverrideSharpness: 0
@ -43,18 +43,18 @@ MonoBehaviour:
m_ProbeVolumeSHBands: 1 m_ProbeVolumeSHBands: 1
m_MainLightRenderingMode: 1 m_MainLightRenderingMode: 1
m_MainLightShadowsSupported: 1 m_MainLightShadowsSupported: 1
m_MainLightShadowmapResolution: 2048 m_MainLightShadowmapResolution: 4096
m_AdditionalLightsRenderingMode: 1 m_AdditionalLightsRenderingMode: 1
m_AdditionalLightsPerObjectLimit: 4 m_AdditionalLightsPerObjectLimit: 4
m_AdditionalLightShadowsSupported: 1 m_AdditionalLightShadowsSupported: 1
m_AdditionalLightsShadowmapResolution: 2048 m_AdditionalLightsShadowmapResolution: 4096
m_AdditionalLightsShadowResolutionTierLow: 256 m_AdditionalLightsShadowResolutionTierLow: 256
m_AdditionalLightsShadowResolutionTierMedium: 512 m_AdditionalLightsShadowResolutionTierMedium: 512
m_AdditionalLightsShadowResolutionTierHigh: 1024 m_AdditionalLightsShadowResolutionTierHigh: 1024
m_ReflectionProbeBlending: 1 m_ReflectionProbeBlending: 1
m_ReflectionProbeBoxProjection: 1 m_ReflectionProbeBoxProjection: 1
m_ReflectionProbeAtlas: 1 m_ReflectionProbeAtlas: 1
m_ShadowDistance: 50 m_ShadowDistance: 40
m_ShadowCascadeCount: 4 m_ShadowCascadeCount: 4
m_Cascade2Split: 0.25 m_Cascade2Split: 0.25
m_Cascade3Split: {x: 0.1, y: 0.3} m_Cascade3Split: {x: 0.1, y: 0.3}
@ -77,7 +77,7 @@ MonoBehaviour:
m_DebugLevel: 0 m_DebugLevel: 0
m_StoreActionsOptimization: 0 m_StoreActionsOptimization: 0
m_UseAdaptivePerformance: 1 m_UseAdaptivePerformance: 1
m_ColorGradingMode: 0 m_ColorGradingMode: 1
m_ColorGradingLutSize: 32 m_ColorGradingLutSize: 32
m_AllowPostProcessAlphaOutput: 0 m_AllowPostProcessAlphaOutput: 0
m_UseFastSRGBLinearConversion: 0 m_UseFastSRGBLinearConversion: 0

View File

@ -6,7 +6,7 @@ QualitySettings:
serializedVersion: 5 serializedVersion: 5
m_CurrentQuality: 1 m_CurrentQuality: 1
m_QualitySettings: m_QualitySettings:
- serializedVersion: 4 - serializedVersion: 5
name: Mobile name: Mobile
pixelLightCount: 2 pixelLightCount: 2
shadows: 2 shadows: 2
@ -34,6 +34,7 @@ QualitySettings:
adaptiveVsyncExtraA: 0 adaptiveVsyncExtraA: 0
adaptiveVsyncExtraB: 0 adaptiveVsyncExtraB: 0
lodBias: 1 lodBias: 1
meshLodThreshold: 1
maximumLODLevel: 0 maximumLODLevel: 0
enableLODCrossFade: 1 enableLODCrossFade: 1
streamingMipmapsActive: 0 streamingMipmapsActive: 0
@ -47,8 +48,7 @@ QualitySettings:
asyncUploadBufferSize: 16 asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1 asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1 resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, type: 2}
type: 2}
terrainQualityOverrides: 0 terrainQualityOverrides: 0
terrainPixelError: 1 terrainPixelError: 1
terrainDetailDensityScale: 1 terrainDetailDensityScale: 1
@ -58,9 +58,8 @@ QualitySettings:
terrainBillboardStart: 50 terrainBillboardStart: 50
terrainFadeLength: 5 terrainFadeLength: 5
terrainMaxTrees: 50 terrainMaxTrees: 50
excludedTargetPlatforms: excludedTargetPlatforms: []
- Standalone - serializedVersion: 5
- serializedVersion: 4
name: PC name: PC
pixelLightCount: 2 pixelLightCount: 2
shadows: 2 shadows: 2
@ -76,7 +75,7 @@ QualitySettings:
globalTextureMipmapLimit: 0 globalTextureMipmapLimit: 0
textureMipmapLimitSettings: [] textureMipmapLimitSettings: []
anisotropicTextures: 2 anisotropicTextures: 2
antiAliasing: 0 antiAliasing: 4
softParticles: 0 softParticles: 0
softVegetation: 1 softVegetation: 1
realtimeReflectionProbes: 0 realtimeReflectionProbes: 0
@ -88,6 +87,7 @@ QualitySettings:
adaptiveVsyncExtraA: 0 adaptiveVsyncExtraA: 0
adaptiveVsyncExtraB: 0 adaptiveVsyncExtraB: 0
lodBias: 2 lodBias: 2
meshLodThreshold: 1
maximumLODLevel: 0 maximumLODLevel: 0
enableLODCrossFade: 1 enableLODCrossFade: 1
streamingMipmapsActive: 0 streamingMipmapsActive: 0
@ -101,8 +101,7 @@ QualitySettings:
asyncUploadBufferSize: 16 asyncUploadBufferSize: 16
asyncUploadPersistentBuffer: 1 asyncUploadPersistentBuffer: 1
resolutionScalingFixedDPIFactor: 1 resolutionScalingFixedDPIFactor: 1
customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2}
type: 2}
terrainQualityOverrides: 0 terrainQualityOverrides: 0
terrainPixelError: 1 terrainPixelError: 1
terrainDetailDensityScale: 1 terrainDetailDensityScale: 1
@ -113,7 +112,6 @@ QualitySettings:
terrainFadeLength: 5 terrainFadeLength: 5
terrainMaxTrees: 50 terrainMaxTrees: 50
excludedTargetPlatforms: excludedTargetPlatforms:
- Android
- iPhone - iPhone
m_TextureMipmapLimitGroupNames: [] m_TextureMipmapLimitGroupNames: []
m_PerPlatformDefaultQuality: m_PerPlatformDefaultQuality:
@ -122,6 +120,7 @@ QualitySettings:
GameCoreXboxOne: 1 GameCoreXboxOne: 1
Lumin: 0 Lumin: 0
Nintendo Switch: 1 Nintendo Switch: 1
Nintendo Switch 2: 1
PS4: 1 PS4: 1
PS5: 1 PS5: 1
Server: 0 Server: 0