IEnumerator RecallDrone() { // 잠시 대기하며 기울어진 드론 기체 회복 DroneMovement DM = PlayerController.instance.drone.GetComponent <DroneMovement>(); DM.DirectDroneRecoverMoment(); // 드론이 도착할 지점을 바라본다(y축 회전) Vector3 targetPos = dronePos.transform.position; lookTarget.transform.LookAt(targetPos); transform.eulerAngles = new Vector3(transform.eulerAngles.x, lookTarget.transform.eulerAngles.y, transform.eulerAngles.z); DM.SetStartingRotation(); // ??? 필요? Debug.DrawLine(transform.position, dronePos.transform.position, Color.blue); //// 상승 //DM.CallMovementUpDown(true, 0.5f); float speed = 10.0f; // 드론 -> 목표 방향으로 바닥과 수평이 되도록 ray 발사. Vector3 start = transform.position, end = dronePos.transform.position; start.y = 0; end.y = 0; while (Physics.Raycast( transform.position + new Vector3(0, -1, 0), //dronePos.transform.position - transform.position end - start , out hit, Vector3.Distance(transform.position, dronePos.transform.position)) || transform.position.y < dronePos.transform.position.y ) { if (!enabled) { StopCoroutine(coroutine); } gameObject.transform.Translate(Vector3.up * speed * Time.deltaTime); yield return(null); } lookTarget.transform.LookAt(targetPos); transform.eulerAngles = new Vector3(transform.eulerAngles.x, lookTarget.transform.eulerAngles.y, transform.eulerAngles.z); DM.SetStartingRotation(); float leftDistance = Vector3.Distance(transform.position, new Vector3(targetPos.x, transform.position.y, targetPos.z) ); // 드론이 도착 지점을 찾지 못해 지나쳐서 // 남은 거리가 다시 멀어지는 경우를 체크하기 위한 변수 float rightBeforeLeftDist = float.MaxValue; while (leftDistance > 2f && rightBeforeLeftDist >= leftDistance) { rightBeforeLeftDist = leftDistance; // 남은 거리 계산 leftDistance = Vector3.Distance(transform.position, new Vector3(targetPos.x, transform.position.y, targetPos.z) ); gameObject.transform.Translate(Vector3.forward * speed * Time.deltaTime); yield return(null); } // 정확한 타겟의 상단으로 위치 고정 //gameObject.transform.position = new Vector3(targetPos.x, transform.position.y, targetPos.z); DM.SetStartingRotation(); // // 하강 leftDistance = Vector3.Distance(transform.position, targetPos); while (transform.position.y > targetPos.y + 3) { gameObject.transform.Translate(Vector3.down * speed * Time.deltaTime); yield return(null); } DM.SetStartingRotation(); // ??? 필요? coroutineFlag = false; followFlag = true; }
/// <summary> /// 대화 시작 여부를 판단 및 진행 /// </summary> public void TalkSystem() { // 대화 중에는 x, UI 상호작용 중이라면 X if (TalkManager.instance.talking || IngameCanvasManager.instance.isCanvasOn) { return; } //if (InputDeviceChecker.instance.Interact() && InteractiveTarget != null) if (InputDeviceChecker.instance.Interact() && !isInteractBtnDown) { isInteractBtnDown = true; // 대화 상대가 있다면 대화 시작 if (InteractiveTarget != null) { if (!InteractiveTarget.CompareTag("Portal") && dm.GetStatus() == DroneStatus.Control) { // 상태 대화중으로 변경 dm.SetStatus(DroneStatus.Talk); // 대상 NPC에 상호작용 시작 시그널 전달 InteractiveTarget.GetComponent <NPCInteractiveController>().InteractiveStart(gameObject); // 기체 기울어짐 등 회복 dm.DirectDroneRecoverMoment(transform.eulerAngles.y); // 상하 움직임 초기화 dm.MovementUpDown(true); } // 대화 종료 else if (dm.GetStatus() == DroneStatus.Talk) { // 상태 조종중으로 변경 dm.SetStatus(DroneStatus.Control); // 대상 NPC에 상호작용 종료 시그널 전달 InteractiveTarget.gameObject.GetComponent <NPCInteractiveController>().InteractiveStop(); } } // 상호작용 상대가 없다면. Ingame UI 메뉴 탭 활성화 else if (dm.GetStatus() == DroneStatus.Control || dm.GetStatus() == DroneStatus.Landing || dm.GetStatus() == DroneStatus.Rest) { // 예기치 못한 동작이 불가하도록 일괄 상태 변경 // 탭을 닫을 때 최신 시점 정보를 토대로 시점 셋팅 PlayerController.instance.setStatus(PlayerStatus.Talk); PlayerController.instance.dm.SetStatus(DroneStatus.Talk); // 기체 기울어짐 등 회복 dm.DirectDroneRecoverMoment(transform.eulerAngles.y); // 상하 움직임 초기화 dm.MovementUpDown(true); Input.ResetInputAxes(); // 버튼 입력 초기화 IngameCanvasManager.instance.MenuTab(true); print("Drone Menu tab open request"); } } //else if(Input.GetButtonUp("Interact")) else if (InputDeviceChecker.instance.InteractUp()) { isInteractBtnDown = false; } }