Player가 물체에 충돌했을때, 팝업창을 생성하고 싶었다.
평소에는 비활성화되어 있다가 ShowPopup가 실행되면 팝업창이 생성되며,
확인 버튼을 누르면 사라지는 스크립트이다.
마우스 커서 생성 및 게임이 멈췄을때 UI 입력이 가능해야했기에
EventSystem.current.UpdateModules(); 를 적용했다.
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class PopupController : MonoBehaviour
{
public GameObject popupPanel; // 팝업 패널을 연결
public Button confirmButton; // 확인 버튼을 연결
private void Start()
{
popupPanel.SetActive(false); // 초기에는 팝업을 비활성화
confirmButton.onClick.AddListener(OnConfirmButtonClicked);
}
public void ShowPopup()
{
popupPanel.SetActive(true);
// 게임을 일시정지시켜 플레이어 이동을 멈추게 할 수 있음
Time.timeScale = 0f;
// 마우스 커서를 활성화하고 잠금을 해제
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
}
private void OnConfirmButtonClicked()
{
popupPanel.SetActive(false);
// 게임을 재개
Time.timeScale = 1f;
// 마우스 커서를 비활성화하고 잠금을 활성화
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
}
private void Update()
{
if (popupPanel.activeSelf)
{
// Unscaled Time에 따라 UI 입력을 처리
EventSystem.current.UpdateModules();
}
}
}
Player 오브젝트에 Character Collider은 Is Trigger자체가 없어서
OnControllerColliderHit 메소드를 적용해야했다.
또한
using UnityEngine;
public class PlayerCollision : MonoBehaviour
{
public PopupController popupController; // PopupController 스크립트를 연결
private bool hasCollided = false; // 충돌 여부를 추적하는 플래그 변수
private void OnControllerColliderHit(ControllerColliderHit hit)
{
// 이미 충돌한 경우, 더 이상 실행하지 않음
if (hasCollided)
return;
// 특정 태그를 가진 오브젝트와 충돌했는지 확인
if (hit.gameObject.CompareTag("TriggerObject"))
{
// 팝업 창을 띄움
popupController.ShowPopup();
hasCollided = true; // 충돌했음을 기록
}
}
}
PlayerCollision 스크립트를 플레이어 오브젝트에 추가한다.
이때 Collider이나 Controller Component오브젝트가 있는곳에 추가해야한다.
난 PlayerArmature오브젝트에 Character Collider이 적용되었기에 이곳에 추가했다.
PopupController 스크립트를 Canvas나 UI를 관리하는 오브젝트에 추가한다.
PopupController 스크립트의 popupPanel과 confirmButton에 각각 Panel과 Button 오브젝트를 연결합니다.
PlayerCollision 스크립트의 popupController에 PopupController 스크립트를 추가한 오브젝트이 연결한다.
충돌 대상이 될 물체에 "TriggerObject" 태그를 한다