بنقرة واحدة
scene-ui-visibility
씬별/모드별 UI 가시성 제어 — scene, panel visibility, overlap, mode isolation, 배타 그룹
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
씬별/모드별 UI 가시성 제어 — scene, panel visibility, overlap, mode isolation, 배타 그룹
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Unity Play 시작 씬, scene-authored UI source-of-truth, authored-first binder, RobotControl/Onboarding 라우팅 착시를 함께 디버깅하는 운영 스킬
Use when adding, extending, or debugging Waypoint Teaching & Playback: saving robot poses as waypoints, sequencing them, playing/looping sequences, exporting/importing JSON, coroutine-based runner engine, or teaching UI integration.
MonoBehaviour에서 UI 생성 코드를 ViewBuilder 정적 클래스 + Refs struct로 분리
Robot Library / Sandbox robot showroom 디버깅과 튜닝 — showroomoutput, comparestrip, preview pod, Game view vs Scene view 스케일 차이, hero/page selection, runtime root 중복
Use when working on FAIRINO FR5 6-axis robot integration in this repo: collecting official FR5 docs, mapping Unity UI inputs to the FAIRINO C# SDK, planning real-robot control and safety, documenting FR5 hardware/DH/protocol details, or building adapters around MoveJ/MoveL/ServoJ/ServoCart and status feedback.
Main 탭형 학습 쉘의 로봇별 JSON 콘텐츠를 추가/수정/검증하는 스킬. `Assets/Runtime/Resources/LearningTabs/*.json` 문안 업데이트, 새 로봇용 탭 문서 추가, MainLearningTabsLoader fallback 조정, Main 탭 콘텐츠 schema 변경, JSON 파싱/폴백/Unity MCP 검증이 필요할 때 사용한다.
| name | scene-ui-visibility |
| description | 씬별/모드별 UI 가시성 제어 — scene, panel visibility, overlap, mode isolation, 배타 그룹 |
씬에 UI 패널을 추가하거나, 패널 겹침 문제가 발생하거나, 새 씬/모드를 만들 때.
키워드: panel visibility, UI 겹침, 씬 UI, SetVisible, 패널 초기 상태, ExecuteAlways, mode isolation
Assets/Scripts/App/SceneCatalog.cs — 씬 목록 (Boot, Onboarding, Home, Main, RobotLibrary, Sandbox)Assets/Scripts/App/AppController.cs — HideAllContentPanels() + 모드별 메서드Assets/Scripts/App/AppUiBinder.cs — UI 자동 바인딩 패턴Assets/Scripts/App/SandboxSceneCoordinator.cs — Sandbox 전용 가시성Assets/Scripts/UI/CLAUDE.md — UI 폴더 규칙docs/ref/WIREFRAME.md — 화면별 패널 배치AppController.ApplyFeatureState()가 적용하는 가시성 규칙입니다.
패턴: HideAllContentPanels() → 모드별 Apply___Visibility() → config flag 적용
| 패널 | MathReadiness | Beginner | Core | Sandbox |
|---|---|---|---|---|
| MathReadinessPanel | ✅ | ❌ | ❌ | ❌ |
| BeginnerLeftPanel | ❌ | ✅ (config) | ❌ | ❌ |
| DHTableEditor | ❌ | config | config | ❌ |
| StepTutorPanel | ❌ | ✅ | ✅ | ❌ |
| MatrixDisplay | ❌ | config | config | ❌ |
| WhyItMovedPanel | config | config | config | ❌ |
| TargetFeedbackPanel | ❌ | config | ❌ | ❌ |
| TemplateSelector | ❌ | ✅ | ✅ | ❌ |
| SandboxActionPanel | ❌ | ❌ | ❌ | ✅ |
| SnapshotLitePanel | ❌ | ❌ | ❌ | ✅ |
| JointInputRail | config | config | config | ✅ |
| StepNavigator | ✅ | ✅ | ✅ | ❌ |
| SceneNavigationBar | ✅ | ✅ | ✅ | ✅ |
✅ = 항상 보임❌ = 항상 숨김config = TutorStepConfig 플래그에 따라 결정| 패널 | 상태 |
|---|---|
| HomeContinueHubController | Active |
| SceneNavigationBar | Active |
| (나머지 모든 학습 패널) | 없음 (씬에 존재하지 않음) |
| 패널 | 상태 |
|---|---|
| OnboardingManager | Active |
| SceneNavigationBar | Active |
| (나머지 모든 학습 패널) | 없음 |
| 패널 | 상태 |
|---|---|
| RobotLibraryManager | Active |
| RobotDetailDrawer | Inactive (이벤트 구동) |
| SceneNavigationBar | Active |
같은 영역에서 배타 그룹으로 묶인 패널은 동시에 Active일 수 없습니다.
left-exclusive: DHTableEditor | BeginnerLeftPanel | MathReadinessPanel
right-exclusive: StepTutorPanel+MatrixDisplay | WhyItMovedPanel | TargetFeedbackPanel | CompareModePanelHelper
topbar-controls: TemplateSelector (드롭다운+Sandbox+Glossary 버튼)
sandbox-only: SandboxActionPanel | SnapshotLitePanel
전환 트리거: AppController.ApplyFeatureState() → HideAllContentPanels() → Apply{Mode}Visibility()
모드 전환 시 개별 SetVisible(false) 호출을 나열하지 말고, HideAllContentPanels()로 전부 끈 뒤 해당 모드 메서드에서 필요한 것만 켜야 합니다:
// AppController.cs 패턴
private void ApplyFeatureState(TutorStepConfig config)
{
HideAllContentPanels(); // Step 1: 전부 끄기
ApplyCommonVisualization(config); // Step 2: 공통 시각화
Apply{Mode}Visibility(config); // Step 3: 모드 전용 켜기
}
새 콘텐츠 패널을 추가하면 반드시:
HideAllContentPanels()에 newPanel?.SetVisible(false) 추가SetVisible(true) 추가모든 패널 MonoBehaviour에 SetVisible(bool) 퍼블릭 메서드를 구현합니다:
public void SetVisible(bool visible)
{
if (panelRoot != null)
{
panelRoot.gameObject.SetActive(visible);
}
}
EnsureLayout() / EnsurePresentation() 메서드는 UI 계층 구조만 생성합니다.
가시성 제어는 반드시 SetVisible() 또는 외부 오케스트레이터가 담당합니다.
[ExecuteAlways]가 필요한 경우, 에디터에서 불필요한 활성 상태 변경을 하지 않도록 가드합니다.
[ExecuteAlways] 필요 여부 판단 기준:
DHTableEditor, MatrixDisplay)ToastNotificationController, SpotlightOverlay)[ExecuteAlways]는 제거합니다.HideAllContentPanels()가 자동으로 배타 그룹을 처리하므로, 개별 모드 메서드에서는 켜기만 하면 됩니다.
AppController에 Apply{NewMode}Visibility(TutorStepConfig) 메서드 추가ApplyFeatureState의 분기에 조건 추가SceneNavigator.Load()가 LoadSceneMode.Single을 사용하므로, 씬 전환 시 이전 씬의 모든 오브젝트가 자동 파괴됩니다. DontDestroyOnLoad는 사용하지 않습니다.
DontDestroyOnLoad 사용 금지 — 씬 전환 시 UI 잔류 원인EnsureLayout() 안에서 SetActive(true/false) 호출 금지 — 구조와 가시성 분리SetVisible(false) 호출 금지 — HideAllContentPanels()가 이미 처리함[ExecuteAlways] 불필요한 컴포넌트에 남겨두기 금지HideAllContentPanels()를 건너뛰고 모드별 메서드만 호출 금지HideAllContentPanels() — 11개 패널 일괄 숨김ApplyMathReadinessVisibility() — MathReadinessPanel만 표시ApplyBeginnerVisibility() — StepTutor + Template + DH + Matrix + BeginnerLeft + TargetFeedbackApplyCoreVisibility() — StepTutor + Template + DH + MatrixSandboxSceneCoordinator.ApplySandboxPresentation() — SandboxAction + SnapshotLite모든 콘텐츠 패널에 SetVisible(bool) 구현 완료:
DHTableEditor, BeginnerLeftPanel, MathReadinessPanelStepTutorPanel, MatrixDisplay (신규), WhyItMovedPanel, TargetFeedbackPanel, CompareModePanelHelperTemplateSelector (신규 — 드롭다운+Sandbox+Glossary 버튼)SandboxActionPanel, SnapshotLitePanel배타 그룹 패널에서 Awake()의 EnsureLayout() 제거, OnEnable()에 SetVisible(false) 추가:
BeginnerLeftPanel, MathReadinessPanel, TargetFeedbackPanel, WhyItMovedPanel런타임 전용 컴포넌트에서 제거:
ToastNotificationController, SpotlightOverlay, HomeContinueHubController, SandboxActionPanel, SnapshotLitePanelSetVisible(bool) 퍼블릭 메서드 존재HideAllContentPanels()에 모든 콘텐츠 패널 포함[ExecuteAlways] 에디터 프리뷰가 필요 없는 컴포넌트에서 제거됨EnsureLayout()에 SetActive 호출 없음[scene-ui-visibility 적용]
- 모드: {MathReadiness / Beginner / Core / Sandbox}
- 추가/수정 패널: {패널 이름} ({영역})
- HideAllContentPanels 업데이트: {Y/N}
- Apply{Mode}Visibility 업데이트: {Y/N}
- 매트릭스 업데이트: {Y/N}
- Unity 컴파일: 에러 0