работаю над светом
This commit is contained in:
parent
448a69ceb1
commit
fc12b3bab2
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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.
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 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 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;
|
if (r.enabled != isVisible)
|
||||||
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))
|
|
||||||
{
|
{
|
||||||
// Плавно меняем значение от текущего к целевому
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user