/*Quest와 관련된 object들을 관리하는 함수 * 한 talkData 안에 여러 스트링이 있잖아. * 그 중 몇번쨰 string에 특정 일이 일어날때를 관리하기 위해서 talkIndex를 받아옴. */ public void ControlObject() { switch (questId) { case 10: //Sindy에게 서류를 받자 /*조니가 자동으로 피트라에게 말을 건다*/ if (questActionIndex == 0 && manager.talkIndex == 0 && !state1) { state1 = true; Invoke("jhonnyTalkToFitra", 1); } if (questActionIndex == 1) { manager.isPlayerPause = false; } if (questActionIndex == 2) { questObject[1].SetActive(true); //문서 켜기 } break; case 20: //서류를 그린씨에게 전달하자 if (questActionIndex == 1) { questObject[1].SetActive(false); //문서 끄기 } break; case 30: //피트라의 자리로 가자. /*마린을 피트라 옆으로 이동시키기*/ if (manager.talkIndex == 4) { /*bool값을 바꿔줌으로써 moveMarinToFitra 함수를 호출*/ isMarinMovingToFitra = true; manager.objData.isNpc = true; //피트라의 첫 대화상대가 npc가 아닌 자기 책상이기 때문에 portrait가 안나옴. portrait의 등장을 위해 isnpc를 true로 바꿔줌. } /*마린을 원래 자기자리로 이동시키기*/ if (manager.talkIndex == 13) { manager.objData.isNpc = false; //피트라의 첫 대화상대가 npc가 아닌 자기 책상이기때문에 (portrait의 등장을 위해 isnpc를 true로 바꿨던 것을) 다시 false로 돌려놓아줌 /*bool값을 바꿔줌으로써 returnMarin 함수를 호출*/ isMarinReturning = true; manager.checkControlState = true; } break; case 40: //1층으로 나가 퇴근하자 animTriggerLine.SetActive(true); /*2층의 그린을 없애기*/ green2.SetActive(false); green.SetActive(true); /*quest를 위해 처음 문 근처로 왔을때 자동으로 HUMAN Door로 player을 옮겨줌 */ if (player.scanObject && player.scanObject.gameObject.tag == "Anim Trigger Line") { manager.checkControlState = false; //playerMove의 fixedupdate에서 계속 controlObject를 부르지 않도록 다시 변수를 false로 바꿈 ObjectData scanObj = player.scanObject.GetComponent <ObjectData>(); if (scanObj.isChecked) { break; } else { //자동으로 움직일때는 UI끔 manager.gameUIPanel.SetActive(false); Debug.Log("case 40의 자동이동 시작"); scanObj.isChecked = true; //이후로 이 길을 지나갈때는 이 에니메이션이 진행되지 않음. manager.isAction = true; //player의 키 입력에 의해 피트라의 자동 움직임이 방해되지 않도록 피트라의 움직임 입력받기를 정지 /*피트라가 왼쪽으로 걸어가는 에니메이션으로 바꿔줌*/ manager.isAutoMoving = true; player.anim.SetBool("isChange", true); player.anim.SetInteger("hAxisRaw", -1); /*목표 위치 설정*/ targetPos = new Vector3(26.1f, player.transform.position.y, player.transform.position.z); /*bool값을 바꿔줌으로써 moveFitraToHumanDoor 함수를 호출*/ isFitraMovingToHumanDoorX = true; } } /*문과 말할때 피트라의 portrait를 보이게 하기 위해 잠시 문의 isNpc를 true로 바꿈*/ if (manager.objData && questActionIndex == 0 && manager.talkIndex == 1) { manager.objData.isNpc = true; } if (manager.objData && questActionIndex == 0 && manager.talkIndex == 2) { manager.objData.isNpc = false; } /*Human Door 앞에서 그린씨가 피트라에게 말걸기*/ if (questActionIndex == 1) //문과의 대화가 끝났다면 questActionIndex가 1로 바뀜. { manager.isAction = true; //player의 키 입력에 의해 그린이 말걸기 전에 다른 곳으로 플레이어가 이동하지 않도록 정지시킴. ObjectData greenScript = green.GetComponent <ObjectData>(); if (!greenScript.isArrived) { manager.canPressSpace = false; autoMoving.startAutoMove(green, new Vector3(25.4f, green.transform.position.y, green.transform.position.z), 2.5f); manager.checkControlState = true; //그린이 피트라 옆에 가면 playermove script에서 controlState함수를 불러주기 위함. } if (greenScript.isArrived && manager.checkControlState) // 그린이 피트라 옆에 도착한다면 { //자동으로 움직이는것이 끝나면 UI켬 manager.gameUIPanel.SetActive(true); /*피트라가 그린에게 말걸도록 왼쪽을 보게 함*/ player.dirRayVec = Vector3.left; manager.checkControlState = false; autoMoving.arrivedToDest = false; manager.Action(green); manager.canPressSpace = true; } } /*AI door 로 나감(퇴근)*/ if (questActionIndex == 3 && manager.talkIndex == 0) { manager.ScreenLightDarken("Day 2"); manager.checkControlState = true; } break; case 50: /*출근. 피트라의 자리로 가기*/ talkTriggerLine.SetActive(true); /*1층 로비의 그린을 없애고 2층 그린을 보여주기*/ green.SetActive(false); green2.SetActive(true); /*1층의 Talk Trigger Line을 지나면 피트라의 자리로 가자는 talkbubble 띄우기*/ if (player.scanObject && player.scanObject.gameObject.tag == "Talk Trigger Line") { manager.checkControlState = false; //playerMove의 fixedupdate에서 계속 controlObject를 부르지 않도록 다시 변수를 false로 바꿈 ObjectData scanObj = player.scanObject.GetComponent <ObjectData>(); if (scanObj.isChecked) { break; } else { manager.Action(talkTriggerLine); scanObj.isChecked = true; } } /*정전 구현*/ if (questActionIndex == 1 && !manager.isBlackOut) // 정전이 한번 실행되면 이 if문 안으로 다시 안들어가도록 하기 위해 지금 벌써 정전중인지도 확인. { manager.isBlackOut = true; manager.blackout(); manager.isPlayerPause = true; // player가 못움직이게 함 manager.canPressSpace = false; // 정전 시 fitra가 다음 대사를 미리 보지 않도록 space바도 못누르게 함. StartCoroutine(wait(3)); // 여기서 startQuest 를 true로 바꿔줌 } break; case 60: /*정전을 고칠 부품들을 모아 수리센터로 가자*/ /*피트라 책상 앞에서 혼잣말 시작. "앗, 출근 하자마자 정전..?" */ if (startQuest && questActionIndex == 0) { /*앗, 출근하자마자.. 대사 시작*/ startQuest = false; // case 50이 끝나고 3초뒤 true가 됐던 변수를 다시 false로 바꿔줌 StartCoroutine("inCase60_1"); } /*피트라에게 정전 수리 도우라는 문자 보내기*/ if (questActionIndex == 1 && state1) { state1 = false; startQuest = true; /*피트라에게 정전 수리 도우라는 문자 보내기 시작*/ manager.checkControlState = true; StartCoroutine("inCase60_2"); } if (questActionIndex == 1 && manager.talkIndex == 1 && startQuest && !state1) { manager.checkControlState = false; startQuest = false; manager.beepSound.Play(); } /*피트라가 혼자말하게 하는 것 취소하기.*/ if (questActionIndex == 2) { player.isFitraMonologing = false; // 피트라가 혼자말하게 하는 것 취소하기. state1 = true; } /*수리하며 화면 어두워졌다가 수리 끝났다는 대화 하기*/ if (questActionIndex == 6 && state1) { state1 = false; manager.canPressSpace = false; manager.isPlayerPause = true; manager.componentItem.useComponent(); manager.ScreenLightDarken(""); manager.blackoutPanel.SetActive(false); /*베니가 수리 완료 대화 하기*/ Invoke("waitForRepair1", 6); } /*Day 2끝 화면 어두워지기*/ if (questActionIndex == 7 && manager.talkIndex == 0) { manager.ScreenLightDarken("Day 3"); /*Day 3가 시작하면 quest 70에서 신디씨에게 문자왔다는 이야기를 해야하므로 다시 talkTriggerline을 감지하기위해 ischecked를 false로 해줌*/ talkTriggerLine.SetActive(true); ObjectData talkTriggerLineScript = talkTriggerLine.GetComponent <ObjectData>(); talkTriggerLineScript.isChecked = false; /*quest 70에서 talk trigger line을 지나는 것을 확인하기 위함*/ manager.checkControlState = true; startQuest = true; } break; case 70: /*소리 끄기*/ manager.mainBGM.Stop(); typeEffect.canHearSound = false; /*1층의 Talk Trigger Line을 지나면 "신디씨한테 문자 와있던데... 먼저 들러보자"라는 talkbubble 띄우기*/ if (player.scanObject && player.scanObject.gameObject.tag == "Talk Trigger Line") { manager.checkControlState = false; //playerMove의 fixedupdate에서 계속 controlObject를 부르지 않도록 다시 변수를 false로 바꿈 ObjectData scanObj = player.scanObject.GetComponent <ObjectData>(); if (scanObj.isChecked) { break; } else { /*70 말 시작*/ manager.Action(talkTriggerLine); scanObj.isChecked = true; questObject[7].SetActive(false); // 조니자리의 컴퓨터 켜두기 jhonny.SetActive(false); // 조니자리의 컴퓨터 켜두기 green2.SetActive(false); } } break; case 80: if (questActionIndex == 1) { manager.checkControlState = true; JhonnyLine.SetActive(true); } /*조니상사의 자리에 왔을 때 문서 발견*/ if (questActionIndex == 2) { if (player.scanObject && player.scanObject.gameObject.tag == "Jhonny Line") { ObjectData scanObj = player.scanObject.GetComponent <ObjectData>(); if (scanObj.isChecked) { break; } else { manager.checkControlState = false; //playerMove의 fixedupdate에서 계속 controlObject를 부르지 않도록 다시 변수를 false로 바꿈 /*조니 문서 말 시작*/ scanObj.isChecked = true; manager.Action(JhonnyLine); } } } if (questActionIndex == 3 && manager.talkIndex == 0) { manager.checkControlState = true; aiChasingLine.SetActive(true); } break; case 90: /*소리 다시 들린다는 말. Police AI가 폐기시작이라는 말 함*/ if (questActionIndex == 0) { if (player.scanObject && player.scanObject.gameObject.tag == "AI Chasing Line") { manager.checkControlState = false; //playerMove의 fixedupdate에서 계속 controlObject를 부르지 않도록 다시 변수를 false로 바꿈 ObjectData scanObj = player.scanObject.GetComponent <ObjectData>(); if (scanObj.isChecked) { break; } else { /*소리 켬*/ manager.mainBGM.Play(); typeEffect.canHearSound = true; PoliceAisetActive(true); /*AI Chasing 말 시작*/ scanObj.isChecked = true; manager.Action(scanObj.gameObject); } } } /*Police AI가 피트라를 따라오기 시작함*/ if (questActionIndex == 1) { foreach (GameObject policeAI in policeAIAry) { PoliceAiStartChasing(policeAI); } } /*그린과 말이 끝나면 비밀통로가 열림*/ if (questActionIndex == 1 && manager.talkIndex == 14) { secretExitTilemap.SetActive(true); exitBlocker.SetActive(false); } /*player script에서 collider에 닿으면 exit floor로 순간이동하면서 rule설명 창이 열림 (gamemanager 의 teleportToExit함수가 호출됨)*/ break; case 100: /*피트라가 경찰 발결하고 "뛰어"라고 말함*/ if (questActionIndex == 0 && state1) { //Gamemanager의 closeButton1 함수에서 아래 주석친 일들을 대신 함 /* * Debug.Log("말해"); * state1 = false; * player.isFitraMonologing = true;// 피트라가 혼자말하게 함. 무조건 scanobj가 fitra로 바뀜. * manager.Action(playerObject); // 도망쳐! */ } /*police ai들이 피트라를 쫒아가기 시작함*/ if (questActionIndex == 1 && player.isFitraMonologing) { player.isFitraMonologing = false; foreach (GameObject policeAI in ExitpoliceAIAry) { PoliceAiStartChasing(policeAI); } state1 = true; manager.checkControlState = true; // 아래 if문에서 사용 } /*피트라가 "..출구다" 라고 말함. Police AI 를 멈추기*/ if (questActionIndex == 1 && state1) { if (player.scanObject && player.scanObject.gameObject.tag == "Exit Talk Trigger Line") { manager.checkControlState = false; //playerMove의 fixedupdate에서 계속 controlObject를 부르지 않도록 다시 변수를 false로 바꿈 ObjectData scanObj = player.scanObject.GetComponent <ObjectData>(); if (scanObj.isChecked) { break; } else { state1 = false; /*Police AI 를 멈추기*/ foreach (GameObject policeAI in ExitpoliceAIAry) { PoliceAiStopChasing(policeAI); } manager.Action(exitTalkTriggerLine); scanObj.isChecked = true; manager.checkControlState = true; /*exit브금 끄기*/ manager.exitBGM.Stop(); } } } break; case 110: /*playermove script에서 gameManager.teleportToOutside 함수가 먼저 실행됨*/ /*피트라가 건물을 나옴. 마지막 멘트 하기.*/ if (questActionIndex == 0 && state1) { manager.gameUIPanel.SetActive(false); /*피트라의 마지막 멘트*/ state1 = false; player.isFitraMonologing = true; // 피트라가 혼자말하게 함. 무조건 scanobj가 fitra로 바뀜. manager.Action(playerObject); } /*피트라 옆으로 걷기 시작*/ if (questActionIndex == 1 && player.isFitraMonologing) { player.isFitraMonologing = false; manager.canPressSpace = false; /*플레이어 이동*/ player.transform.position = new Vector3(40.4f, 14.27f, player.transform.position.z); Vector3 targetPos = new Vector3(player.transform.position.x + 30f, player.transform.position.y, player.transform.position.z); autoMoving.startAutoMove(player.gameObject, targetPos, 0.8f); /*플레이어 옆으로 걷는 anim으로 바꿔줌*/ player.anim.SetInteger("hAxisRaw", 1); //anim이 idle_sideplayer로 넘어가지 않게 0이 아닌 값으로 바꿔줌. player.anim.SetTrigger("walkSide"); player.spriteRenderer.flipX = false; /*화면 어둡게 및 엔딩 씬*/ StartCoroutine(startEnding()); } break; } }
/*문으로 공간 이동하기*/ IEnumerator door(GameObject scanObj) { isPlayerPause = true; //player가 다른곳으로 움직일 수 없게 함 DoorData door = scanObj.GetComponent <DoorData>(); Animator doorAnim = door.GetComponent <Animator>(); scanObj.layer = 15; // 잠깐 player가 문과 안부딪치게 layer을 바꿔줌 Debug.Log("자동 움직임 시작"); /*아래서 위로 올라가면서 들어가는 문일 때*/ if ((door.type == DoorData.DoorType.DoorAOut) || (door.type == DoorData.DoorType.DoorBIn) || (door.type == DoorData.DoorType.DoorCIn) || (door.type == DoorData.DoorType.DoorDIn) || (door.type == DoorData.DoorType.DoorRepairIn)) { player.transform.position = new Vector3(door.transform.position.x, door.transform.position.y - 1f, player.transform.position.z); Vector3 targetPos = new Vector3(player.transform.position.x, door.transform.position.y + 0.1f, player.transform.position.z); autoMovement.startAutoMove(player.gameObject, targetPos, 1f); } else/*위에서 아래로 내려가며 들어가는 문일때*/ { Vector3 targetPos = new Vector3(player.transform.position.x, door.transform.position.y + 0.3f, player.transform.position.z); autoMovement.startAutoMove(player.gameObject, targetPos, 1f); } /*문열리는 에니메이션 시작하고 에니메이션 진행동안(2초)은 공간이동 하지 않고 기다림*/ doorAnim.SetTrigger("DoorOpen"); yield return(new WaitForSeconds(2)); autoMovement.isAutoMoving = false; switch (door.type) { case DoorData.DoorType.DoorAIn: places[2].SetActive(true); places[1].SetActive(false); player.transform.position = new Vector3(1.5f, 8.4f, 0); break; case DoorData.DoorType.DoorAOut: places[2].SetActive(false); places[1].SetActive(true); player.transform.position = new Vector3(1.5f, 11, 0); break; case DoorData.DoorType.DoorBIn: places[1].SetActive(false); places[3].SetActive(true); player.transform.position = new Vector3(19.5f, 11.1f, 0); break; case DoorData.DoorType.DoorBOut: places[3].SetActive(false); places[1].SetActive(true); player.transform.position = new Vector3(18.5f, 6.2f, 0); break; case DoorData.DoorType.DoorCIn: places[4].SetActive(false); places[5].SetActive(true); player.transform.position = new Vector3(31.5f, 21.1f, 0); break; case DoorData.DoorType.DoorCOut: places[5].SetActive(false); places[4].SetActive(true); player.transform.position = new Vector3(31.5f, 15, 0); break; case DoorData.DoorType.DoorDIn: places[4].SetActive(false); places[6].SetActive(true); player.transform.position = new Vector3(18.5f, 21.1f, 0); break; case DoorData.DoorType.DoorDOut: places[6].SetActive(false); places[4].SetActive(true); player.transform.position = new Vector3(18.5f, 15, 0); break; case DoorData.DoorType.DoorRepairIn: places[4].SetActive(false); places[7].SetActive(true); player.transform.position = new Vector3(15, 5.6f, 0); break; case DoorData.DoorType.DoorRepairOut: places[7].SetActive(false); places[4].SetActive(true); player.transform.position = new Vector3(28.8f, 5.1f, 0); break; } ObjectData playerObjData = player.GetComponent <ObjectData>(); door.gameObject.layer = 10; isPlayerPause = false; }