diff --git a/src/editor/HierarchyPanel.jsx b/src/editor/HierarchyPanel.jsx
index 356ea73..ea55712 100644
--- a/src/editor/HierarchyPanel.jsx
+++ b/src/editor/HierarchyPanel.jsx
@@ -242,7 +242,7 @@ const HierarchyPanel = ({
onSelectSound, onSelectPlayer, onSelectPlayerProps, onSelectFloor,
guiElements = [], onSelectGui, onCreateGui, onDeleteGui, onRenameGui, onMoveGuiZ, onSetGuiParent,
guiOverlayHidden = false, onToggleGuiOverlay,
- floorEnabled = true, onCreateFloor, onDeleteFloor, onDeleteSpawn,
+ floorEnabled = true, onCreateFloor, onDeleteFloor, onDeleteSpawn, spawnEnabled = true,
scripts = [], onSelectScript, onCreateScript, onDeleteScript,
onRenameModel, onRenamePrimitive, onRenameScript,
/**
@@ -781,7 +781,8 @@ const HierarchyPanel = ({
/>
{workspaceOpen && (
- {/* Точка спавна — кликабельная */}
+ {/* Точка спавна — кликабельная. Скрыта если удалена. */}
+ {spawnEnabled !== false && (
onSelectSpawn?.()}
@@ -792,6 +793,7 @@ const HierarchyPanel = ({
Точка спавна
+ )}
{/* Пол — псевдо-объект, если включён */}
{floorEnabled && (
diff --git a/src/editor/KubikonEditor.jsx b/src/editor/KubikonEditor.jsx
index 91443d7..9c2ecc3 100644
--- a/src/editor/KubikonEditor.jsx
+++ b/src/editor/KubikonEditor.jsx
@@ -606,6 +606,7 @@ const KubikonEditor = () => {
const [crosshair, setCrosshairUI] = useState('none');
// Видимость пола в иерархии
const [floorEnabled, setFloorEnabledUI] = useState(true);
+ const [spawnEnabledUI, setSpawnEnabledUI] = useState(true);
// Табы над viewport (Roblox-style): «🎬 Сцена» + открытые скрипты
const [openTabs, setOpenTabs] = useState([{ id: 'scene', kind: 'scene', title: 'Сцена' }]);
const [activeTabId, setActiveTabId] = useState('scene');
@@ -1354,6 +1355,8 @@ const KubikonEditor = () => {
markDirty();
// Иерархия изменилась — interval пересоберёт списки на след. тике.
hierarchyDirtyRef.current = true;
+ // Синк флага точки спавна (например после Delete-клавиши).
+ try { setSpawnEnabledUI(scene.hasSpawn?.() !== false); } catch (e) {}
});
// Этап 5: подключаем API пользовательских моделей в BabylonScene,
@@ -1558,6 +1561,7 @@ const KubikonEditor = () => {
const ch = sceneRef.current.getCrosshair?.();
if (ch) setCrosshairUI(ch);
setFloorEnabledUI(sceneRef.current.isFloorEnabled?.() !== false);
+ setSpawnEnabledUI(sceneRef.current.hasSpawn?.() !== false);
const a = sceneRef.current.getAudioState?.();
if (a?.ambientId) setAmbientIdUI(a.ambientId);
if (a?.musicId) setMusicIdUI(a.musicId);
@@ -2112,6 +2116,7 @@ const KubikonEditor = () => {
onPlayToggle={handlePlay}
onSetSpawn={() => {
sceneRef.current?.setSpawnAtCamera();
+ setSpawnEnabledUI(true);
}}
hasSelection={!!selection}
onDuplicate={() => sceneRef.current?.duplicateSelected()}
@@ -3245,6 +3250,7 @@ const KubikonEditor = () => {
setActiveTool('select');
}}
floorEnabled={floorEnabled}
+ spawnEnabled={spawnEnabledUI}
onSelectFloor={() => {
sceneRef.current?.selection?.selectFloor?.();
setActiveTool('select');
@@ -3312,6 +3318,7 @@ const KubikonEditor = () => {
onDeleteSpawn={() => {
sceneRef.current?.deleteSpawn?.();
sceneRef.current?.clearSelection?.();
+ setSpawnEnabledUI(false);
markDirty();
}}
onSelectLighting={() => {