이전까지 한 것을 그대로 두고 play를 한 후 Button을 클릭하게 되면 버튼이 클릭되는 것을 알 수 있다. 그러나 버튼이 클릭만 될뿐 아직 어떠한 아무기능도 연결을 해주지 않았기에 아무 일도 일어나지 않는다.

위와 같이 기존에 Canvas라는 오브젝트를 UI_Button으로 이름을 변경해 준 후에 Assets -> Scripts에 UI라는 폴더를 만든 후에 UI_Button이라는 파일을 만들고 그 파일을 UI_BUtton에 연결해준다.
이때 Canvas 즉, 지금은 UI_button이름을 가진 오브젝트는 하나의 프리팹으로 저장해서 필요할 때 마다 불러서 사용되는 형식으로 사용되어진다.
예를 들어, 게임을 하다가 esc를 눌러 환경설정을 들어갔을 때 미리 만들어준 setting_Canvas프리팹을 화면에 띄워주고 다시 esc를 누르면 화면에서 사라지게 하는 역할로 사용할 수 있다.
using UnityEngine;
public class UI_Button : MonoBehaviour
{
public void OnButtonClicked()
{
Debug.Log("ButtonClicked");
}
}
위와 같이 코드를 입력한다. 그 이후에

위의 사진과 같이 On Click()카테고리에 방금 만든 script와 그 안에 만든 함수인 OnButtonClicked()를 설정해 준다.
그 후에 실행을 해주면

콘솔창에 잘 나오는 것을 볼 수 있다.
그러나 이렇게 해도 지금 현재에선 Button을 클릭해도 캐릭터가 UI쪽의 바닥에 ray를 쏜 후 그곳으로 이동하는 것을 알 수 있다.
InputManager.cs에서 UI를 클릭하든 말든 계속 이벤트를 발생시키기 때문
using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class InputManager
{
public Action KeyAction = null;
public Action <Define.MouseEvent> MouseAction = null;
bool _pressed = false;
public void OnUpdate()
{
if (EventSystem.current.IsPointerOverGameObject())
return;
if (Input.anyKey && KeyAction !=null)
KeyAction.Invoke();
if (MouseAction != null)
{
if(Input.GetMouseButton(0))
{
MouseAction.Invoke(Define.MouseEvent.Press);
_pressed = true;
}
else
{
if(_pressed)
MouseAction.Invoke(Define.MouseEvent.Click);
_pressed = false;
}
}
}
}
using UnityEngine.EventSystems;
public void OnUpdate()
{
if (EventSystem.current.IsPointerOverGameObject())
return;
}
아래의 코드들을 추가시켜준다.
이렇게되면 Button을 클릭하게 되면 케릭터가 Button을 클릭한 쪽으로 이동하지 않게 된다.

현재 위와 같이 씬이 구성이 되어있는데 Button을 클릭하면 위의 점수가 1점, 2점... 점점 오르게 만드려고 한다.
텍스트를 바꿔주시 위해서는 OnButtonClicked()가 실행된 부분에서 텍스트에 접근을 해줘야하는데 어떤 코드에서 다른 객체를 찾아 건네주는 것은 항상 고민이다.
가장 쉬운 것은 툴로 이어주는 것이다.
아래와 같이 [serializeField]라는 것을 사용하면 inspector에 추가한 변수가 생기고 그것을 통해 연결하는 것이다.
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class UI_Button : MonoBehaviour
{
[SerializeField]
TextMeshProUGUI _text;
int _score = 0;
public void OnButtonClicked()
{
_score++;
_text.text = $"점수 : {_score}점";
}
}
위와 같이 코드를 작성한다.
이렇게 코드를 작성하게 되면 UI_Button(GameObject)의 Inspector를 보게 된다면 Script를 add Component한 부분에 Text라는 칸이 생기게 되고 그곳에 현재 점수 : 0점 에 해당하는 Text(GameObject)를 수동으로 이어주면 된다.
그 이후에 play하여 Button을 눌러보면 정상적으로 텍스트가 변하게 된다.
void Start()
{
Managers.Resource.Instantiate("UI/UI_Button");
}
이 코드를 추가해 준다.
이렇게 되면 기존의 유니티짱으로 하던 3D게임 프로젝트를 play하게 되면 바로 방금 위에서 만든 것과 동일하게 Button이 있는 Canvas가 화면에 출력되게 된다.
현재 마우스 포인터가(또는 터치)가 UI(GameObject) 위에 있는지를 확인 하는 함수
즉, 마우스 클릭이나 터치 이벤트가 UI 위에서 발생했는지 체크할 때 사용한다.