Ejemplo n.º 1
0
    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;
    }
Ejemplo n.º 2
0
    /// <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;
        }
    }