[unity] 지정된 위도 경도에 프리팹 생성

윤정민·2022년 11월 15일
0

GPS->EventPrefab 생성

1. Detect Place()

사용자가 원하는 위도, 경도 주변에 있는지 확인

  • 주변에 있다면 isInPlace = true
  • 주변에 위치하지 않는다면 isInPlace = false
	void DetectPlace()
    {
        //원하는 위치 수 만큼 반복
        foreach (LatLong latLong in latLongs)
        {
            //현재 위치와 원하는 위치의 거리가 범위 내에 들어가지 않으면 isInPlace = false, 반복문 continue
            if (Vector3.Magnitude(currentLocation - GPSEncoder.GPSToUCS(latLong.lat, latLong.lon)) > distance)
            {
                isInPlace = false;
                continue;
            }
            //범위 내에 들어간다면 isInPlace = true, 위치 이름을 place에 저장
            isInPlace = true;
            place = latLong.name;
            return;
        }

    }

2. Update()

이벤트 프리팹을 생성하거나 삭제

  • 위치 범위에서 벗어나고 이벤트 프리팹이 생성 되었다면, 이벤트 프리팹을 삭제하는 함수 DestroyEventPre()

  • 위치 범위 내에 있고 이벤트 프리팹이 생성되지 않았다면, 바닥을 감지한 뒤 이벤트 프리팹을 생성하는 함수 DetectGround()

	void Update()
    {
        if (!isInPlace) 
        {
            if (isGen)
            {
                DestroyEventPre();
            }
            return; 
        }
        if (!isGen)
        {
            DetectGround();
        }

    }

3. Detect Ground()

스마트폰 중앙 지점에서 Ray를 발사할 때 Plane타입의 물체가 존재 한다면 EventPrefab 활성화 후 EventPrefab의 위치를 Plane으로 설정

오브젝트 활성화 정보를 저장하는 isGen을 true로 설정

    void DetectGround()
    {
        //스마트폰 스크린의 Center를 찾음
        Vector2 centerPoint = new Vector2(Screen.width * 0.5f, Screen.height * 0.5f);
        //Ray에 부딪힌 대상들의 정보를 저장할 리스트 생성
        List<ARRaycastHit> hitInfos = new List<ARRaycastHit>();

        //스크린 중앙지점으로 부터 Ray를 발사 했을 때, Plane 타입의 물체가 존재한다면,
        if (arRayMan.Raycast(centerPoint, hitInfos, TrackableType.Planes))
        {
            //표식 오브젝트 활성화
            eventPre.SetActive(true);
            isGen = true;
            //표식 오브젝트의 위치와 회전값 업데이트
            eventPre.transform.position = hitInfos[0].pose.position;
            eventPre.transform.rotation = hitInfos[0].pose.rotation;
        }
    }

EventPrefab->UI생성

1. Update()

터치시 터치한 화면 위치에서 Ray를 발사할 때, smallEvent를 포함한 오브젝트가 있다면 text와 image를 출력할 UI Canvas 활성화
해당 위치의 text와 image를 보여주는 smallEventManager 스크립트의 함수 사용

	void Update()
    {
        if (Input.touchCount == 0) return;  //터치 횟수가 0이면 return

        Touch touch = Input.GetTouch(0);
        
        if (touch.phase == TouchPhase.Began) // 터치 시작시
        {
            Ray ray;
            RaycastHit hitobj;
            ray = arCamera.ScreenPointToRay(touch.position); //카메라 정중앙에서 ray쏨
            if (Physics.Raycast(ray, out hitobj)) //맞은 오브젝트가 있으면 hitobj에 저장하고 if들어감
            {
                //터치한 곳에 오브젝트 이름이 smallEvent를 포함하면
                if (hitobj.collider.name.Contains("smallEvent"))
                {
                    //현재 위치의 document id 들고옴
                    GetComponent<PlaceInfo>().documentId = GameObject.Find("AR Session Origin").GetComponent<AREventGen>().place;
                    //UI띄움
                    if(!smallEventManager.isView) // UI가 비활성 상태면 띄우기
                        smallEventManager.View(GameObject.Find("smallEvent"));
                    else // 활성상태면 index증가해서 다음 text띄우기
                        smallEventManager.TextView(GetComponent<PlaceInfo>().documentId);
                }
                
            }
        }
    }
profile
그냥 하자

2개의 댓글

comment-user-thumbnail
2023년 3월 14일

혹시 전체 코드를 볼 수 있을까요... 어떤식으로 연결되어 있는지 이해가 안되서.. 도와주세요!

1개의 답글