실제로 플레이상에 변화는 없지만 코드 구조적으로 조정을 많이 했다.
UI 변경을 플레이어 컨트롤러에서 수행하는건 알맞지 않기에 MVVM 패턴을 참고해서 만들었다.
public class GameUIManager : MonoBehaviour
{
// 포커스 될때 호출할 이벤트
public UnityEvent<IFocusTarget> TargetFocusEvent;
}
public class FocusUI : MonoBehaviour
{
[SerializeField] Image _focusMarkUI; // 포커스 체크 이미지
[SerializeField] TextMeshProUGUI _focusTargetNameTxt; // 포커스 된 대상의 이름 텍스트
IFocusTarget _currentFocus;
private void Start()
{
// 포커스 이벤트를 구독합니다.
GameManager.UIManager.TargetFocusEvent.AddListener(FocusTarget);
}
private void Update()
{
if (_currentFocus != null)
// 포커스할 대상이 있다면
{
// 포커스 이미지를 대상 위치로 이동시키고, 대상을 바라봅니다.
Vector3 targetPos = _currentFocus.GetFocus().position;
_focusMarkUI.transform.position = Camera.main.WorldToScreenPoint(targetPos);
}
}
private void OnDestroy()
{
// 구독을 해제합니다.
GameManager.UIManager.TargetFocusEvent.RemoveListener(FocusTarget);
_focusMarkUI = null;
_focusTargetNameTxt = null;
_currentFocus = null;
}
// 포커스 대상을 변경한다.
private void FocusTarget(IFocusTarget focusTarget)
{
_currentFocus = focusTarget;
_focusTargetNameTxt.text = _currentFocus.GetName();
if (focusTarget.GetGameObject().CompareTag("Player"))
// 바라볼 대상이 플레이어라면
{
// 포커스할 대상은 없고, 포커스 이미지를 꺼줍니다.
_currentFocus = null;
_focusMarkUI.gameObject.SetActive(false);
}
else
// 바라볼 대상이 플레이어가 아니라면
{
// 포커스 대상을 변경하고, 포커스 이미지를 켜줍니다.
_currentFocus = focusTarget;
_focusMarkUI.gameObject.SetActive(true);
}
}
}
그리고 터치가 되는 UI는 태그를 걸어놔서 해당 UI밑에 포커스 오브젝트가 있다면 포커스 되지 않도록 수정했다.
'Portfolio > [개발일지] 3DRPG' 카테고리의 다른 글
| 작업중지 (0) | 2023.08.18 |
|---|---|
| #5) 개발일지 (0) | 2023.08.13 |
| #3) 대상을 포커싱 (0) | 2023.08.04 |
| #02) 캐릭터 이동과 카메라 (0) | 2023.08.02 |
| #01) 3D RPG 개발 목적 (0) | 2023.08.01 |