Example #1
0
 /// <summary>
 /// 생성자. 광고 정보를 바탕으로 Unity 공간에 물체를 생성한다.
 /// </summary>
 /// <param name="info">광고 정보 오브젝트</param>
 /// <param name="clientInfo">클라이언트 정보 오브젝트</param>
 public Ar3dPlane(Ad3dInfo info, ClientInfo clientInfo)
 {
     Info          = info;
     ClientInfoObj = clientInfo;
     Create();
 }
Example #2
0
 /// <summary>
 /// GameObj에 있는 물체를 Unity 공간에서 파괴한다.
 /// </summary>
 public override void Destroy()
 {
     Object.Destroy(GameObj);
     GameObj = null;
     Info    = null;
 }
Example #3
0
    private IEnumerator Get3dArObjectList(float intervalInSecond = 5.0f)
    {
        // GPS 초기화가 될 때까지 대기
        if (Application.platform == RuntimePlatform.Android)
        {
            if (!_clientInfo.OriginalValuesAreSet)
            {
                yield return(new WaitUntil(() => _clientInfo.OriginalValuesAreSet));
            }
        }

        while (true)
        {
            if (_clientInfo.InsideOption)
            {
                _clientInfo.OriginalValuesAreSet = false;
                foreach (var arObject in _ar3dObjects.Values)
                {
                    arObject.Destroy();
                }
                _ar3dObjects.Clear();
            }
            else
            {
                string latitude  = _clientInfo.CurrentLatitude.ToString();
                string longitude = _clientInfo.CurrentLongitude.ToString();
                string altitude  = _clientInfo.CurrentAltitude.ToString();
                string latitudeOption;
                string longitudeOption;
                if (_clientInfo.DistanceOption == 1)
                {
                    latitudeOption  = "0.0002";
                    longitudeOption = "0.0001";
                }
                else if (_clientInfo.DistanceOption == 2)
                {
                    latitudeOption  = "0.0004";
                    longitudeOption = "0.0002";
                }
                else
                {
                    latitudeOption  = "0.0006";
                    longitudeOption = "0.0003";
                }


                // 테스트용 GPS
                //latitude = "37.450571";
                //longitude = "126.656903";
                //altitude = "53.000000";

                WWWForm form = new WWWForm();
                form.AddField("latitude", latitude);
                form.AddField("longitude", longitude);
                form.AddField("altitude", altitude);
                form.AddField("latitudeOption", latitudeOption);
                form.AddField("longitudeOption", longitudeOption);

                // 3D 오브젝트 목록 가져오기: GPS 정보를 서버에 POST
                using (UnityWebRequest www = UnityWebRequest.Post("http://ec2-13-125-7-2.ap-northeast-2.compute.amazonaws.com:31337/capstone/get3D_distance.php", form))
                {
                    // POST 전송
                    yield return(www.SendWebRequest());

                    if (www.isNetworkError || www.isHttpError)
                    {
                        Debug.Log(www.error);
                        // TODO: 필요시 재시도
                    }
                    else
                    {
                        // 서버에서 Json 응답으로 준 오브젝트 리스트를 _ar3dObjects에 적용
                        string responseJsonString = www.downloadHandler.text;
                        //JsonPlaneDataArray newObjectList = JsonUtility.FromJson<JsonPlaneDataArray>(responseJsonString);
                        Json3dDataArray newObjectList = JsonUtility.FromJson <Json3dDataArray>(responseJsonString);

                        if (newObjectList.data.Length == 0)
                        {
                            // 받아온 리스트에 아무것도 없는 경우 - 리스트 클리어
                            foreach (var arObject in _ar3dObjects.Values)
                            {
                                arObject.Destroy();
                            }

                            _ar3dObjects.Clear();
                        }
                        else
                        {
                            // 받아온 오브젝트의 Ad Number 모으기 (유일한 번호인 Ad Number로 오브젝트를 구별하기 위함)
                            var newAdNumbers = new HashSet <int>();
                            foreach (var newObject in newObjectList.data)
                            {
                                newAdNumbers.Add(newObject.object_no);
                            }

                            // _arObjects의 ArObject들 중 받아온 리스트에 없는 것 삭제
                            var oldAdNumbers = new List <int>(_ar3dObjects.Keys);
                            foreach (var oldNumber in oldAdNumbers)
                            {
                                if (!newAdNumbers.Contains(oldNumber))
                                {
                                    _ar3dObjects[oldNumber].Destroy();
                                    _ar3dObjects.Remove(oldNumber);
                                }
                            }

                            // 받아온 리스트에서 새로 생긴 ArObject 생성
                            foreach (Json3dData json3dArObject in newObjectList.data)
                            {
                                // 기존 리스트에 이미 있는 경우 안 만듦
                                if (_ar3dObjects.Keys.Contains(json3dArObject.object_no))
                                {
                                    continue;
                                }

                                // 새로운 ArObject 생성
                                Ad3dInfo tmpAdInfo = new Ad3dInfo
                                {
                                    ObjectNumber = json3dArObject.object_no,
                                    typeName     = json3dArObject.typeName,
                                    GpsInfo      = new Vector3(json3dArObject.latitude, json3dArObject.longitude,
                                                               json3dArObject.altitude),
                                    Bearing = json3dArObject.bearing,
                                    TextAlternateToTexture = "",
                                };
                                _ar3dObjects[json3dArObject.object_no] = new Ar3dPlane(tmpAdInfo, _clientInfo);
                            }
                        }
                    }
                }
            }
            // 오브젝트 목록 리퀘스트 주기: `intervalInSecond`초.
            yield return(new WaitForSeconds(intervalInSecond));
        }
    }