![header](https://camo.githubusercontent.com/24cf470a6c313e5807bdd827ca9cdc1c842ff9e1cc1280113e58cb0c40eda155/68747470733a2f2f63617073756c652d72656e6465722e76657263656c2e6170702f6170693f747970653d776176696e6726636f6c6f723d454443444242266865696768743d3330302673656374696f6e3d68656164657226746578743d504c414e2532304f522532305041494e26666f6e7453697a653d393026666f6e74436f6c6f723d464645444442)
📌 목차로 돌아가기 📌
![슬라이드19](https://private-user-images.githubusercontent.com/62470991/276802066-ee6f3766-6034-4bf9-b2b9-830e661f0dd3.PNG?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQxNzc4NjAsIm5iZiI6MTcyNDE3NzU2MCwicGF0aCI6Ii82MjQ3MDk5MS8yNzY4MDIwNjYtZWU2ZjM3NjYtNjAzNC00YmY5LWIyYjktODMwZTY2MWYwZGQzLlBORz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODIwVDE4MTI0MFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ0Mzk4YWY3ZTNjODNlOTQxODJjMzgxZDY3N2E0ZmExODk4ODJkYjJkY2M3ZjkxOTcxNWM3YjZlMDI4OWMyOGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Xkiqelq6N9AVdFbOZ9eZPhaV4cD5az4bYZhUYXA0klE)
📌 목차로 돌아가기 📌
🎥 Scene 설명서 목차로 돌아가기 🎥
기능 |
기능 설명 |
스크립트 |
메서드 |
게임 인트로 씬 |
관련된 BGM sound 재생 및 Playable Director 재생, Intro MainGameScene으로 진입할 수 있는 버튼을 표시한다. |
StartScene.cs |
Init() |
🎥 Scene 설명서 목차로 돌아가기 🎥
🎮 미니 게임 Scene 목차로 돌아가기 🎮
🎮 미니 게임 Scene 목차로 돌아가기 🎮
-
아르바이트를 하던 중, 문득 배가 고파졌다. 점장의 CCTV 감시와, 손님이 눈치채지 못하게 몰래 삼각김밥을 섭취해야하는 게임.
-
점장의 CCTV 감시는 화면상 왼쪽 아래 모니터로 알 수 있다.
-
손님은 또한 눈치챌 수 있는 범위를 지니고 있는데, 이 범위 밖에 있을 때만 삼각김밥을 섭취해야한다.
🎮 미니 게임 Scene 목차로 돌아가기 🎮
- 주어진 Node 탐색을 맵에 있는 Node들을 알맞은 순서로 활성화시켜야 하는 게임.
기능 |
기능 설명 |
스크립트 |
메서드 |
씬 스크립트 |
UI와 게임의 매니저를 가져와 씬을 시작한다. |
DevelopGameScene.cs |
|
미니게임 매니저 |
게임 로직과 Popup UI를 관리한다. |
DevelopGameManager.cs |
|
시도 횟수 카운트 |
맵에 있는 Node를 알맞은 순서로 모두 활성화시킬 때까지 시도한 횟수를 카운트한다. |
DevelopGameManager.cs |
UpdateTryCount() |
리스폰 |
맵의 특정 고도 이하로 떨어질 경우, 처음 시작 위치로 플레이어를 강제 이동한다. |
DevelopGameManager.cs |
Respawn() |
노드 관리 |
캐릭터가 활성화시키는 노드의 순서를 체크한다. |
Graph.cs |
|
노드 표시 |
캐릭터가 노드 주변에 있을 떄, (노드 주변에 노드보다 큰 투명한 collider 설정) 플레이어에게 해당 노드를 활성화 시킬 지 선택하게 하는 팝업을 표시한다. |
Node.cs |
|
충돌 감지 |
플레이어가 노드 주변에 있을 때를 감지한다. |
Node.cs |
OnTriggerEnter() |
🎮 미니 게임 Scene 목차로 돌아가기 🎮
- 주어진 시간 안에, 흔들리는 지형 속에서 최대한 용암에 닿지 않고 살아남아야 하는 게임.
🎮 미니 게임 Scene 목차로 돌아가기 🎮
- 자동차를 타고 운전하여 gym에 도착하는 DriveScene과 gym 에서 운동하는 미니게임을 포함한 gymScene 이상의 2가지 씬으로 구성되어있다.
기능 |
기능 설명 |
스크립트 |
메서드 |
씬 스크립트 |
UI와 게임의 매니저를 가져와 씬을 시작한다. |
DrivingScene.cs |
|
미니게임 매니저 |
게임 로직과 Popup UI를 관리한다. |
OutdoorGameManager.cs |
|
상호작용 인터페이스 |
상호작용 가능한 오브젝트를 관리하는 스크립트에 부착하기 위해 제작한 인터페이스 |
IInteractable.cs |
|
자동차 운전 |
자동차를 방향키로 운전하는 것을 구현한다. |
VehicleController.cs |
|
자동차 이동 구현(1) |
지정한 InputSystem에서 전해주는 방향벡터를 토대로 자동차 이동을 구현한다. |
VehicleController.cs |
OnDriveInput() |
자동차 이동 구현(2) |
자동차 바퀴들과 Wheel Collider들 각 4개의 transform.position을 동일하게 맞추고, Wheel Collider로 움직임과 방향을 조정한다. |
VehicleController.cs |
Move() |
자동차 위치 조정 |
자동차가 뒤집혔을 때, 처음의 위치로 자동차를 다시 구현한다. |
VehicleController.cs |
OnRespawn() |
gym 이동 |
화면에서 지정한 Interact Point 에서, 지정한 버튼을 눌렀을 때, gymScene으로 이동할 수 있음을 보여주는 UI를 표시한다. |
InteractGymPoint.cs |
|
gym 이동(2) |
지정한 버튼을 눌렀을 때, 1초 뒤에 gymScene을 로드한다. |
InteractGymPoint.cs |
LoadSceneCO() |
기능 |
기능 설명 |
스크립트 |
메서드 |
씬 스크립트 |
UI와 게임의 매니저를 가져와 씬을 시작한다. |
GymScene.cs |
|
인 게임 UI |
미니게임과 gym 필드에서 플레이어, 상호작용, 위치 조정등을 구현하는 UI |
GymMiniGameUI.cs |
|
플레이어 상호작용 |
플레이어와 충돌한 물체를 확인 후, 관련된 미니게임을 시작한다. |
GymMiniGameUI.cs |
OnInteract() |
미니게임 상호작용 |
미니게임에서 Space 버튼의 상호작용을 구현한다. |
GymMiniGameUI.cs |
OnSpace() |
플레이어 리스폰 |
플레이어가 최초 생성한 자리에서 재생성된다. |
GymMiniGameUI.cs |
OnRespawn() |
출입구 활성화 |
모든 미니게임이 진행되었는 지 여부를 확인하고, 충족되었다면 출입구를 활성화한다. |
GymMiniGameUI.cs |
UpdateDoorColliderCO() |
오브젝트 접촉 |
오브젝트와 접촉하여 특정 미니게임 UI를 불러온다. |
InteractGymMinigame.cs |
|
오브젝트 표시 (1) |
미니게임 UI와 연결된 오브젝트를 주황색 outline으로 강조한다. |
Outline.cs |
|
오브젝트 표시 (2) |
미니게임 UI와 연결된 오브젝트를 주황색 outline으로 강조하고, outline의 크기를 변화시킨다. |
InteractGymMinigame.cs |
BlinkOutlingCO |
오브젝트 상호작용 |
미니게임 UI와 연결된 오브젝트와 상호작용하여 GymMiniGameUI 에 자신의 정보를 전달한다. |
InteractGymMinigame.cs |
OnCollisionStay() |
러닝머신 미니게임 UI |
러닝머신 미니게임을 관리 및 진행하는 UI. 성공여부, 실패여부, 남은 시간, 요구 횟수 등을 표시한다. |
TreadmilMiniGameUI.cs |
|
힛 바 적용(1) |
미니게임의 힛 바를 space로 고정했을 때, 실패 혹은 성공여부를 판단한다. |
TreadmilMiniGameUI.cs |
OnHitBar() |
힛 바 적용(2) |
미니게임의 힛 바 움직임을 구현한다. |
TreadmilMiniGameUI.cs |
DropBarImageChangeCO() |
성공, 실패 적용 |
게임의 진행에 따라 성공과 실패했을 때의 상황을 구현한다. |
TreadmilMiniGameUI.cs |
SuccessHitCO() FailHitCO() |
스쿼트 미니게임 UI |
백스쿼트 미니게임을 관리 및 진행하는 UI. 성공여부, 실패여부, 남은 시간, 요구 횟수 등을 표시한다. |
BackSquatMiniGameUI.cs |
|
현재 점수 반영 UI |
화면 우측 상단에 해야할 일을 마칠 때마다, 별 이미지의 개수로써 현재 점수를 표시한다. |
StarUI.cs |
|
출입구 표시 |
모든 미니게임을 마친 후, 나가는 문을 강조한다. 나가는 문과 상호작용 시, 게임이 끝나고, End Popup을 표시한다. |
InteractGymToOutPoint.cs |
|
📌 목차로 돌아가기 📌
- 모든 UI는 UI_base를 상속받음.
- 모든 팝업을 상속하는 UI_basePopup 또한 UI_base를 상속받음.
- 각 씬별로 필요한 정보 (ex. 남은 시간, 현재 점수 ... etc)를 메서드로 구현한다.
- 각 씬별 UI는 상단의 "씬 별 설명" 의 인게임 UI 항목 참고 혹은 하단 표 참고.
UI_BasePopup
- 모든 팝업은 UI_BasePopup을 상속받음.
- UI_BasePopup은 다음의 필드값을 지니고 있음.
public class UI_BasePopup : UIBase
{
[SerializeField] protected Image _popupBackgroundImage;
[SerializeField] protected GameObject _contentTextObject;
protected TMP_Text _contentText;
protected virtual void Awake()
{
_contentText = _contentTextObject.GetComponent<TMP_Text>();
CloseUI();
}
//... 생략 ...
UI_Popup
- 인 게임 내에서 자주 쓰이는 팝업 정의.
- content 텍스트 및 버튼 오브젝트들을 GameObject로 저굥한 뒤, InitBind 함수 내에서 해당하는 Button과 TMP_Text를 연결.
- const values region 에서 팝업 사이즈와 관련된 상수 정의
- Global/Strings 에서 정의한 버튼 타입에 따른 텍스트를 부여한다.
public class UI_Popup : UI_BasePopup
{
//... 생략 ...
public delegate void Callback();
private Callback callbackConfirm;
private Callback callbackCancel;
private Callback callbackOk;
[SerializeField] private GameObject _confirmButtonObject;
[SerializeField] private GameObject _cancelButtonObject;
[SerializeField] private GameObject _okButtonObject;
private Button _confirmButton;
private Button _cancelButton;
private Button _okButton;
private TMP_Text _confirmButtonText;
private TMP_Text _cancelButtonText;
private TMP_Text _okButtonText;
protected override void Awake()
{
InitBind();
base.Awake();
}
//... 생략 ...
기능 |
메서드 |
기능 설명 |
데이터 연결 |
InitBind() |
연결된 버튼과 TMP_text, 버튼의 이벤트를 연결한다. |
데이터 연결 |
SetButtonActive() |
지정한 버튼 타입에 따라, 알맞은 게임오브젝트(버튼)를 활성화 혹은 비활성화시킨다. |
팝업 표시(1) |
ShowPopup() |
파라미터로 입력받은 버튼의 콜백마다 알맞은 버튼을 연결한다. Confirm 버튼, Cancel 버튼이 있는 팝업 (= cancel 콜백, confirm 콜백을 파라미터로 받음) |
팝업 표시(2) |
ShowPopup() |
파라미터로 입력받은 버튼의 콜백마다 알맞은 버튼을 연결한다. OK 버튼이 있는 팝업(= OK 콜백을 파라미터로 받음) |
팝업 표시(3) |
ShowPopup() |
파라미터로 입력받은 버튼의 콜백마다 알맞은 버튼을 연결한다. 버튼이 없는 알림 팝업 |
팝업 닫기 |
ClosePopup() |
버튼을 클릭할 시, 각 버튼에 연결되어 있는 콜백 메서드를 실행하고, 열려있는 팝업을 닫는다. |
팝업 지연 닫기 |
CloseUIWithDelay() |
1초 뒤에 UI를 닫는다. |
팝업 크기 및 텍스트 위치 조절 |
SetPopupAttributes |
파라미터로 받는 팝업 버튼의 종류에 따라, 버튼 크기와 텍스트 위치를 지정한다. |
📌 목차로 돌아가기 📌
필드값 |
기능 설명 |
_curSceneType |
현재 씬 |
_nextSceneType |
현재 씬이 LoadingScene일 경우 다음에 호출 될 씬 |
- 각 미니 게임들을 관리하는 미니 게임 매니저들을 Dictionary로 관리한다.
- 각 미니 게임의 플레이 여부와 엔딩 여부를 관리한다.
- 각 미니 게임간 Scene을 로드한다.
필드값 |
기능 설명 |
CurDay |
현재 요일을 결정한다. |
GameSceneDB |
모든 씬의 이름을 요소로 가지고 있는 배열. |
CurGame |
현재 플레이하고 있는 씬. |
RemainingGames |
아직 플레이 하지 않은 미니게임 씬을 key 값, 해당 미니게임의 아이콘 이미지 스프라이트의 이름을 value 값으로 가지고 있는 딕셔너리. |
UsingGames |
플레이한 미니게임 씬을 key 값, 해당 미니게임의 아이콘 이미지 스프라이트의 이름을 value 값으로 가지고 있는 딕셔너리. |
GameStars |
플레이 결과 (3점 만점) 에서 각 1점씩을 요소(1점 혹은 0점)로 하는 리스트. |
CurStar |
가장 최근에 플레이한 미니게임의 플레이 결과를 나타낸 int. |
IsGoodEnding |
GoodEnding 여부를 판단하는 bool. |
gameEnd |
모든 미니게임을 플레이해 엔딩씬으로 넘어가는지 여부를 판단하는 bool. |
_gameIconPath |
각 미니게임의 아이콘 이미지 스프라이트의 이름을 요소로 가진 배열 |
- 특정 UI 컴포넌트를 지닌 프리팹의 경로를 key값으로, UI 컴포넌트를 value값으로 하는 딕셔너리를 통해 UI 컴포넌트를 관리한다.
- 지정한 경로에서의 프리팹을 Instantiate 한 후, UI 컴포넌트를 가져온다.
- 이미지 소스의 경로를 key값으로 이미지 소스 Sprite을 value값으로 하는 딕셔너리를 통해, 리소스를 관리한다.
- 사운드 소스의 경로를 key값으로, 사운드 clip을 value 값으로 하는 딕셔너리를 통해, 사운드를 관리한다.
- AudioType 으로 지정한 오디오 클립의 타입에 따라 다른 방식으로 지정한 audioSource를 재생할 수 있다.
- audioSource에 상관없이 플레이 중인 사운드를 정지할 수 있다.
📌 목차로 돌아가기 📌
![image](https://private-user-images.githubusercontent.com/141595995/276680429-580d5c85-5c4b-47ef-8408-d22b894b1d20.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQxNzc4NjAsIm5iZiI6MTcyNDE3NzU2MCwicGF0aCI6Ii8xNDE1OTU5OTUvMjc2NjgwNDI5LTU4MGQ1Yzg1LTVjNGItNDdlZi04NDA4LWQyMmI4OTRiMWQyMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODIwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyMFQxODEyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNWJjYzgwMzQ1NTVmZmVkMjY3ZGViYWIxYjhiMWFiM2IyMGJiODg3MjIzZWRhYzYyYzMxYzRhZjExNGQ5MmYzJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.JOBZEN5gdFW-FE3AbxJBCdL5U-I5tZUc4sdQNz6kmj4)
-
지정한 버튼이 눌린다면, 눌린 형태 (Performed, Canceled, started) 까지 이벤트에 대한 콜백 함수로 사용하요 지정한 동작 수행.
-
각 게임 별로 동일한 플레이어를 사용하고 있고, 게임마다 필요한 Input System 이 다른 것은, 필요한 모든 이벤트를 저장한 후, 씬 별로 선택적으로 액션을 적용하여 구현함.
// Player.cs
public void EnableActions(params InputActions[] actionNames)
{
Input.OnDisable();
foreach (InputActions actionName in actionNames)
{
InputAction action = Input.InputActions.FindAction(actionName.ToString());
if (action != null)
action.Enable();
else
Debug.LogError($"{action} 는 존재하지 않습니다.");
}
}
![image](https://private-user-images.githubusercontent.com/141595995/276683275-797db143-13c2-44cf-8888-da2710edffa8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQxNzc4NjAsIm5iZiI6MTcyNDE3NzU2MCwicGF0aCI6Ii8xNDE1OTU5OTUvMjc2NjgzMjc1LTc5N2RiMTQzLTEzYzItNDRjZi04ODg4LWRhMjcxMGVkZmZhOC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODIwJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgyMFQxODEyNDBaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0wODY3YzVlOGFlOWE3ZWNkNmI5YmY3MzIzMjdkMmMyYTY0ZDhjOTRhY2JkZGYyOGIyOGE0Nzg0NzI5MzU1Njc4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.29fe3jwAdqE12r2rsVuT7CSo-Fl1pStpci7EYiX6Njk)
⭐ 목차로 돌아가기 ⭐