agv 개발
This commit is contained in:
@@ -12,13 +12,9 @@ namespace UVC.UI.Info
|
||||
/// 3D 객체를 따라다니며 정보를 표시하는 UI 창입니다.
|
||||
/// 이 컴포넌트는 World Space Canvas 내의 UI 요소에 추가되어야 합니다.
|
||||
/// </summary>
|
||||
public class InfoWindow : MonoBehaviour
|
||||
public class InfoWindow : SingletonScene<InfoWindow>
|
||||
{
|
||||
|
||||
[Tooltip("InfoWindow의 프리팹")]
|
||||
[SerializeField]
|
||||
private static GameObject infoWindowPrefab;
|
||||
|
||||
[Tooltip("정보 텍스트를 표시할 UI 요소")]
|
||||
[SerializeField]
|
||||
private TextMeshProUGUI infoText;
|
||||
@@ -34,30 +30,16 @@ namespace UVC.UI.Info
|
||||
// 정보 창이 따라다닐 3D 객체의 Transform
|
||||
private Transform? target;
|
||||
|
||||
// 메인 카메라 참조
|
||||
private Camera mainCamera;
|
||||
|
||||
/// <summary>
|
||||
/// 정보 창이 현재 화면에 표시되고 있는지 여부를 반환합니다.
|
||||
/// </summary>
|
||||
public bool IsVisible => gameObject.activeSelf;
|
||||
|
||||
/// <summary>
|
||||
/// 정보 창을 생성하여 반환합니다.
|
||||
/// </summary>
|
||||
public static InfoWindow? Create()
|
||||
{
|
||||
if(infoWindowPrefab == null)
|
||||
{
|
||||
Debug.LogError("InfoWindow 프리팹이 할당되지 않았습니다. Inspector에서 할당해주세요.");
|
||||
return null;
|
||||
}
|
||||
return Instantiate(infoWindowPrefab).GetComponent<InfoWindow>();
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
protected override void Awake()
|
||||
{
|
||||
mainCamera = Camera.main;
|
||||
base.Awake();
|
||||
|
||||
// 닫기 버튼이 할당되었으면 클릭 이벤트를 연결합니다.
|
||||
if (closeButton != null)
|
||||
@@ -79,9 +61,6 @@ namespace UVC.UI.Info
|
||||
{
|
||||
// 위치 업데이트
|
||||
transform.position = target.position + worldOffset;
|
||||
|
||||
// 항상 카메라를 바라보도록 방향 업데이트 (빌보드 효과)
|
||||
transform.rotation = mainCamera.transform.rotation;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System; // System.Type 사용을 위해 추가
|
||||
using System.Threading;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UVC.Log;
|
||||
|
||||
namespace UVC.UI.Modal
|
||||
@@ -55,6 +55,8 @@ namespace UVC.UI.Modal
|
||||
/// </summary>
|
||||
private const string DefaultBlockerPrefabPath = "Prefabs/UI/Modal/ModalBlocker";
|
||||
|
||||
private static GameObject? blockerPrefabObj;
|
||||
|
||||
/// <summary>
|
||||
/// ✨ 모달아, 열려라! ✨
|
||||
/// 이 마법 주문을 외치면 화면에 새로운 알림 상자(모달)가 뿅! 하고 나타나요.
|
||||
@@ -124,7 +126,10 @@ namespace UVC.UI.Modal
|
||||
// --- 투명 방패(Blocker) 준비 ---
|
||||
CanvasGroup blockerCanvasGroup = null;
|
||||
// 📜 이야기: '투명 방패' 디자인 파일을 불러와요. Resources.LoadAsync는 비동기(기다리지 않고 다음 일 하기)로 파일을 불러오는 마법이에요.
|
||||
GameObject blockerPrefabObj = await Resources.LoadAsync<GameObject>(blockerPrefabPath) as GameObject;
|
||||
if (blockerPrefabObj == null)
|
||||
{
|
||||
blockerPrefabObj = await Resources.LoadAsync<GameObject>(blockerPrefabPath) as GameObject;
|
||||
}
|
||||
if (blockerPrefabObj != null)
|
||||
{
|
||||
// 화면에서 가장 큰 그림판(Canvas)을 찾아서 그 위에 방패를 놓을 거예요.
|
||||
@@ -147,7 +152,7 @@ namespace UVC.UI.Modal
|
||||
|
||||
// --- 모달 창(Modal) 준비 ---
|
||||
// 📜 이야기: 이제 진짜 모달 창 디자인 파일을 불러올 차례예요. 이것도 비동기로!
|
||||
GameObject modalPrefabObj = await Resources.LoadAsync<GameObject>(currentContent.PrefabPath) as GameObject;
|
||||
GameObject? modalPrefabObj = await Resources.LoadAsync<GameObject>(currentContent.PrefabPath) as GameObject;
|
||||
if (modalPrefabObj == null)
|
||||
{
|
||||
ULog.Error($"[Modal] 모달 프리팹을 다음 경로에서 찾을 수 없습니다: {currentContent.PrefabPath}");
|
||||
@@ -185,7 +190,8 @@ namespace UVC.UI.Modal
|
||||
// 그런 상황에 대비해서, 모달 창이 파괴될 때 자동으로 "취소"된 것처럼 처리하도록 등록해둬요.
|
||||
// GetCancellationTokenOnDestroy()는 "이 게임 오브젝트가 파괴되면 알려줘!"라는 신호예요.
|
||||
var modalDestroyToken = currentModalInstance.GetCancellationTokenOnDestroy();
|
||||
modalDestroyToken.RegisterWithoutCaptureExecutionContext(async () => {
|
||||
modalDestroyToken.RegisterWithoutCaptureExecutionContext(async () =>
|
||||
{
|
||||
// 이 코드는 모달 인스턴스가 파괴될 때 실행돼요.
|
||||
// 만약 우리가 아직 결과를 기다리고 있는(Pending) 모달이었다면,
|
||||
if (Modal.activeTcs == tcs && tcs.Task.Status == UniTaskStatus.Pending)
|
||||
|
||||
@@ -55,6 +55,8 @@ namespace UVC.UI.Tooltip
|
||||
|
||||
protected string tooltipPrefabPath = "Prefabs/UI/Tooltip/Tooltip";
|
||||
|
||||
protected GameObject tooltipPrefab;
|
||||
|
||||
/// <summary>
|
||||
/// Resources 폴더 내의 툴팁 UI 프리팹 경로입니다.
|
||||
/// 상속을 통해 다른 경로를 사용하도록 재정의할 수 있습니다.
|
||||
@@ -111,9 +113,12 @@ namespace UVC.UI.Tooltip
|
||||
this.tooltipPrefabPath = tooltipPrefabPath; // 사용자 지정 경로가 제공되면 업데이트
|
||||
}
|
||||
|
||||
GameObject loadedTooltipPrefab = Resources.Load<GameObject>(this.tooltipPrefabPath);
|
||||
if (tooltipPrefab == null)
|
||||
{
|
||||
tooltipPrefab = Resources.Load<GameObject>(this.tooltipPrefabPath);
|
||||
}
|
||||
|
||||
if (loadedTooltipPrefab == null)
|
||||
if (tooltipPrefab == null)
|
||||
{
|
||||
Debug.LogError($"TooltipManager 초기화 실패: Resources 폴더에서 '{this.tooltipPrefabPath}' 경로의 프리팹을 로드할 수 없습니다.");
|
||||
return;
|
||||
@@ -123,7 +128,7 @@ namespace UVC.UI.Tooltip
|
||||
_rootCanvas = rootCanvas;
|
||||
|
||||
// 툴팁 인스턴스 생성 및 초기화
|
||||
_activeTooltipInstance = GameObject.Instantiate(loadedTooltipPrefab, _defaultParentTransform);
|
||||
_activeTooltipInstance = GameObject.Instantiate(tooltipPrefab, _defaultParentTransform);
|
||||
_tooltipTextElement = _activeTooltipInstance.GetComponentInChildren<TextMeshProUGUI>();
|
||||
_tooltipRectTransform = _activeTooltipInstance.GetComponent<RectTransform>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user