Files
HDRobotics/Assets/Scripts/View/EnvView.cs
2025-12-03 21:19:07 +09:00

174 lines
5.7 KiB
C#

using System;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
/// <summary>
/// 어플리케이션의 메인 환경 설정 패널을 관리하는 뷰 클래스
/// 프로그램 불러오기/생성, TCP 정보 표시 토글, 도움말, 앱 종료 등의 기능을 제공
/// VR 컨트롤러의 메뉴 버튼으로 호출됨
/// </summary>
public class EnvView : MonoBehaviour
{
[SerializeField] private GameObject envPanel; // 환경 설정 메인 패널 (전체 메뉴의 부모)
[SerializeField] private GameObject pauseMenuPanel; // 메뉴 버튼들이 모여있는 패널 (도움말 등을 띄울 때 숨겨짐)
[SerializeField] private Button envBackBtn; // 뒤로 가기 버튼
[SerializeField] private Button[] toggleBtn; // TCP 정보 표시 여부를 변경하는 버튼 배열
[SerializeField] private Button loadProgramBtn; // '프로그램 불러오기' 메뉴로 진입하는 버튼
[SerializeField] private Button newProgramBtn; // '새 프로그램 만들기' 메뉴로 진입하는 버튼
[SerializeField] private Button helpBtn; // 도움말 패널을 여는 버튼
[SerializeField] private Button exitBtn; // 어플리케이션 종료 버튼
[SerializeField] private GameObject icon_show; // TCP 정보가 보이는 상태일 때 표시할 아이콘 (눈 뜬 아이콘)
[SerializeField] private GameObject icon_hide; // TCP 정보가 숨겨진 상태일 때 표시할 아이콘 (눈 감은 아이콘)
[SerializeField] private TextMeshProUGUI tcpToggleTMP; // 현재 TCP 표시 상태를 알려주는 텍스트 (ON/OFF)
[SerializeField] private GameObject helpPanel; // 도움말 내용을 담은 패널
[SerializeField] private Button helpBackBtn; // 도움말 패널 닫기 버튼
[SerializeField] private GameObject ProgramEnterPanel; // 프로그램 선택/생성 관련 UI들을 포함하는 상위 패널
[SerializeField] private GameObject NewProgramPanel; // '새 프로그램 생성' 화면 패널
[SerializeField] private GameObject OriginalProgramPanel; // '기존 프로그램 불러오기' 화면 패널 (리스트)
/// <summary>
/// 메뉴 패널을 여닫는 컨트롤러 입력 액션 (예: 왼쪽 컨트롤러 메뉴 버튼)
/// </summary>
public InputActionReference showEnvPanel;
private bool isPressingMenu = false; // 메뉴가 현재 열려있는지 확인하는 플래그
// --- 이벤트 정의 ---
public event Action<bool> OnToggleClicked; // TCP 토글 버튼 클릭 시 발생 (true: 보이기, false: 숨기기)
public event Action OnLoadProgramListRequested; // 프로그램 목록 로드 요청 시 발생
void Start()
{
envPanel.SetActive(false);
if (showEnvPanel != null)
{
showEnvPanel.action.Enable();
showEnvPanel.action.performed += ShowEnvPanel;
}
envBackBtn.onClick.AddListener(() => HideAllPanels());
toggleBtn[0].onClick.AddListener(() => ToggleTcp());
toggleBtn[1].onClick.AddListener(() => ToggleTcp());
loadProgramBtn.onClick.AddListener(() => LoadProgramList());
newProgramBtn.onClick.AddListener(() => OpenNewProgramPanel());
helpBtn.onClick.AddListener(() => OpenHelpPanel());
helpBackBtn.onClick.AddListener(() => CloseHelpPanel());
exitBtn.onClick.AddListener(() => QuitGame());
}
private void OnDestroy()
{
if (showEnvPanel != null)
{
showEnvPanel.action.performed -= ShowEnvPanel;
}
}
/// <summary>
/// 컨트롤러 메뉴 버튼 입력 시 호출됨
/// 패널을 토글(켜기/끄기)하고, 켜질 때 다른 하위 패널들을 숨김
/// </summary>
private void ShowEnvPanel(InputAction.CallbackContext obj)
{
if (!isPressingMenu)
{
envPanel.SetActive(true);
ProgramEnterPanel.SetActive(false);
}
else
{
envPanel.SetActive(false);
}
isPressingMenu = !isPressingMenu;
}
/// <summary>
/// '뒤로 가기' 등을 눌렀을 때 모든 패널을 숨김
/// </summary>
private void HideAllPanels()
{
envPanel.SetActive(false);
ProgramEnterPanel.SetActive(false);
}
/// <summary>
/// 도움말 패널 열기 (메인 메뉴 버튼들은 숨김)
/// </summary>
private void OpenHelpPanel()
{
helpPanel.SetActive(true);
pauseMenuPanel.SetActive(false);
}
/// <summary>
/// 도움말 패널을 닫고 다시 메인 메뉴 버튼들을 보여줌
/// </summary>
private void CloseHelpPanel()
{
helpPanel.SetActive(false);
pauseMenuPanel.SetActive(true);
}
/// <summary>
/// TCP 정보 표시 여부(UI)를 토글하고 이벤트를 발생시킴
/// </summary>
private void ToggleTcp()
{
if(icon_show.activeSelf)
{
icon_show.SetActive(false);
icon_hide.SetActive(true);
tcpToggleTMP.text = "현재 TCP값 OFF";
OnToggleClicked?.Invoke(false);
}
else if (icon_hide.activeSelf)
{
icon_hide.SetActive(false);
icon_show.SetActive(true);
tcpToggleTMP.text = "현재 TCP값 ON";
OnToggleClicked?.Invoke(true);
}
}
/// <summary>
/// '프로그램 불러오기' 화면으로 전환
/// </summary>
private void LoadProgramList()
{
envPanel.SetActive(false);
ProgramEnterPanel.SetActive(true);
NewProgramPanel.SetActive(false);
OriginalProgramPanel.SetActive(true);
OnLoadProgramListRequested?.Invoke();
}
/// <summary>
/// '새 프로그램 만들기' 화면으로 전환
/// </summary>
private void OpenNewProgramPanel()
{
envPanel.SetActive(false);
ProgramEnterPanel.SetActive(true);
NewProgramPanel.SetActive(true);
OriginalProgramPanel.SetActive(false);
}
/// <summary>
/// 어플리케이션을 종료
/// 에디터 환경과 빌드 환경을 구분하여 처리
/// </summary>
private void QuitGame()
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit(); // 어플리케이션 종료
#endif
}
}