Unity/IGDC 입문 프로젝트 13

12. 로비 제작, 게임 오버 시 돌아오게 만들기

로비를 제작하여 게임을 플레이하는 씬으로 넘어오게 하겠습니다. 새로운 씬 하나를 만들어줍니다. 그 후, UI의 Panel을 하나 만들어줍시다. Inspector에서 Image 컴포넌트의 Color 속성을 통해 색이나 투명도를 바꿀 수 있습니다. 버튼과 텍스트 하나씩 해서 간단하게 로비 씬을 만들어보았습니다. 그 후, 씬 이동 스크립트를 하나 만들어주고, 다음과 같이 작성해줍니다. using UnityEngine; using UnityEngine.SceneManagement; public class SceneMove : MonoBehaviour { public void GoToBattleScene() { SceneManager.LoadScene("SampleScene"); } } LoadScene 안에 파..

11. 타워 업그레이드 및 제거 기능 구현

IGDC 입문 프로젝트입니다. 이번에는 타워의 업그레이드와 제거 기능을 구현해봅시다. PanelButtonClick.cs에서 UpgradeButtonClick 함수와 RemoveButtonClick 함수는 본문이 비어있는 상태지요. 이 안을 채워봅시다. UpgradeButtonClick 함수는 BuildButtonClick 함수를 복사-붙여넣기한 후, 값 변경 및 일부 코드만 추가로 작성해주면 됩니다. public void UpgradeButtonClick() { if (!site.transform.GetChild(1).gameObject.activeSelf) { Debug.Log("업그레이드 전에 타워를 건설해야 합니다"); return; } if (!gameManager.CanUseCost(15)) ..

10.5 - 버튼 클릭 수정

'10. 에러 수정'의 2번 문제 해결을 위한 글입니다. 2번 문제가 저대로 수정이 된 줄 알았지만, 오히려 빈 곳을 눌러도 버튼이 안 사라지거나 인식이 안 되는 경우가 생겼습니다. 게다가 기존 SiteClick.cs는 모든 공격타워에게 붙어서 계속 Update를 호출하기 때문에 비효율적이라 생각했습니다. 따라서 이 글에서는 SiteClick.cs를 대신할 새 스크립트를 하나 만들겁니다. 우선은 모든 타워에 붙어있는 SiteClick 컴포넌트를 제거합니다. 그리고 저는 SiteClick2 스크립트를 만들었습니다. 만든 스크립트는 MainCamera에 붙여줬습니다. using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSys..

10. 에러 수정

IGDC 입문 프로젝트입니다. 지난 글 마지막에서 발생한 에러 몇 가지를 정리했습니다. 추가로 몇 가지 에러가 더 발생할텐데요, 정리해보면, 건설 이후에 건물을 클릭해도 UI가 다시 뜨지 않습니다. 건물 부지를 클릭해 UI를 띄운 후, 다른 곳을 클릭하면 사라지지만, 다른 곳 대신 다른 부지를 클릭하면? 얼레? 갑자기 게임이 멈춰요 (하단 참조) 1번 문제 해결하기 1번 문제의 경우는 위 그림과 같이 Sphere Collider가 Box Collider를 아예 애워싸기에 정작 클릭을 감지할 BoxCollider가 감지하지 못하는 경우 같습니다. 원기둥 형태의 콜라이더를 사용하면 좋지만... Unity에서는 원기둥 형태의 콜라이더를 지원하지 않습니다. 물론 다른 방식을 통해 구현을 할 수는 있지만, 우리는..

9. 공격 타워 배치 및 Cost 기능 구현

IGDC 입문 프로젝트입니다 Site를 눌렀을 때, 아래 사진과 같이 버튼이 나오도록 구현을 해봅시다. Button들을 생성해봅시다. 하이어리키창에서 우클릭 > UI > Legacy > Button으로 생성할 수 있습니다. 다음과 같이 Button과 자식으로 Text가 생성되었습니다. Text의 Text 컴포넌트에서 글씨를 넣을 수도 있고, 그 외의 몇 가지 스타일을 제공합니다. UI는 Transform이 아닌 RectTransform이 붙어있는데요, 좌측에 사각형이 있습니다. Anchor Presets라는 것인데요, 아래 접은 글에서 간단히만 설명하겠습니다. 이 아이의 위치를 옮기려고 보면, Transform이 아닌 Rect Transform이 붙어있는 것을 볼 수 있습니다. 게다가 Anchor Pre..

8. 공격 타워 구현

IGDC 입문 프로젝트입니다. 몬스터들이 침략하여 타워까지 도달하여 게임오버를 지난 글에서 구현했습니다. 당하고만 있을 순 없습니다! 공격 타워를 세워 몬스터들로부터 방어해봅시다. 우선 다음 에셋을 프리팹으로 만듭니다. (towerSquare_sampleB) 일단은 임의로 배치를 먼저 하도록 합시다. 배치를 한 후, Rigidbody와 Sphere Collider를 붙였습니다. Radisu를 통해 충돌 영역의 반지름을 조절할 수 있습니다. 이 타워도 Rigidbody의 Use Gravity 체크를 해제합니다. 그리고 AttackTower 스크립트를 생성합니다. using System.Collections.Generic; using System.Linq; using UnityEngine; public cl..

7. GameOver 알림

IGDC 입문 프로젝트입니다. 몬스터가 침략했습니다! 그럼 게임오버가 있어야겠죠? 특정 수의 몬스터가 타워에 도달할 경우 게임오버가 되는 것으로 만들어보겠습니다. AllyTower 스크립트를 만들어보겠습니다. 그 다음, 아래 코드를 클래스 안에 넣어줍니다. private int hp; public int Hp { get { return hp; } set { hp = value; if (hp 하단의 Add Tag... 클릭 > '+' 버튼을 눌러 Tag를 하나 추가해줍니다 > 다시 타워를 선택하고 Tag를 누르면 AllyTower를 설정할 수 있습니다. 로직은 여기까지 작성해보겠습니다. GameDatas 오브젝트에 TowerHp를 저는 3으로 설정했습니다. 실행시키면, 3명이 도착했을 때, 콘솔 창에 "게..

6. 몬스터 스폰 및 이동

IGDC 입문 프로젝트입니다. 몬스터를 스폰시키고 타워까지 이동시켜보겠습니다. 스폰포인트를 먼저 만듭시다. 타워의 반대편에 Resources > monster 폴더에 있는 석관 에셋을 배치해줍시다. 높이(y)는 0.2로 맞춰주세요. 그 다음 EnemySpawn이라는 스크립트를 하나 생성합니다. 그리고 다음과 같이 작성해봅시다. using UnityEngine; public class EnemySpawn : MonoBehaviour { public GameObject monster; private void Start() { InvokeRepeating(nameof(Spawn), 1f, 2f); } void Spawn() { Instantiate(monster, transform.position, Quate..

5. Vector, Transform

IGDC 입문 프로젝트입니다. 스크립트를 작성하기 전, Transform과 Vector에 대해 알아봅시다. Transform은 모든 오브젝트에 기본적으로 붙어있는 컴포넌트로, position, rotation, scale 속성을 가지고 있습니다. Cube를 하나 꺼내온 후, 이동시켜봅시다. Cube에는 Rigidbody가 붙어있어야 합니다. 그리고 이전에 만든 Cube 스크립트도 하나 붙여줍시다. 없다면 새로 만들어도 무방합니다. 스크립트를 아래와 같이 수정합니다. 코드 아래부터 하나하나 코드를 살펴봅시다. using UnityEngine; public class Cube : MonoBehaviour { public float speed; void Update() { float h = Input.GetA..

4. 맵 만들기

IGDC 입문 프로젝트입니다, 맵을 만들기 위해 필요한 아래 파일을 우선 다운받습니다. 에셋의 출처는 다음과 같습니다. https://kenney.nl/assets/graveyard-kit https://kenney.nl/assets/tower-defense-kit 파일의 압축을 풀고, map, tower, monsters 세 폴더를 유니티 에디터 안의 Resources 폴더 안에 넣습니다. Resources > map 에서 tile이라는 3d 오브젝트를 하나 선택합니다. 그 다음, 드래그하여 게임 씬이나 하이어리키 창에 놓습니다. 끌어다 놓으면 위치가 예쁘지 않습니다. 게다가 아무 위치에나 있군요. 이 상태로는 맵 배치가 귀찮아질 수 있으니, 위치를 모두 0으로 초기화해 줍시다. 이 타일을 복사하여 맵..