UI 구성
우측 하단에 탱크 포탄발사 버튼을 만든다.
버튼을 누르면 탱크는 포탄을 발사한다.
게임 상단에 Score 텍스트를 만든다.
Score는 게임 매니저의 스코어와 동일하게 표현되도록 한다.
(단, UI는 화면 해상도와 무관하게 정해진 위치에 자리해야 한다.)

UI는 다음과 같이 구성했다.
각 UI 구성요소들의 Rectangle을 이동시켜 해상도가 변하더라도 위치가 변하지 않게 만들었다.

Fire 버튼은 간단하게 이벤트로 포탑의 shot.Fire를 호출하도록 만들었다.
[SerializeField] TMP_Text ScoreText;
void OnEnable()
{
GameManager.OnScoreChanged += SetScoreText;
}
void OnDisable()
{
GameManager.OnScoreChanged -= SetScoreText;
}
void SetScoreText(int score)
{
ScoreText.text = score.ToString();
}
Score쪽 코드는 다음처럼 점수를 바꾸는 함수를 만들어 GameManager의 이벤트가 발생할때만 호출하도록 만들었다.
private int score;
public int Score
{get { return score; } set { score = value; OnScoreChanged?.Invoke(Score); } }
void Start()
{
Score = 0;
OnScoreChanged?.Invoke(Score);
}
GameManager에 추가한 코드.
Start시 스코어를 초기화하고 이벤트를 Invoke해 0점을 띄워주도록 만들었다.
그 이후엔 값에 변동이 있을때만 이벤트가 발생 할 것이다.

원하던 대로 잘 적용되었다.
에셋 스토어 사용
좌측 하단에 조이스틱 UI를 구성한다.
조이스틱을 움직이면 탱크는 이동한다.(이동 방식은 자유)
조이 스틱은 에셋스토어에 검색하여 사용한다.

먼저 에셋을 다운받는다.
위 무료 에셋을 사용하였다.

UI상에 조이스틱을 배치하고 코드를 살펴보자
해당 에셋은 Horizontal, Vertical이라는 변수가 조이스틱의 값을 저장하니 해당 값을 사용하도록 하자.
[SerializeField] Joystick joystick;
public Vector3 GetNormalizedDirection()
{
Vector3 direction = Vector3.zero;
direction.x = joystick.Horizontal;
direction.z = joystick.Vertical;
if (Input.GetKey(KeyCode.UpArrow))
{
direction.z += 1;
}
if (Input.GetKey(KeyCode.DownArrow))
{
direction.z -= 1;
}
if (Input.GetKey(KeyCode.LeftArrow))
{
direction.x -= 1;
}
if (Input.GetKey(KeyCode.RightArrow))
{
direction.x += 1;
}
return direction.normalized;
}
기존 탱크의 움직임을 담당하는 코드에서 조이스틱의 값을 넣는 코드를 추가한다.

아주 잘 동작한다.
씬 로딩
타이틀씬 구현(게임시작, 게임종료)
게임씬에 여러맵을 만들어서 이동시에 맵을 로딩하도록 구현

먼저 타이틀씬과 UI를 구성한다.
public class TitleManager : MonoBehaviour
{
public void StartButton()
{
SceneManager.LoadScene("Game");
}
}
TitleManager를 구성한다.
굳이 TitleManager까지 만들 이유는 없지만 후에 여러 기능이 생길수도 있으니 미리 만들어놓자.

Start 버튼 클릭 이벤트에 TitleManager.StartButton을 연결하자.

Title은 잘 구현되었다.
이번엔 맵과 맵 로딩을 구현하자.

다음처럼 맵 하나를 더 만들어 두 맵을 이어주자.

플레이어가 들어오면 맵을 로드할 충돌체를 만든다.
void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Player"))
{
SceneManager.LoadSceneAsync("GameMap2", LoadSceneMode.Additive);
}
}
void OnTriggerExit(Collider other)
{
if(other.CompareTag("Player"))
{
SceneManager.UnloadSceneAsync("GameMap2");
}
}
그리고 위 같은 코드를 적용시키면,

플레이어가 트리거에 닿을 때 맵을 로드하고 플레이어가 나가면 언로드하게 된다.