Home
fin.png

2017.12.10. Term Project Final Demo


            

Trailer

게임 다운로드

DownLoad

개발 결과 요약

유니티를 사용했으며 엔딩까지 모두 완성했다. 엔딩씬은 총 3개이다. 진 엔딩에 도달하려면, Day6 전, 3가지 조건이 충족되어야 한다. 이벤트는 모두 12가지가 있다. 모자, 머리, 턱수염, 눈을 3개씩 조합해 총 81가지 죄수를 랜덤으로 만들어 낸다. 라벨은 총 5가지로 Day가 지남에 따라 추가된다. 씬은 시작씬, 게임진행씬, 브리핑씬, 엔딩씬으로 나뉜다.

게임 진행

유저의 선택지는 키보드의 왼쪽 혹은 오른쪽 화살표 버튼을 눌러 죄수를 노동력으로 사용할 지, 샤워를 시킬 지 결정하는 두 가지이다. 매일 달라지는 규정집을 따라 게임오버 당하지 않고 엔딩을 보기위해 나아가면 된다.

게임 스토리

플레이어는 전쟁 중 자리가 공석이 된 포로 수용소에 임시 발령이 났다. 그 수용소에서 새로 들어오는 죄수들의 노동가능 여부를 따지는 의사로 일하게 된다.

게임 구성

유저가 아이히만의 무능력함을 직접 경험할 수 있도록 하고 싶었다. 두 가지 밖에 선택하지 못하는 상황과 수용소장이나 가족의 편지, 게임오버의 위협이 플레이어를 시스템이 원하는 대로 행동하도록 요구한다. 게임오버의 위협이 플레이어를 움직이는 동력이 되는 순간 플레이어는 무능력해진다. 또 으레 게임엔 정답이 존재하기 때문에 플레이어는 정답을 찾으려고 한다. 하지만 처음부터 정답을 규정집으로 명명하고 반대로 죄수들이 그것을 반박하는 구조를 띄어 규정집이라는 시스템이 요구하는 정답을 의심하게 한다. 권위와 죄수들의 유혹 사이의 갈등이 일어난다. 엔딩을 모두 보고 싶어하는 심리를 게임의 원동력으로 보아, 그것을 자극하기위해 엔딩에 도달하면 '1/3 Jail'같이 다른 엔딩도 있다는 메시지를 주었다.

Script

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CounterController : MonoBehaviour { public SpriteRenderer num1SpriteRenderer; public SpriteRenderer num2SpriteRenderer; int num1 = 0; int num2 = 0; Animator animator; public Sprite[] countnum; public int startCount; int tmp; void Start () { animator = gameObject.GetComponent(); } void Update () { num1SpriteRenderer.sprite = countnum[num1]; num2SpriteRenderer.sprite = countnum[num2]; num1 = (startCount - (startCount % 10)) / 10; num2 = startCount % 10; } void Count(int counternum) { tmp = counternum; animator.SetTrigger("Count"); Invoke("downCount", 0.23f); } void downCount() { startCount = tmp; } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class DayManager : MonoBehaviour { public int day = 1; public Text dayText; public Text sceneText; public Text regulationText; public string[,] workCondition; public int sceneNumber; public bool isDayScene; float t1; public GameObject prisoner; public GameObject regulation; public GameObject counter; public GameObject label; public Camera cam; public GameObject regulationBig; int gameWrongCount; //gameWrongCount이벤트 관련. public GameObject threatLetter1; public GameObject threatLetter2; public GameObject familyLetter; public GameObject letterTextBig; void DayStart() { Debug.Log("DayStart함수 시작."); //화면에 띄워진 것들 내리기. regulationBig.SetActive(false); letterTextBig.SetActive(false); cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); cam.SendMessage("StopMusic", SendMessageOptions.DontRequireReceiver); cam.GetComponent().clip = cam.GetComponent().bgm[6]; cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); switch (day) { //날마다 달라지는 규정집 조건의 text와 count를 설정. case 1: regulationText.text = "\tDay1 검사 규정집\n\n 1. 왼쪽 방향키를 눌러 죄수를 노동력으로 사용.\n 2. 오른쪽 방향키를 눌러 죄수를 소독실로 보냄.\n↓페이지를 넘기시오↓\n\n\n\n\n@\n\n" + " 3. 노란 라벨을 단 죄수들은 유전적 질병 감염이 의심되므로 빠짐없이 샤워시키시오.\n\n\n\n\n @ \n\n" + " 4. 파란 라벨을 단 죄수들은 별 다른 결함이 없으니 노동력으로 사용하시오."; regulation.GetComponent().tmpText = regulationText.text; GetComponent().restPrisonerCount = 15; counter.GetComponent().startCount = 15; workCondition = new string[1,2] {{"Label", "Label_Blue"}}; label.GetComponent().randomRangeMax = 2; break; case 2: regulationText.text = "\tDay2 검사 규정집\n\n 1. 왼쪽 방향키를 눌러 죄수를 노동력으로 사용.\n\n 2. 오른쪽 방향키를 눌러 죄수를 소독실로 보냄.\n\n\n\n@" + "\n\n 3. 노란 라벨을 단 죄수들은 유전적 질병 감염이 의심되므로 빠짐없이 소독하시오.\n\n\n\n\n\n\n\n@" + "\n\n 4. 파란 라벨을 단 죄수들은 별 다른 결함이 없으니 노동력으로 사용하시오.\n\n\n\n\n\n\n\n\n\n@" + "\n\n 5. 분홍 라벨을 단 죄수들은 면역결핍증후군 전염 예방을 위해 소독하시오."; regulation.GetComponent().tmpText = regulationText.text; GetComponent().restPrisonerCount = 18; counter.GetComponent().startCount = 18; workCondition = new string[1,2] {{"Label", "Label_Blue"}}; label.GetComponent().randomRangeMax = 3; break; case 3: regulationText.text = "\tDay3 검사 규정집\n\n 1. 왼쪽 방향키를 눌러 죄수를 노동력으로 사용.\n\n 2. 오른쪽 방향키를 눌러 죄수를 소독실로 보냄.\n\n\n\n@" + "\n\n 3. 노동력 부족으로, 오늘부터 노란 라벨을 단 죄수들을 노동력으로 사용하시오.\n\n\n\n\n\n\n\n@" + "\n\n 4. 파란 라벨을 단 죄수들은 별 다른 결함이 없으니 노동력으로 사용하시오.\n\n\n\n\n\n\n\n\n\n@" + "\n\n 5. 분홍 라벨을 단 죄수들은 면역결핍증후군 전염 예방을 위해 소독하시오.\n\n\n\n\n\n\n\n\n\n\n@" + "\n\n 6. 빨간 라벨을 단 죄수들은 수용소 내 분란 조장 소지가 있으므로 처리하시오."; regulation.GetComponent().tmpText = regulationText.text; GetComponent().restPrisonerCount = 25; counter.GetComponent().startCount = 25; workCondition = new string[2,2] {{"Label", "Label_Blue"}, {"Label", "Label_Yellow"}}; label.GetComponent().randomRangeMax = 4; break; case 4: regulationText.text = "\tDay4 검사 규정집\n\n 1. 왼쪽 방향키를 눌러 죄수를 노동력으로 사용.\n\n 2. 오른쪽 방향키를 눌러 죄수를 소독실로 보냄.\n\n\n\n@" + "\n\n 3. 노란 라벨을 단 죄수들은 노동력으로 사용하시오.\n\n\n\n\n\n\n\n@" + "\n\n 4. 파란 라벨을 단 죄수들은 별 다른 결함이 없으니 노동력으로 사용하시오.\n\n\n\n\n\n\n\n\n\n@" + "\n\n 5. 분홍 라벨을 단 죄수들은 면역결핍증후군 전염 예방을 위해 처리하시오.\n\n\n\n\n\n\n\n\n\n\n@" + "\n\n 6. 빨간 라벨을 단 죄수들은 수용소 내 분란 조장 소지가 있으므로 처리하시오.\n\n\n\n\n\n\n\n\n\n@" + "\n\n 7. 초록 라벨을 단 죄수들은 노동력으로 사용하시오."; regulation.GetComponent().tmpText = regulationText.text; GetComponent().restPrisonerCount = 25; counter.GetComponent().startCount = 25; workCondition = new string[3,2] {{"Label", "Label_Yellow"}, {"Label", "Label_Blue"}, {"Label", "Label_Green"}}; label.GetComponent().randomRangeMax = 5; break; case 5: regulationText.text = "\tDay5 검사 규정집\n\n 1. 왼쪽 방향키를 눌러 죄수를 노동력으로 사용.\n\n 2. 오른쪽 방향키를 눌러 죄수를 소독실로 보냄.\n\n\n\n@" + "\n\n 3. 오늘부터 노란 라벨을 단 죄수들을 처리하시오.\n\n\n\n\n\n\n\n@" + "\n\n 4. 오늘부터 파란 라벨을 단 죄수들을 처리하시오.\n\n\n\n\n\n\n\n\n\n\n@" + "\n\n 5. 분홍 라벨을 단 죄수들은 면역결핍증후군 전염 예방을 위해 처리하시오.\n\n\n\n\n\n\n\n\n\n@" + "\n\n 6. 빨간 라벨을 단 죄수들은 수용소 내 분란 조장 소지가 있으므로 처리하시오.\n\n\n\n\n\n\n\n\n\n\n\n@" + "\n\n 7. 초록 라벨을 단 죄수들은 노동력으로 사용하시오."; regulation.GetComponent().tmpText = regulationText.text; GetComponent().restPrisonerCount = 30; counter.GetComponent().startCount = 30; workCondition = new string[1,2] {{"Label", "Label_Green"}}; label.GetComponent().randomRangeMax = 5; break; case 6: regulationText.text = "\tDay6 검사 규정집\n\n 1. 오른쪽 방향키를 눌러 죄수를 죽이시오.\n\n\n\n\n\n@" + "\n 2. 노란 라벨을 단 죄수들을 죽이시오.\n" + "\n 3. 파란 라벨을 단 죄수들을 죽이시오.\n\n\n@" + "\n 4. 분홍 라벨을 단 죄수들을 죽이시오.\n" + "\n 5. 빨간 라벨을 단 죄수들을 죽이시오.\n\n\n\n@" + "\n 6. 초록 라벨을 단 죄수들을 죽이시오.\n"; regulation.GetComponent().tmpText = regulationText.text; GetComponent().restPrisonerCount = 25; counter.GetComponent().startCount = 25; workCondition = new string[1,2]; label.GetComponent().randomRangeMax = 5; GetComponent().isLastDay = true; break; } if(day!=1) { sceneNumber=1; t1 = Time.time + 1; isDayScene = true; DaySceneControl(); } else { DayTextOn(); } } void Update() { if(isDayScene && Input.anyKeyDown && Time.time - t1 > 1) { Debug.Log("DayScene 바꾸기."); sceneNumber++; t1 = Time.time; DaySceneControl(); } } public string daySceneMeanWord; void DaySceneControl() { Debug.Log("DaySceneControl 시작."); int workCount = gameObject.GetComponent().workCount; int showerCount = gameObject.GetComponent().showerCount; int wrongCount = gameObject.GetComponent().wrongCount; gameWrongCount = gameObject.GetComponent().gameWrongCount; switch (sceneNumber) { case 1: if(day == 7) //Trail Ending { sceneText.text = "" + "오늘 하루 할당량 " + (workCount + showerCount) + " 명 중\n" + showerCount + " 명을 " + daySceneMeanWord + "했습니다.\n\n" + "오늘도 어쩔 수 없이 규정을 잘 지켰습니다." + ""; cam.transform.position = new Vector3(25, 25, -2); break; } if(day == 2) daySceneMeanWord = "소독"; else if(day == 4) daySceneMeanWord = "처리"; else if(day == 6) daySceneMeanWord = "사형"; sceneText.text = "오늘 하루 할당량 " + (workCount + showerCount) + " 명 중\n" + workCount + " 명을 노동력으로 분류했고\n" + showerCount + " 명을 " + daySceneMeanWord + "했습니다.\n\n" + "규정을 오늘 " + wrongCount + " 번 어겨\n"+ "" + "총 " + gameWrongCount+ " 번 " + "" + "어겼습니다."; cam.transform.position = new Vector3(25, 25, -2); break; case 2: if(day == 7) { gameObject.SendMessage("EndingSceneStart", "Execution"); isDayScene = false; break; } else if(gameWrongCount > 10) //Jail Ending { gameObject.SendMessage("EndingSceneStart", "Jail"); isDayScene = false; break; } else if(gameObject.GetComponent().eventCheck[6] && gameObject.GetComponent().event6Count > 3 && gameObject.GetComponent().eventCheck[3]) { gameObject.SendMessage("EndingSceneStart", "Riot"); isDayScene = false; break; } if(day == 6) { sceneText.text = "" + "최후의 날" + "" + "이 밝았습니다.\n바뀐 규정을 확인하세요."; } else { sceneText.text = "다음 날이 밝았습니다.\n바뀐 규정을 확인하세요."; } break; case 3: sceneText.text = "A r b e i t m a c h t F r e i.\nH e i l m e i n F ü h r e r !\n"; sceneText.fontStyle = FontStyle.BoldAndItalic; break; default: //협박1 이벤트. if(gameWrongCount >= 3) { threatLetter1.SetActive(true); } //협박2 이벤트. if(gameWrongCount >= 6) { threatLetter2.SetActive(true); } //편지 이벤트. if(gameWrongCount >= 8) { familyLetter.SetActive(true); } isDayScene = false; sceneText.text = ""; sceneText.fontStyle = FontStyle.Normal; DayTextOn(); cam.transform.position = new Vector3(0, 0, -2); break; } } void DayTextOn() { cam.SendMessage("StopMusic", SendMessageOptions.DontRequireReceiver); cam.GetComponent().clip = cam.GetComponent().bgm[1]; cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); if(day == 6) { cam.SendMessage("StopMusic", SendMessageOptions.DontRequireReceiver); cam.GetComponent().clip = cam.GetComponent().bgm[2]; cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); } dayText.text = "D a y " + day; prisoner.SendMessage("Hide", SendMessageOptions.DontRequireReceiver); Invoke("DayTextOff", 3); } void DayTextOff() { dayText.text = ""; day++; SendMessage("IsStart", SendMessageOptions.DontRequireReceiver); } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Determine : MonoBehaviour { public bool[] eventCheck = new bool[6]; public bool isInEvent; public bool canControl = false; public Animator lineAnimator; public GameObject line; public GameObject label; public GameObject prisoner; public Text prisonerText; public GameObject counter; public bool isStart = false; public bool isLastDay = false; public string[,] workCondition; public float t1 = 0f; public int restPrisonerCount; //남은 죄수 할당량. public int showerCount; //소독하러 간 죄수의 수. public int workCount; //노동하러 간 죄수의 수. public int wrongCount; //틀린 판단의 갯수. public int gameShowerCount; public int gameWorkCount; public int gameWrongCount; public int event6Count = 0; public string chose; void IsStart() // 분류가 가능해짐. { workCount = 0; showerCount = 0; wrongCount = 0; lineAnimator.SetTrigger("Move"); //라인 움직임. line.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); label.SendMessage("Labeling", SendMessageOptions.DontRequireReceiver); //라벨 생성. prisoner.GetComponent().Invoke("Show", 1.55f); //1.55초 후 죄수가 나타남. 라인 애니메이션 끝남에 맞춰 나옴. isStart = true; //키보드 입력을 받을 수 있게 됨. workCondition = gameObject.GetComponent().workCondition; //DayManager로 부터 오늘의 일하는 죄수의 조건을 받음. t1 = Time.time; } void Update() // 키 입력 { if(isStart && !isInEvent) { if (Time.time - t1 > 2.2) //2.5초 마다 버튼 누르기 가능 { if(!isLastDay && Input.GetKeyDown(KeyCode.LeftArrow)) //왼쪽 { //Debug.Log("일"); chose = "Work"; Discrimination("Work"); //맞는 선택인지 판단. Invoke("newPrisonerSituationEvent", 2); } else if(Input.GetKeyDown(KeyCode.RightArrow)) //오른쪽 { //Debug.Log("샤워"); chose = "Shower"; Discrimination("Shower"); Invoke("newPrisonerSituationEvent", 2); } } } else if(canControl) { if(Input.GetKeyDown(KeyCode.LeftArrow)) //왼쪽 { //Debug.Log("일"); chose = "Work"; Discrimination("Work"); //맞는 선택인지 판단. } else if(Input.GetKeyDown(KeyCode.RightArrow)) //오른쪽 { //Debug.Log("샤워"); chose = "Shower"; Discrimination("Shower"); } } } void Discrimination(string determine) //결정이 맞는지 판단. { canControl = false; Debug.Log("Discrimination 함수 작동."); if(determine == "Work") { Debug.Log("조건 길이: " + workCondition.Length); for(int i = 0; i < workCondition.Length/2;> i++) { Debug.Log("조건 : " + workCondition[i, 1]); switch (workCondition[i, 0]) { case "Label": if(workCondition[i, 1] == label.GetComponent().sprite.name) //일하는 조건에 있으면 return. { wrongCount--; i=99999; break; } break; case "Sex": break; case "Age": break; case "Weight": break; default: break; } } wrongCount++; } else if(determine == "Shower") { Debug.Log("조건 길이: " + workCondition.Length); for(int i = 0; i < workCondition.Length/2;> i++) { Debug.Log("조건 : " + workCondition[i, 1]); switch (workCondition[i, 0]) { case "Label": if(workCondition[i, 1] == label.GetComponent().sprite.name) //일하는 조건에 있으면 ++. { wrongCount++; } break; case "Sex": break; case "Age": break; case "Weight": break; default: break; } } } //결정 끝낸 뒤 이벤트 finishPrisonerSituationEvent(); } void newPrisonerSituationEvent() { //Event 1. if(!eventCheck[1] && GetComponent().day-1 == 2 && restPrisonerCount < 12> && label.GetComponent().sprite.name == "Label_Yellow" && restPrisonerCount != 0) { //Day2의 처자식 호소.\ Debug.Log("처자식 호소 이벤트."); isInEvent = true; EventMessage(1); eventCheck[1] = true; } //Event 4. else if(!eventCheck[4] && GetComponent().day-1 == 4 && label.GetComponent().sprite.name == "Label_Red" && restPrisonerCount != 0) { Debug.Log("군 장교 이벤트."); isInEvent = true; EventMessage(4); eventCheck[4] = true; } } void finishPrisonerSituationEvent() { //Event 0. if(!eventCheck[0] && GetComponent().day-1 == 1 && restPrisonerCount < 8> && label.GetComponent().sprite.name == "Label_Yellow" && chose == "Shower") { //Day1의 난 병에 걸리지 않았어!\ Debug.Log("병에 걸리지 않았어 이벤트."); isInEvent = true; EventMessage(0); eventCheck[0] = true; } //Event 1- 2, 3. else if(eventCheck[1] && !eventCheck[2] && !eventCheck[3] && isInEvent) { //Day2의 처자식 호소의 샤워선택. 1 if(chose == "Shower") { EventMessage(2); eventCheck[2] = true; }//노동선택 else if(chose == "Work") { EventMessage(3); eventCheck[3] = true; } } //Event 4- 5, 6. else if(eventCheck[4] && !eventCheck[5] && !eventCheck[6] && isInEvent) { //군 장교 샤워 if(chose == "Shower") { EventMessage(5); eventCheck[5] = true; } //군 장교 노동 else if(chose == "Work") { EventMessage(6); eventCheck[6] = true; } } //Event 9. else if(eventCheck[6] && chose == "Work" && label.GetComponent().sprite.name == "Label_Red" && event6Count<4> && !isInEvent) { //군장교 친구 살릴시. isInEvent = true; EventMessage(9); event6Count++; } //Event 7. else if(!eventCheck[7] && GetComponent().day-1 == 5 && restPrisonerCount < 20> && chose == "Work" && !isInEvent) { //Day5의 노동선택 뒤 죽음의 천사. isInEvent = true; EventMessage(7); eventCheck[7] = true; } //Event 8. else if(!eventCheck[8] && GetComponent().day-1 == 3 && chose == "Shower" && !isInEvent) { //Day3의 샤워선택 뒤 ... . isInEvent = true; EventMessage(8); eventCheck[8] = true; } //Event 10. else if(!eventCheck[10] && (GetComponent().day-1 == 5 || GetComponent().day-1 == 3) && label.GetComponent().sprite.name == "Label_Pink" && chose == "Shower" && !isInEvent) { //Day 5 나 3에 동성애자의 생각. isInEvent = true; EventMessage(10); eventCheck[10] = true; } //Event 11. else if(!eventCheck[11] && GetComponent().day-1 == 6 && !isInEvent && restPrisonerCount == 1) {//최후의 날. 마지막 사람. 정말 어쩔 수 없었다고 생각해? isInEvent = true; EventMessage(11); eventCheck[11] = true; } //Event 12. else if(!eventCheck[12] && GetComponent().day-1 == 6 && Random.Range(1, 7) == 3 && !isInEvent) {//최후의 날 엄마 찾는 사람. isInEvent = true; EventMessage(12); eventCheck[12] = true; } else if(chose == "Work") { //Debug.Log("노동 움직임."); //오브젝트로 ButtonPush 함수 실행 명령 뿌리기. label.SendMessage("ButtonPush", "Work"); //라벨 바꾸기. prisoner.SendMessage("ButtonPush", "Work"); // 죄수 움직이기. restPrisonerCount--; //남은 죄수 수 감소. counter.SendMessage("Count", restPrisonerCount); //카운트 애니메이션 작동 counter.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); workCount++; if(restPrisonerCount == 0) //할당량 끝내고선 라인 멈춤. { Debug.Log("이벤트 안걸리고 날짜 바꾸기. work"); isStart = false; gameShowerCount += showerCount; gameWorkCount += workCount; gameWrongCount += wrongCount; gameObject.GetComponent().Invoke("DayStart", 3); } else { lineAnimator.SetTrigger("Move"); //라인 움직이기 line.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); } //시간 기록 t1 = Time.time; } else if(chose == "Shower") { //Debug.Log("샤워 움직임."); label.SendMessage("ButtonPush", "Shower"); prisoner.SendMessage("ButtonPush", "Shower"); restPrisonerCount--; counter.SendMessage("Count", restPrisonerCount); counter.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); showerCount++; if(restPrisonerCount == 0) //할당량 끝내고선 라인 멈춤. { Debug.Log("이벤트 안걸리고 날짜 바꾸기. work"); isStart = false; gameShowerCount += showerCount; gameWorkCount += workCount; gameWrongCount += wrongCount; gameObject.GetComponent().Invoke("DayStart", 3); } else { lineAnimator.SetTrigger("Move"); //라인 움직이기 line.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); } //시간 기록. t1 = Time.time; } } void EventMessage(int eventCheckNumber) { //Debug.Log("이벤트 시작 들어옴."); gameObject.SendMessage("EventControllerStart", eventCheckNumber); } void EventSceneEnd() { //Debug.Log("이벤트 종료 후 움직임."); label.SendMessage("ButtonPush", chose); prisoner.SendMessage("ButtonPush", chose); restPrisonerCount--; if(chose == "Shower") showerCount++; else { workCount++; } counter.SendMessage("Count", restPrisonerCount); counter.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); if(restPrisonerCount == 0) //할당량 끝내고선 라인 멈춤. { Debug.Log("이벤트 씬 종료 후 날짜 바꾸기"); isStart = false; gameShowerCount += showerCount; gameWorkCount += workCount; gameWrongCount += wrongCount; gameObject.GetComponent().Invoke("DayStart", 3); } else { lineAnimator.SetTrigger("Move"); //라인 움직이기 line.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); } //시간 기록. t1 = Time.time; isInEvent = false; } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class EndingSceneController : MonoBehaviour { float t1; public int sceneNumber; public Camera cam; public Text sceneText; public string sceneName; public Sprite[] endingSceneSprite; public SpriteRenderer endingSceneSpriteRenderer; public bool isEnding = false; void Update () //Scene을 최소 2초 동안 잡아 둠. { if(isEnding && Input.anyKeyDown && Time.time - t1 > 2) { sceneNumber++; t1 = Time.time; EndingSceneControl(); } } void EndingSceneStart(string name) { Debug.Log("엔딩씬 시작."); sceneName = name; isEnding = true; sceneNumber = 1; t1 = Time.time; EndingSceneControl(); } void EndingSceneControl() { Debug.Log("엔딩씬 컨트롤 들어옴."); switch (sceneName) { case "Riot": switch (sceneNumber) { case 1: cam.SendMessage("StopMusic", SendMessageOptions.DontRequireReceiver); cam.GetComponent().clip = cam.GetComponent().bgm[3]; cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); sceneText.text = "\n\n\n\n수용소 내 폭동이 일어났습니다."; break; case 2: sceneText.text = "\n\n\n\n많은 죄수가 죽었지만, 어쨌거나 극소수의 죄수들이 자유를 얻었습니다."; break; case 3: endingSceneSpriteRenderer.sprite = endingSceneSprite[0]; sceneText.text = "\n\n\n\n서둘러 가족에게 돌아가 봐야겠습니다."; break; case 4: sceneText.text = "\n\n\n\nA r b e i t m a c h t F r e i.\n( 노 동 이 그 대 를 자 유 케 하 리 라 . )\n"; sceneText.fontStyle = FontStyle.BoldAndItalic; break; case 5: sceneText.text = "\n\n\n\n1 / 3\nR i o t 엔 딩 ."; break; case 6: sceneText.fontStyle = FontStyle.Normal; sceneText.text = "\n\n\n\n제작\n경희대학교 소프트웨어융합학과 한동현\n경희대학교 소프트웨어융합학과 이종범\n" + "소프트웨어융합개론 텀 프로젝트"; break; case 7: sceneText.text = "\n\n\n\n본 게임의 모든 내용은 허구입니다."; break; case 8: sceneText.text = "\n\n\n\n플레이 해주셔서 감사합니다."; break; default: Application.LoadLevel(Application.loadedLevel); break; } break; case "Jail": switch (sceneNumber) { case 1: endingSceneSpriteRenderer.sprite = endingSceneSprite[1]; cam.SendMessage("StopMusic", SendMessageOptions.DontRequireReceiver); cam.GetComponent().clip = cam.GetComponent().bgm[4]; cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); sceneText.text = "\n\n\n\n\n규정을 너무 많이 어겨\n반역 혐의로 수감되었습니다."; break; case 2: sceneText.text = "\n\n\n\n\n가족들은 전부 수용소에 끌려갔습니다."; break; case 3: sceneText.text = "\n\n\n\n\n\nA r b e i t m a c h t F r e i.\nH e i l m e i n F ü h r e r !"; sceneText.fontStyle = FontStyle.BoldAndItalic; break; case 4: sceneText.text = "\n\n\n\n\n2 / 3\nJ a i l 엔 딩 ."; break; default: Application.LoadLevel(Application.loadedLevel); break; } break; case "Execution": switch (sceneNumber) { case 1: cam.SendMessage("StopMusic", SendMessageOptions.DontRequireReceiver); cam.GetComponent().clip = cam.GetComponent().bgm[5]; cam.SendMessage("PlayMusic", SendMessageOptions.DontRequireReceiver); sceneText.text = "\n\n\n\n\n최후의 날 이후 국가가 전쟁에서 패배했습니다."; break; case 2: endingSceneSpriteRenderer.sprite = endingSceneSprite[2]; sceneText.text = "\n\n\n\n\n당신은 군사재판에서 " + "" + "사형" + "" + "을 선고받았습니다."; break; case 3: sceneText.text = "\n\n\n\n\n가족들이 생각납니다."; break; case 4: sceneText.text = "\n\n\n\n\nH e i l m e i n F ü h r e r .\n( 우 리 총 통 만 세 . )"; sceneText.fontStyle = FontStyle.BoldAndItalic; break; case 5: sceneText.text = "\n\n\n\n\n3 / 3\nE x e c u t i o n 엔 딩 ."; break; default: Application.LoadLevel(Application.loadedLevel); break; } break; default: break; } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class EventController : MonoBehaviour { float t1; int sceneNumber; int eventCheckNumber; bool isEvent = false; public Text prisonerText; void Update () { if(isEvent && Input.anyKeyDown && Time.time - t1 > 1.5f) { t1 = Time.time; sceneNumber++; EventControllerScene(); } } void EventControllerStart(int number) { t1 = Time.time; Debug.Log("이벤트 컨트롤러 들어옴."); isEvent = true; eventCheckNumber = number; sceneNumber = 1; EventControllerScene(); } void EventControllerScene() { Debug.Log("이벤트 씬 시작."); //이벤트 씬 시작. switch(eventCheckNumber) { case 0: //Day1의 난 병에 걸리지 않았어! switch(sceneNumber) { case 1: prisonerText.text = "우린 병에 걸린게 아냐!"; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 1: //Day2의 처자식 호소. switch(sceneNumber) { case 1: prisonerText.text ="이봐."; break; case 2: prisonerText.text = "아까 샤워실에서 비명소릴 들었어."; break; case 3: prisonerText.text = "내겐 전쟁이 일어나고 한 번도 못 본 처자식이 있어..."; break; case 4: prisonerText.text = "내 아들... 한 번만 볼 수 있다면..."; break; case 5: prisonerText.text = "자네도 가족이 있겠지.\n제발 노동력으로 보내주게."; break; case 6: prisonerText.text = ""; GetComponent().t1 = Time.time - 1; GetComponent().canControl = true; break; default: prisonerText.text =""; break; } break; case 2: //Day2의 처자식 호소의 샤워선택. switch(sceneNumber) { case 1: prisonerText.text = "아아..."; break; case 2: prisonerText.text = "당신이 내 아들도 함께 죽인거야."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 3: //Day2의 처자식 호소의 노동선택 switch(sceneNumber) { case 1: prisonerText.text = "정말 고맙네."; break; case 2: prisonerText.text = "자네가 희망을 주는군..."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 4: //Day4의 군 장교 이벤트. switch(sceneNumber) { case 1: prisonerText.text ="이봐..."; break; case 2: prisonerText.text = "난 여기 들어오기 전\n군에서 장교로 활동했다네."; break; case 3: prisonerText.text = "지금은 포로로 잡혔지만\n밖에선 꽤 유능했어."; break; case 4: prisonerText.text = "내가 이곳에서 폭동을\n 이끌 수 있게 도와주게."; break; case 5: prisonerText.text = "이 악순환을 내가 반드시 끊겠네."; break; case 6: prisonerText.text = ""; GetComponent().t1 = Time.time - 1; GetComponent().canControl = true; break; default: prisonerText.text =""; break; } break; case 5: //군장교 이벤트 샤워 switch(sceneNumber) { case 1: prisonerText.text = "이런 XX! 인간같지도 않은 놈! "; break; case 2: prisonerText.text = "이 많은 죄 없는 사람들을\n 그냥 죽게 둘 셈이야!?"; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 6: //군장교 이벤트 노동 switch(sceneNumber) { case 1: prisonerText.text = "혁명의 동지로군!"; break; case 2: prisonerText.text = "앞으로 내 친구들 몇 명만\n 더 살려주면 되네. 우라!"; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 7: //Day 5 노동선택 후 죽음의 천사. switch(sceneNumber) { case 1: prisonerText.text = "네놈의 간단한 판단에 내가 사는군."; break; case 2: prisonerText.text = "쓰레기같은 놈.\n나머진 다 너가 죽이고 있는거야."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 8: //Day 3 샤워 선택 후 ... switch(sceneNumber) { case 1: prisonerText.text = "..."; break; case 2: prisonerText.text = "샤워실로..."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 9: //군 장교 노동 선택 후, 다른 빨간 라벨 노동할 시. switch(sceneNumber) { case 1: prisonerText.text = "За сталина...!\n우라!"; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 10: //분홍 라벨 호소. switch(sceneNumber) { case 1: prisonerText.text = "그거 알아?\n분홍 라벨 사람들은 다 동성애자일 뿐이야."; break; case 2: prisonerText.text = "우리가 왜 수용소에 있는 걸까?"; break; case 3: prisonerText.text = "너 같이 감정없는 인간말종은 당연히 받아들이겠지."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 11: //최후의 날. 마지막 사람. 정말 어쩔수 없었다고 생각해? switch(sceneNumber) { case 1: prisonerText.text = "정말 어쩔 수 없었다고 생각해?"; break; case 2: prisonerText.text = "..."; break; case 4: prisonerText.text = "'아무 것도 할 수 없는데, 어쩌란 건지.'"; break; case 5: prisonerText.text = "어쩔 수 없는게 아니라, 너가 이렇게 만든 거야."; break; case 6: prisonerText.text = "현실에서도 똑같아."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; case 12: //최후의 날. 엄마찾는 사람. switch(sceneNumber) { case 1: prisonerText.text = "죽고싶지 않아..."; break; case 2: prisonerText.text = "엄마..."; Invoke("EventControllerEnd", 2.3f); break; default: break; } break; } } void EventControllerEnd() { Debug.Log("이벤트 종료."); prisonerText.text =""; isEvent = false; gameObject.SendMessage("EventSceneEnd", SendMessageOptions.DontRequireReceiver); } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class ExitButtonPush : MonoBehaviour { void OnMouseDown() { Application.Quit(); } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class FamilyLetterControl : MonoBehaviour { public GameObject letterBig; public Text letterText; public Sprite FamilyLetter_Big; public string tmpText; int tmplength; void Start () { tmpText ="\n 사랑하는 당신에게.\n\n어제 집에 군인들이 들이 닥쳤어요.\n" + "당신이 반역자라며 집안을 다 부수고 협박을 했어요.\n\n" + "...당신\n\n당신이 정확히 무슨 일을 하고 있는지는 잘 모르지만,\n" + "제발 그들이 원하는 대로 해줘요.\n\n\n\n\n\n\n@" + "\n\n급한 일자리가 났다고 했을 때 말렸어야 했는데...\n\n" + "제발 무모한 일은 벌리지 말아요.\n우리 아이를 생각해요.\n\n사랑해요.\n\n 당신의 사랑으로부터."; } void OnMouseUp() { Debug.Log("가족편지 누름"); if(!letterBig.activeInHierarchy) { letterBig.GetComponent().sprite = FamilyLetter_Big; letterText.text = tmpText; letterBig.SetActive(true); tmplength = tmpText.Length; } //letterBig.color += new Color(0, 0, 0, -255); } void NextPage() { int length = letterText.text.Length; if(tmplength == length) { for(int i=0; i i++) { if(letterText.text[i] == '@') { letterText.text = letterText.text.Substring(i+1); tmplength = letterText.text.Length; break; } } } } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class LabelController : MonoBehaviour{ public SpriteRenderer labelSprite; public Sprite[] label; public int randomRangeMax; public int spriteChosing; void Start(){ Labeling(); randomRangeMax = 2; } void ButtonPush(string buttonName) { Debug.Log("라벨링."); //라벨 판별 //라벨 바꾸기 Labeling(); //라벨 숨기기 labelSprite.sortingLayerName = "Defalut"; } public void Labeling() { spriteChosing = Random.Range(0, randomRangeMax); if(spriteChosing == 0) { labelSprite.sprite = label[0]; } else if(spriteChosing == 1) { labelSprite.sprite = label[1]; } else if(spriteChosing == 2) { labelSprite.sprite = label[2]; } else if(spriteChosing == 3) { labelSprite.sprite = label[3]; } else if(spriteChosing == 4) { labelSprite.sprite = label[4]; } else if(spriteChosing == 5) { labelSprite.sprite = label[5]; } } void FinishMove(){ labelSprite.sortingLayerName = "Prisoner"; } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class ManController : MonoBehaviour { public SpriteRenderer hatSpriteRenderer; public SpriteRenderer faceSpriteRenderer; public SpriteRenderer headSpriteRenderer; public SpriteRenderer mustacheSpriteRenderer; public SpriteRenderer bodySpriteRenderer; public Sprite bodyfront; public Sprite bodyleft; public Sprite bodyright; public Sprite[] hatFrontSprit; public Sprite[] faceFrontSprit; public Sprite[] headFrontSprit; public Sprite[] mustacheFrontSprit; public Sprite[] hatLeftSprit; public Sprite[] faceLeftSprit; public Sprite[] headLeftSprit; public Sprite[] mustacheLeftSprit; public Sprite[] hatRightSprit; public Sprite[] faceRightSprit; public Sprite[] headRightSprit; public Sprite[] mustacheRightSprit; int hatnum = 0; int facenum = 0; int headnum = 0; int mustachenum = 0; int manmax = 3; int manstate = 1; void RandomMan() { hatnum = Random.Range(0, manmax); facenum = Random.Range(0, manmax); headnum = Random.Range(0, manmax); mustachenum = Random.Range(0, manmax); } void ManFront() { manstate = 1; } void ManLeft() { manstate = 2; } void ManRight() { manstate = 3; } void Update () { switch (manstate) { case 1: hatSpriteRenderer.sprite = hatFrontSprit[hatnum]; faceSpriteRenderer.sprite = faceFrontSprit[facenum]; headSpriteRenderer.sprite = headFrontSprit[headnum]; mustacheSpriteRenderer.sprite = mustacheFrontSprit[mustachenum]; bodySpriteRenderer.sprite = bodyfront; break; case 2: hatSpriteRenderer.sprite = hatLeftSprit[hatnum]; faceSpriteRenderer.sprite = faceLeftSprit[facenum]; headSpriteRenderer.sprite = headLeftSprit[headnum]; mustacheSpriteRenderer.sprite = mustacheLeftSprit[mustachenum]; bodySpriteRenderer.sprite = bodyleft; break; case 3: hatSpriteRenderer.sprite = hatRightSprit[hatnum]; faceSpriteRenderer.sprite = faceRightSprit[facenum]; headSpriteRenderer.sprite = headRightSprit[headnum]; mustacheSpriteRenderer.sprite = mustacheRightSprit[mustachenum]; bodySpriteRenderer.sprite = bodyright; break; default: break; } } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class PrisonerController : MonoBehaviour { Animator animator; Rigidbody2D rigidBody; public GameObject label; public GameObject gameManager; void Start() { animator = GetComponent(); rigidBody = GetComponent(); gameObject.SendMessage("RandomMan", SendMessageOptions.DontRequireReceiver); } void ButtonPush(string buttonName) { Debug.Log("죄수 움직임."); animator.SetBool("Moving", true); if(buttonName == "Shower") { gameObject.SendMessage("ManRight", SendMessageOptions.DontRequireReceiver); rigidBody.velocity = new Vector2 (7, 0); } else if(buttonName == "Work") { gameObject.SendMessage("ManLeft", SendMessageOptions.DontRequireReceiver); rigidBody.velocity = new Vector2 (-7, 0); } Invoke("ManChange", 1.3f); Invoke("FinishMove", 1.55f); } void ManChange() { gameObject.SendMessage("RandomMan", SendMessageOptions.DontRequireReceiver); } void FinishMove() { animator.SetBool("Moving", false); gameObject.SendMessage("ManFront", SendMessageOptions.DontRequireReceiver); rigidBody.velocity = new Vector2 (0, 0); transform.position = new Vector3 (0, 0, 0); label.SendMessage("FinishMove", SendMessageOptions.DontRequireReceiver); if(!gameManager.GetComponent().isStart) Hide(); } void Hide() { transform.position = new Vector3(0, 0, -30); } void Show() { transform.position = new Vector3(0, 0, 0); } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class RegulationController : MonoBehaviour { public GameObject regulationBig; public Text regulationText; public Sprite regulation_Big1; public Sprite regulation_Big2; public string tmpText; void Start () { } void Update () { } void OnMouseUp() { Debug.Log("규정집 누름"); if(!regulationBig.activeInHierarchy) { regulationBig.GetComponent().sprite = regulation_Big1; regulationText.text = tmpText; regulationBig.SetActive(true); } //regulationBig.color += new Color(0, 0, 0, -255); } void RegulationBigNextPage() { int length = regulationText.text.Length; for(int i=0; i i++) { if(regulationText.text[i] == '@') { regulationBig.GetComponent().sprite = regulation_Big2; regulationText.text = regulationText.text.Substring(i+1); break; } } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SoundManager : MonoBehaviour { public AudioSource audio; public AudioClip[] bgm; public AudioClip[] sound; public Sprite soundButtonOSprite; public Sprite soundButtonXSprite; public GameObject soundButton; void Start () { audio = gameObject.GetComponent(); } void PlayMusic() { audio.Play(); } void PauseMusic() { audio.Pause(); } void StopMusic() { audio.Stop(); } void MuteMusic() { audio.mute = true; } void UnMuteMusic() { audio.mute = false; } void AudioMute() { AudioListener.volume = 0; } void AudioUnMute() { AudioListener.volume = 1; } void SoundButtonPush() { if(soundButton.GetComponent().sprite == soundButtonOSprite) { soundButton.GetComponent().sprite = soundButtonXSprite; AudioMute(); } else { soundButton.GetComponent().sprite = soundButtonOSprite; AudioUnMute(); } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class StartButtonPush : MonoBehaviour { public Camera cam; public GameObject gameManager; public Text text; float t1; int textScene = 0; bool isStartScene; void OnMouseDown() { Debug.Log("스타트누룸"); textScene = 1; isStartScene = true; t1 = Time.time; StartSceneControl(); } void Update() { if(isStartScene && Input.anyKeyDown && Time.time - t1 >1.5f) { textScene++; t1 = Time.time; StartSceneControl(); } } void StartSceneControl() { switch (textScene) { case 1: text.text="당신은 전임자의 자리를 메꾸기 위해 OO수용소로 임시 발령났습니다.\n당신은 여기서 새로 수감되는 죄수들을 살펴보고\n 노동 가능 여부를 판단하는 의사로 근무하게 됩니다."; cam.transform.position = new Vector3(25, 25, -2); break; case 2: text.text = "근무에 대한 자세한 사항은\n책상 위에 놓인 규정집을 마지막 장까지 잘 살펴보십시오."; break; case 3: text.text = "\n갑작스런 발령에 당황스럽겠지만\n 규정에만 잘 따르면 아무 문제 없을 것입니다.\n국가가 지켜보고있습니다."; break; case 4: text.text = "A r b e i t m a c h t F r e i.\nH e i l m e i n F ü h r e r !\n"; text.fontStyle = FontStyle.BoldAndItalic; break; default: text.text = ""; text.fontStyle = FontStyle.Normal; cam.transform.position = new Vector3(0, 0, -2); gameManager.SendMessage("DayStart", SendMessageOptions.DontRequireReceiver); isStartScene = false; break; } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TheartLetter1Control : MonoBehaviour { public GameObject letterBig; public Text letterText; public Sprite Threat1_Big; public string tmpText; int tmplength; void Start () { tmpText ="\n\n자네 요즘 분류 과정에서 실수를\n좀 하고 있는거 같은데...\n\n" + "여기서 더 규정을 어긴다면\n반역을 의심을 받을 수도 있으니\n좀 더 신중히 근무하게." + "\n규정집만 잘 따르면 되는데 뭐가 어렵나?" + "\n\n또 5일만 지나면 최종 해결의 날이니까 말이야.\n\n\n\n\n\n\n\n\n" + "@\n아, 자넨 이번에 임시 발령났으니 잘 모르겠구만." + "\n\n뭐 깊은 사정은 알 것 없고 그때까지만 근무하면 되니\n그 전까지 실수 없도록 하게." + "\n\n수당은 그렇다 치고 반역죄라는건 무서운 거라고.\n 다 자네 생각해서 말해주는거야.\n\n-수용소장으로부터"; } void OnMouseUp() { Debug.Log("협박편지1 누름"); if(!letterBig.activeInHierarchy) { letterBig.GetComponent().sprite = Threat1_Big; letterText.text = tmpText; letterBig.SetActive(true); tmplength = tmpText.Length; } //letterBig.color += new Color(0, 0, 0, -255); } void NextPage() { int length = letterText.text.Length; if(tmplength == length) { for(int i=0; i i++) { if(letterText.text[i] == '@') { letterText.text = letterText.text.Substring(i+1); tmplength = letterText.text.Length; break; } } } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TheartLetter2Control : MonoBehaviour { public GameObject letterBig; public Text letterText; public Sprite threat2_Big1; public Sprite threat2_Big2; public string tmpText; int tmplength; void Start () { tmpText ="\n요즘 수용소가 혼란스럽군.\n자네 요즘 명백히 실수를 많이 하는거 같구만.\n" + "사실대로 말하자면 자넨 공식적으로 의심을 받고 있네.\n" + "\n만약 반역 혐의가 입증 된다면 자네 포함 가족 모두 수용소행이야.\n\n" + "어쨌든 조사가 들어갈테니 그렇게 알고 있게나.\n\n\n\n\n\n\n\n\n @" + "\n우선 근무에 신중하길 바라네.\n\n그런데 자네 정말 딴 생각 하는건 아니겠지?\n" + "가족을 생각한다면 당장 그만두게.\n\n자네가 짊어진 건 자네 한 사람 목숨뿐만이 아냐.\n\n-수용소장으로부터"; } void OnMouseUp() { Debug.Log("협박편지2 누름"); if(!letterBig.activeInHierarchy) { letterBig.GetComponent().sprite = threat2_Big1; letterText.text = tmpText; letterBig.SetActive(true); tmplength = tmpText.Length; } //letterBig.color += new Color(0, 0, 0, -255); } void NextPage() { int length = letterText.text.Length; if(tmplength == length) { for(int i=0; i i++) { if(letterText.text[i] == '@') { letterBig.GetComponent().sprite = threat2_Big2; letterText.text = letterText.text.Substring(i+1); tmplength = letterText.text.Length; break; } } } } }