/// <summary> /// 생성자. 광고 정보를 바탕으로 Unity 공간에 물체를 생성한다. /// </summary> /// <param name="info">광고 정보 오브젝트</param> /// <param name="clientInfo">클라이언트 정보 오브젝트</param> public Ar3dPlane(Ad3dInfo info, ClientInfo clientInfo) { Info = info; ClientInfoObj = clientInfo; Create(); }
/// <summary> /// GameObj에 있는 물체를 Unity 공간에서 파괴한다. /// </summary> public override void Destroy() { Object.Destroy(GameObj); GameObj = null; Info = null; }
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)); } }