работаю над светом
This commit is contained in:
parent
448a69ceb1
commit
fc12b3bab2
@ -25,19 +25,16 @@ Material:
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords:
|
||||
- _ALPHAPREMULTIPLY_ON
|
||||
- _SURFACE_TYPE_TRANSPARENT
|
||||
- _SPECULAR_SETUP
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 1
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3000
|
||||
m_CustomRenderQueue: 2000
|
||||
stringTagMap:
|
||||
RenderType: Transparent
|
||||
RenderType: Opaque
|
||||
disabledShaderPasses:
|
||||
- MOTIONVECTORS
|
||||
- DepthOnly
|
||||
- SHADOWCASTER
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
@ -112,30 +109,30 @@ Material:
|
||||
- _Cutoff: 0.5
|
||||
- _DetailAlbedoMapScale: 1
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 10
|
||||
- _DstBlendAlpha: 10
|
||||
- _DstBlend: 0
|
||||
- _DstBlendAlpha: 0
|
||||
- _EnvironmentReflections: 1
|
||||
- _GlossMapScale: 0
|
||||
- _Glossiness: 0
|
||||
- _GlossyReflections: 0
|
||||
- _Metallic: 0.042
|
||||
- _Metallic: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.005
|
||||
- _QueueOffset: 0
|
||||
- _ReceiveShadows: 1
|
||||
- _Smoothness: 0.7
|
||||
- _Smoothness: 0.17
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _SrcBlendAlpha: 1
|
||||
- _Surface: 1
|
||||
- _WorkflowMode: 1
|
||||
- _Surface: 0
|
||||
- _WorkflowMode: 0
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 0
|
||||
- _ZWrite: 1
|
||||
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}
|
||||
- _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}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
|
||||
@ -235,8 +235,8 @@ BoxCollider:
|
||||
m_ProvidesContacts: 0
|
||||
m_Enabled: 1
|
||||
serializedVersion: 3
|
||||
m_Size: {x: 2, y: 0.69, z: 1.15}
|
||||
m_Center: {x: -0.15, y: 0.34, z: -0.165}
|
||||
m_Size: {x: 2.06, y: 0.69, z: 1.15}
|
||||
m_Center: {x: -0.14, y: 0.34, z: -0.165}
|
||||
--- !u!54 &592039360660023171
|
||||
Rigidbody:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@ -29,7 +29,7 @@ LightingSettings:
|
||||
m_XAtlasBlockAlign: 0
|
||||
m_XAtlasRepackUnderutilizedLightmaps: 1
|
||||
m_AO: 1
|
||||
m_AOMaxDistance: 5.63
|
||||
m_AOMaxDistance: 0.14
|
||||
m_CompAOExponent: 1
|
||||
m_CompAOExponentDirect: 0
|
||||
m_ExtractAO: 0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
Assets/Scenes/RoomEditor/Lightmap-0_comp_dir.png
(Stored with Git LFS)
BIN
Assets/Scenes/RoomEditor/Lightmap-0_comp_dir.png
(Stored with Git LFS)
Binary file not shown.
Binary file not shown.
BIN
Assets/Scenes/RoomEditor/Lightmap-0_comp_shadowmask.png
(Stored with Git LFS)
BIN
Assets/Scenes/RoomEditor/Lightmap-0_comp_shadowmask.png
(Stored with Git LFS)
Binary file not shown.
@ -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:
|
||||
BIN
Assets/Scenes/RoomEditor/Lightmap-1_comp_dir.png
(Stored with Git LFS)
BIN
Assets/Scenes/RoomEditor/Lightmap-1_comp_dir.png
(Stored with Git LFS)
Binary file not shown.
Binary file not shown.
BIN
Assets/Scenes/RoomEditor/Lightmap-1_comp_shadowmask.png
(Stored with Git LFS)
BIN
Assets/Scenes/RoomEditor/Lightmap-1_comp_shadowmask.png
(Stored with Git LFS)
Binary file not shown.
@ -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:
|
||||
Binary file not shown.
@ -9,14 +9,15 @@ public class FurnitureController : MonoBehaviour
|
||||
public GameObject currentPrefab;
|
||||
public LayerMask floorLayer;
|
||||
public LayerMask wallLayer;
|
||||
|
||||
[Tooltip("Слой мебели (чтобы кликать по уже стоящим объектам)")]
|
||||
public LayerMask furnitureLayer; // НОВАЯ ПЕРЕМЕННАЯ
|
||||
|
||||
[SerializeField] private GameObject shopPanel;
|
||||
|
||||
[Header("Режим редактирования (UI)")]
|
||||
[SerializeField] private GameObject editPanel;
|
||||
|
||||
[Tooltip("Кнопка поворота на 90 градусов")]
|
||||
[SerializeField] private GameObject rotate90Button; // НОВАЯ ССЫЛКА НА КНОПКУ
|
||||
|
||||
[SerializeField] private GameObject rotate90Button;
|
||||
public float rotationSpeed = 5f;
|
||||
|
||||
[Header("Связь с камерой")]
|
||||
@ -41,17 +42,17 @@ public class FurnitureController : MonoBehaviour
|
||||
|
||||
currentPrefab = null;
|
||||
editPanel.SetActive(false);
|
||||
|
||||
// Прячем кнопку поворота при старте (т.к. начальный инструмент - Move)
|
||||
if (rotate90Button != null) rotate90Button.SetActive(false);
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
// 1. Если мы УЖЕ редактируем объект
|
||||
if (_activeFurniture != null)
|
||||
{
|
||||
HandleEditing();
|
||||
}
|
||||
// 2. Если мы выбрали НОВУЮ мебель в магазине и хотим её поставить
|
||||
else if (currentPrefab != null)
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0) && !shopPanel.activeSelf && !IsPointerOverUI())
|
||||
@ -59,6 +60,14 @@ public class FurnitureController : MonoBehaviour
|
||||
TryPlaceFurniture();
|
||||
}
|
||||
}
|
||||
// 3. НОВОЕ: Если ничего не выбрано, пытаемся кликнуть по УЖЕ СТОЯЩЕЙ мебели
|
||||
else
|
||||
{
|
||||
if (Input.GetMouseButtonDown(0) && !shopPanel.activeSelf && !IsPointerOverUI())
|
||||
{
|
||||
TrySelectPlacedFurniture();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
_isInteracting = true;
|
||||
@ -197,15 +237,12 @@ public class FurnitureController : MonoBehaviour
|
||||
float targetX = screenPos.x;
|
||||
float targetY = screenPos.y + yOffset;
|
||||
|
||||
// МАГИЯ: Ограничиваем выход меню за пределы экрана
|
||||
RectTransform rect = editPanel.GetComponent<RectTransform>();
|
||||
if (rect != null)
|
||||
{
|
||||
// Узнаем размер панели (с учетом скейла Canvas)
|
||||
float paddingX = (rect.rect.width / 2f) * editPanel.transform.lossyScale.x;
|
||||
float paddingY = (rect.rect.height / 2f) * editPanel.transform.lossyScale.y;
|
||||
|
||||
// Запрещаем выходить за края
|
||||
targetX = Mathf.Clamp(targetX, paddingX, Screen.width - paddingX);
|
||||
targetY = Mathf.Clamp(targetY, paddingY, Screen.height - paddingY);
|
||||
}
|
||||
@ -228,7 +265,6 @@ public class FurnitureController : MonoBehaviour
|
||||
|
||||
_activeFurnitureScript.SetEditMode(true);
|
||||
|
||||
// Сбрасываем инструмент на Move по умолчанию и прячем кнопку Rotate90
|
||||
_currentTool = EditTool.Move;
|
||||
if (rotate90Button != null) rotate90Button.SetActive(false);
|
||||
|
||||
@ -240,34 +276,27 @@ public class FurnitureController : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
// === НОВЫЙ МЕТОД: Поворот строго на 90 градусов ===
|
||||
public void Rotate90Degrees()
|
||||
{
|
||||
if (_activeFurniture != null)
|
||||
{
|
||||
// Берем текущий угол
|
||||
float currentY = _activeFurniture.transform.eulerAngles.y;
|
||||
|
||||
// Округляем до ближайшего числа, кратного 90 (чтобы сбросить кривой угол)
|
||||
float snappedY = Mathf.Round(currentY / 90f) * 90f;
|
||||
|
||||
// Добавляем 90
|
||||
_activeFurniture.transform.rotation = Quaternion.Euler(0, snappedY + 90f, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// === ОБНОВЛЕННЫЕ МЕТОДЫ ВЫБОРА ===
|
||||
public void SelectMoveTool()
|
||||
{
|
||||
_currentTool = EditTool.Move;
|
||||
if (rotate90Button != null) rotate90Button.SetActive(false); // Прячем кнопку поворота
|
||||
if (rotate90Button != null) rotate90Button.SetActive(false);
|
||||
LockCamera(false);
|
||||
}
|
||||
|
||||
public void SelectRotateTool()
|
||||
{
|
||||
_currentTool = EditTool.Rotate;
|
||||
if (rotate90Button != null) rotate90Button.SetActive(true); // Показываем кнопку поворота
|
||||
if (rotate90Button != null) rotate90Button.SetActive(true);
|
||||
LockCamera(true);
|
||||
}
|
||||
|
||||
|
||||
@ -24,44 +24,27 @@ public class RoomVisibilityController : MonoBehaviour
|
||||
[Range(-0.5f, 0.5f)]
|
||||
public float hideThreshold = 0.1f;
|
||||
|
||||
[Header("Настройки плавности (НОВОЕ)")]
|
||||
public float fadeSpeed = 3f; // Скорость исчезновения (чем больше, тем быстрее)
|
||||
|
||||
private Camera _mainCamera;
|
||||
private Dictionary<GameObject, bool> _wallHiddenStates = new Dictionary<GameObject, bool>();
|
||||
|
||||
// Новые словари для контроля плавного исчезновения
|
||||
private Dictionary<GameObject, float> _targetAlphas = new Dictionary<GameObject, float>();
|
||||
private Dictionary<GameObject, List<Material>> _objectMaterials = new Dictionary<GameObject, List<Material>>();
|
||||
// Кэшируем Renderer'ы для оптимизации (чтобы не делать GetComponent каждый кадр)
|
||||
private Dictionary<GameObject, Renderer[]> _objectRenderers = new Dictionary<GameObject, Renderer[]>();
|
||||
|
||||
void Start()
|
||||
{
|
||||
_mainCamera = Camera.main;
|
||||
|
||||
// При старте игры находим и запоминаем все материалы стен и столбиков
|
||||
foreach (var wall in walls) { InitializeFadingData(wall); }
|
||||
foreach (var pillar in pillars) { InitializeFadingData(pillar.pillarObject); }
|
||||
// При старте игры находим и запоминаем все Renderer'ы
|
||||
foreach (var wall in walls) { CacheRenderers(wall); }
|
||||
foreach (var pillar in pillars) { CacheRenderers(pillar.pillarObject); }
|
||||
}
|
||||
|
||||
// Метод для кэширования материалов (чтобы не искать их каждый кадр)
|
||||
private void InitializeFadingData(GameObject obj)
|
||||
private void CacheRenderers(GameObject obj)
|
||||
{
|
||||
if (obj == null || _objectMaterials.ContainsKey(obj)) return;
|
||||
|
||||
Renderer[] renderers = obj.GetComponentsInChildren<Renderer>();
|
||||
List<Material> mats = new List<Material>();
|
||||
|
||||
foreach (Renderer r in renderers)
|
||||
if (obj != null && !_objectRenderers.ContainsKey(obj))
|
||||
{
|
||||
// Обращение к .materials создает уникальную копию материала для объекта.
|
||||
// Это нужно, чтобы стены исчезали по отдельности, а не все разом.
|
||||
mats.AddRange(r.materials);
|
||||
_objectRenderers[obj] = obj.GetComponentsInChildren<Renderer>();
|
||||
}
|
||||
|
||||
_objectRenderers[obj] = renderers;
|
||||
_objectMaterials[obj] = mats;
|
||||
_targetAlphas[obj] = 1f; // 1f - это 100% непрозрачности (видимый)
|
||||
}
|
||||
|
||||
void LateUpdate()
|
||||
@ -82,8 +65,8 @@ public class RoomVisibilityController : MonoBehaviour
|
||||
|
||||
bool isHidden = Vector3.Dot(dirToCamera.normalized, dirToWall.normalized) > hideThreshold;
|
||||
|
||||
// Вместо мгновенного выключения, задаем ЦЕЛЕВУЮ прозрачность (0 - скрыть, 1 - показать)
|
||||
_targetAlphas[wall] = isHidden ? 0f : 1f;
|
||||
// Включаем или выключаем графику стены моментально
|
||||
SetVisibility(wall, !isHidden);
|
||||
_wallHiddenStates[wall] = isHidden;
|
||||
|
||||
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 isWall2Hidden = _wallHiddenStates.ContainsKey(pillar.connectedWall2) && _wallHiddenStates[pillar.connectedWall2];
|
||||
|
||||
// Прячем столбик только если ОБЕ подключенные стены спрятаны
|
||||
bool shouldHidePillar = isWall1Hidden && isWall2Hidden;
|
||||
|
||||
// Задаем целевую прозрачность для столбика
|
||||
_targetAlphas[pillar.pillarObject] = shouldHidePillar ? 0f : 1f;
|
||||
SetVisibility(pillar.pillarObject, !shouldHidePillar);
|
||||
}
|
||||
|
||||
// 3. Вызываем функцию плавного изменения прозрачности
|
||||
UpdateFading();
|
||||
}
|
||||
|
||||
// Метод, который плавно меняет Альфа-канал каждый кадр
|
||||
private void UpdateFading()
|
||||
// Метод для быстрого включения/выключения отрисовки объекта
|
||||
private void SetVisibility(GameObject obj, bool isVisible)
|
||||
{
|
||||
foreach (var kvp in _objectMaterials)
|
||||
if (obj == null || !_objectRenderers.ContainsKey(obj)) return;
|
||||
|
||||
Renderer[] renderers = _objectRenderers[obj];
|
||||
foreach (Renderer r in renderers)
|
||||
{
|
||||
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))
|
||||
if (r.enabled != isVisible)
|
||||
{
|
||||
// Плавно меняем значение от текущего к целевому
|
||||
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];
|
||||
bool shouldRender = newAlpha > 0f;
|
||||
|
||||
foreach (Renderer r in renderers)
|
||||
{
|
||||
if (r.enabled != shouldRender)
|
||||
{
|
||||
r.enabled = shouldRender;
|
||||
}
|
||||
}
|
||||
r.enabled = isVisible;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,7 @@ MonoBehaviour:
|
||||
m_SupportsTerrainHoles: 1
|
||||
m_SupportsHDR: 1
|
||||
m_HDRColorBufferPrecision: 0
|
||||
m_MSAA: 1
|
||||
m_MSAA: 4
|
||||
m_RenderScale: 1
|
||||
m_UpscalingFilter: 0
|
||||
m_FsrOverrideSharpness: 0
|
||||
@ -43,18 +43,18 @@ MonoBehaviour:
|
||||
m_ProbeVolumeSHBands: 1
|
||||
m_MainLightRenderingMode: 1
|
||||
m_MainLightShadowsSupported: 1
|
||||
m_MainLightShadowmapResolution: 2048
|
||||
m_MainLightShadowmapResolution: 4096
|
||||
m_AdditionalLightsRenderingMode: 1
|
||||
m_AdditionalLightsPerObjectLimit: 4
|
||||
m_AdditionalLightShadowsSupported: 1
|
||||
m_AdditionalLightsShadowmapResolution: 2048
|
||||
m_AdditionalLightsShadowmapResolution: 4096
|
||||
m_AdditionalLightsShadowResolutionTierLow: 256
|
||||
m_AdditionalLightsShadowResolutionTierMedium: 512
|
||||
m_AdditionalLightsShadowResolutionTierHigh: 1024
|
||||
m_ReflectionProbeBlending: 1
|
||||
m_ReflectionProbeBoxProjection: 1
|
||||
m_ReflectionProbeAtlas: 1
|
||||
m_ShadowDistance: 50
|
||||
m_ShadowDistance: 40
|
||||
m_ShadowCascadeCount: 4
|
||||
m_Cascade2Split: 0.25
|
||||
m_Cascade3Split: {x: 0.1, y: 0.3}
|
||||
@ -77,7 +77,7 @@ MonoBehaviour:
|
||||
m_DebugLevel: 0
|
||||
m_StoreActionsOptimization: 0
|
||||
m_UseAdaptivePerformance: 1
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingMode: 1
|
||||
m_ColorGradingLutSize: 32
|
||||
m_AllowPostProcessAlphaOutput: 0
|
||||
m_UseFastSRGBLinearConversion: 0
|
||||
|
||||
@ -6,7 +6,7 @@ QualitySettings:
|
||||
serializedVersion: 5
|
||||
m_CurrentQuality: 1
|
||||
m_QualitySettings:
|
||||
- serializedVersion: 4
|
||||
- serializedVersion: 5
|
||||
name: Mobile
|
||||
pixelLightCount: 2
|
||||
shadows: 2
|
||||
@ -34,6 +34,7 @@ QualitySettings:
|
||||
adaptiveVsyncExtraA: 0
|
||||
adaptiveVsyncExtraB: 0
|
||||
lodBias: 1
|
||||
meshLodThreshold: 1
|
||||
maximumLODLevel: 0
|
||||
enableLODCrossFade: 1
|
||||
streamingMipmapsActive: 0
|
||||
@ -47,8 +48,7 @@ QualitySettings:
|
||||
asyncUploadBufferSize: 16
|
||||
asyncUploadPersistentBuffer: 1
|
||||
resolutionScalingFixedDPIFactor: 1
|
||||
customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858,
|
||||
type: 2}
|
||||
customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, type: 2}
|
||||
terrainQualityOverrides: 0
|
||||
terrainPixelError: 1
|
||||
terrainDetailDensityScale: 1
|
||||
@ -58,9 +58,8 @@ QualitySettings:
|
||||
terrainBillboardStart: 50
|
||||
terrainFadeLength: 5
|
||||
terrainMaxTrees: 50
|
||||
excludedTargetPlatforms:
|
||||
- Standalone
|
||||
- serializedVersion: 4
|
||||
excludedTargetPlatforms: []
|
||||
- serializedVersion: 5
|
||||
name: PC
|
||||
pixelLightCount: 2
|
||||
shadows: 2
|
||||
@ -76,7 +75,7 @@ QualitySettings:
|
||||
globalTextureMipmapLimit: 0
|
||||
textureMipmapLimitSettings: []
|
||||
anisotropicTextures: 2
|
||||
antiAliasing: 0
|
||||
antiAliasing: 4
|
||||
softParticles: 0
|
||||
softVegetation: 1
|
||||
realtimeReflectionProbes: 0
|
||||
@ -88,6 +87,7 @@ QualitySettings:
|
||||
adaptiveVsyncExtraA: 0
|
||||
adaptiveVsyncExtraB: 0
|
||||
lodBias: 2
|
||||
meshLodThreshold: 1
|
||||
maximumLODLevel: 0
|
||||
enableLODCrossFade: 1
|
||||
streamingMipmapsActive: 0
|
||||
@ -101,8 +101,7 @@ QualitySettings:
|
||||
asyncUploadBufferSize: 16
|
||||
asyncUploadPersistentBuffer: 1
|
||||
resolutionScalingFixedDPIFactor: 1
|
||||
customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd,
|
||||
type: 2}
|
||||
customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2}
|
||||
terrainQualityOverrides: 0
|
||||
terrainPixelError: 1
|
||||
terrainDetailDensityScale: 1
|
||||
@ -113,7 +112,6 @@ QualitySettings:
|
||||
terrainFadeLength: 5
|
||||
terrainMaxTrees: 50
|
||||
excludedTargetPlatforms:
|
||||
- Android
|
||||
- iPhone
|
||||
m_TextureMipmapLimitGroupNames: []
|
||||
m_PerPlatformDefaultQuality:
|
||||
@ -122,6 +120,7 @@ QualitySettings:
|
||||
GameCoreXboxOne: 1
|
||||
Lumin: 0
|
||||
Nintendo Switch: 1
|
||||
Nintendo Switch 2: 1
|
||||
PS4: 1
|
||||
PS5: 1
|
||||
Server: 0
|
||||
|
||||
Loading…
Reference in New Issue
Block a user