using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.UI; /// /// VR ȯ°æ¿¡¼­ ·Îº¿ ÇÁ·Î±×·¥ÀÇ »ó¼¼ Á¤º¸(½ºÅÜ ¸®½ºÆ®, ¼Óµµ µî)¸¦ Ç¥½ÃÇϰí Á¦¾îÇÏ´Â ºä(View) Ŭ·¡½º /// ÇÁ·Î±×·¥ ½ÇÇà/Á¤Áö, ¸®¼Â, ¼Óµµ Á¶Àý µîÀÇ »ç¿ëÀÚ ÀÔ·ÂÀ» ¹Þ¾Æ ProgramPresenter·Î Àü´Þ /// public class ProgramInfoView : MonoBehaviour { // --- ÇÁ·Î±×·¥ Á¤º¸ ÆÐ³Î --- /// /// Á¤º¸ ÆÐ³ÎÀÌ È°¼ºÈ­µÉ ¶§ ºÎÂøµÉ VR ÄÁÆ®·Ñ·¯(¿Þ¼Õ)ÀÇ Transform /// [SerializeField] private Transform leftControllerTransform; [SerializeField] private GameObject infoPanel; // ½ÇÁ¦ ÄÑ°í ²ø Á¤º¸ ÆÐ³ÎÀÇ ÃÖ»óÀ§ °ÔÀÓ ¿ÀºêÁ§Æ® public InputActionReference showInfoPanel; // ÆÐ³ÎÀ» Åä±Û(Äѱâ/²ô±â)ÇÏ´Â ÀÔ·Â ¾×¼Ç public InputActionReference hideInfoPanel; // ÆÐ³ÎÀ» °­Á¦·Î ¼û±â´Â ÀÔ·Â ¾×¼Ç public InputActionReference[] playProgram; // ÇÁ·Î±×·¥À» Àç»ý/Á¤ÁöÇÏ´Â ÀÔ·Â ¾×¼Ç (¿¹: A ¶Ç´Â B¹öư) // Åä±Û »óÅ °ü¸®¸¦ À§ÇÑ Ç÷¡±× º¯¼öµé private bool isPressingX = false; private bool isPressingAorB = false; [SerializeField] public TextMeshProUGUI jobName; // ÀÛ¾÷ À̸§ [SerializeField] public TextMeshProUGUI jobSpeed; // Àç»ý ¼Óµµ [SerializeField] private GameObject orderPrefab; // stepÀÇ UI ÇÁ¸®ÆÕ [SerializeField] private GameObject endPrefab; // endÀÇ UI ÇÁ¸®ÆÕ [SerializeField] private Transform contentParent; // ½ºÅÜ UI ¾ÆÀÌÅÛµéÀÌ »ý¼ºµÉ ºÎ¸ð Transform (Scroll ViewÀÇ Content) // ¼Óµµ °ü·Ã ¹öư [SerializeField] private Button resetBtn; [SerializeField] private Button startBtn; [SerializeField] private Button stopBtn; [SerializeField] private Button minusBtn; [SerializeField] private Button plusBtn; // »ý¼ºµÈ ½ºÅÜ UI ¾ÆÀÌÅÛµéÀ» °ü¸®Çϱâ À§ÇÑ ¸®½ºÆ® private List instantiatedStepItems = new List(); // --- À̺¥Æ® Á¤ÀÇ (ProgramPresenter·Î ½ÅÈ£ Àü´Þ) --- public event Action OnResetClicked; public event Action OnStartClicked; public event Action OnStopClicked; public event Action OnMinusClicked; public event Action OnPlusClicked; void Start() { infoPanel.SetActive(false); // ÀÔ·Â ¾×¼Ç À̺¥Æ® ¿¬°á (ÆÐ³Î Ç¥½Ã/¼û±è) if (showInfoPanel != null) { showInfoPanel.action.Enable(); showInfoPanel.action.performed += ShowProgramInfoPanel; } if (hideInfoPanel != null) { hideInfoPanel.action.Enable(); hideInfoPanel.action.performed += HideProgramInfoPanel; } // ÀÔ·Â ¾×¼Ç À̺¥Æ® ¿¬°á (A/B ¹öư) if (playProgram != null) { for (int i = 0; i < playProgram.Length; i++) { playProgram[i].action.Enable(); playProgram[i].action.performed += PlayProgram; } } resetBtn.onClick.AddListener(() => OnResetClicked?.Invoke()); startBtn.onClick.AddListener(() => OnStartClicked?.Invoke()); stopBtn.onClick.AddListener(() => OnStopClicked?.Invoke()); minusBtn.onClick.AddListener(() => OnMinusClicked?.Invoke(-1)); plusBtn.onClick.AddListener(() => OnPlusClicked?.Invoke(1)); } private void OnDestroy() { if (showInfoPanel != null) { showInfoPanel.action.performed -= ShowProgramInfoPanel; } if (hideInfoPanel != null) { hideInfoPanel.action.performed -= HideProgramInfoPanel; } if (playProgram != null) { for (int i = 0; i < playProgram.Length; i++) { playProgram[i].action.performed -= PlayProgram; } } } /// /// Presenter·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ¹Þ¾Æ UI ¸®½ºÆ®¸¦ °»½Å /// ±âÁ¸ ¸ñ·ÏÀ» ¸ðµÎ Áö¿ì°í, »õ·Î¿î ½ºÅÜ µ¥ÀÌÅÍ·Î ´Ù½Ã ä¿ò /// /// ·Îº¿ ÇÁ·Î±×·¥ Á¤º¸ (¾øÀ¸¸é ¸®ÅÏ) /// ÆÄ½ÌµÈ °³º° ½ºÅÜ ¸®½ºÆ® public void UpdateProgramInfo(RobotProgram program, List steps) { if (program == null) return; // ±âÁ¸ ¸®½ºÆ® ÃʱâÈ­ (UI ¿ÀºêÁ§Æ® »èÁ¦) foreach (Transform child in contentParent) { Destroy(child.gameObject); } instantiatedStepItems.Clear(); // »õ ½ºÅÜ ¸ñ·Ï »ý¼º if (steps == null) return; foreach (RobotMoveStep step in steps) { GameObject newPrefab = Instantiate(orderPrefab, contentParent); StepInfoItem stepItemUI = newPrefab.GetComponent(); if (stepItemUI != null) { stepItemUI.SetData(step); instantiatedStepItems.Add(stepItemUI); } else { Debug.LogError("orderPrefab¿¡ StepInfoItem.cs ½ºÅ©¸³Æ®°¡ ¾ø½À´Ï´Ù"); } if (jobSpeed.text == "0%") jobSpeed.text = $"{step.Speed}%"; } // ¸¶Áö¸·¿¡ END Ãß°¡ Instantiate(endPrefab, contentParent); } /// /// ÄÁÆ®·Ñ·¯ ÀÔ·Â(X¹öư)À¸·Î Á¤º¸ ÆÐ³ÎÀ» ÄѰųª ²û (Åä±Û ¹æ½Ä) /// private void ShowProgramInfoPanel(InputAction.CallbackContext obj) { isPressingX = !isPressingX; if (isPressingX) { infoPanel.transform.SetParent(leftControllerTransform); infoPanel.transform.localPosition = new Vector3(0f, 0.2f, 0f); infoPanel.transform.localRotation = Quaternion.Euler(0, 180, 0); infoPanel.SetActive(true); } else { infoPanel.SetActive(false); } } /// /// ÄÁÆ®·Ñ·¯ ÀÔ·ÂÀ¸·Î Á¤º¸ ÆÐ³ÎÀ» ¼û±è /// private void HideProgramInfoPanel(InputAction.CallbackContext obj) { infoPanel.SetActive(false); } /// /// ÄÁÆ®·Ñ·¯ ÀÔ·Â(A/B¹öư)À¸·Î ÇÁ·Î±×·¥À» Àç»ýÇϰųª Á¤Áö (Åä±Û ¹æ½Ä) /// private void PlayProgram(InputAction.CallbackContext obj) { isPressingAorB = !isPressingAorB; if (isPressingAorB) { OnStartClicked?.Invoke(); } else { OnStopClicked?.Invoke(); } } }