public void LoadWall(int _originNumber, Item _loadItem, string _objectName, Vector3 _currentPosition, Vector3 _currentRotate, Vector3 _currentScale, int _placeNumber, float _tilingX, float _tilingY) { /* 게임 오브젝트 생성 */ GameObject _loadObject = Instantiate(_loadItem.item3d); /* 부모 지정 */ _loadObject.transform.SetParent(_inDoor.transform.GetChild(0)); /* 자식으로 변경 */ _loadObject = _loadObject.transform.GetChild(0).gameObject; /* ItemObject 스크립트 추가 */ ItemObject _tmp = _loadObject.AddComponent <ItemObject>(); /* 빠른 연결을 위한 캐싱 작업 */ Item _tmpItem = new Item(_objectName, _itemListControl._wallDBIndex + 1, _originNumber, _loadObject); /* 추가한 ItemObject에 현재 Item의 정보를 담음 */ _tmp._thisItem = _tmpItem; /* DB에 삽입 */ _itemListControl.AddWall(_tmpItem); /* PlaceNumber 지정 */ _tmp._placeNumber = _placeNumber; /* 이름 지정 */ _loadObject.transform.parent.name = _loadObject.transform.parent.name.Substring(0, _loadObject.transform.parent.name.Length - 7); /* 위치 조정 */ _loadObject.transform.parent.position = _currentPosition; /* 회전 조절*/ _loadObject.transform.parent.Rotate(_currentRotate); /* 크기 지정*/ _loadObject.transform.parent.localScale = _currentScale; /* Sprite 복사 */ Sprite _tmpSprite = _itemListControl.GetImages(3, _placeNumber); /* Sprite가 존재하면 */ if (_tmpSprite != null) { /* Texture 지정 */ _loadObject.GetComponent <MeshRenderer>().material.mainTexture = Instantiate(_tmpSprite).texture; } /* Tiling 값 지정 */ _loadObject.GetComponent <MeshRenderer>().material.mainTextureScale = new Vector2(_tilingX, _tilingY); }
/* 건물을 이동하는 함수 */ void LocateBuilding() { /* 설치해야할 건물이 있으면 */ if (_locatedBuilding) { Ray _ray = _mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit _rayHit; /* 레이캐스트 충돌 시 */ if (Physics.Raycast(_ray, out _rayHit)) { /* 도킹 기능이 활성화 중이면 */ if (_clickedPlaceControl._isDocking && (_rayHit.transform.tag == "Floor" || _rayHit.transform.tag == "Wall")) { if (_rayHit.transform.tag == "Floor") //바닥에 설치하는 경우 { Transform _rayHitTransform = _rayHit.transform; /* 바닥의 네 개의 모퉁이의 좌표를 구함 */ Vector3 _xMinusCorner = _rayHitTransform.position - _rayHitTransform.right * ((_rayHitTransform.localScale.x * _rayHitTransform.parent.localScale.x) * 0.5f); Vector3 _xPlusCorner = _rayHitTransform.position + _rayHitTransform.right * ((_rayHitTransform.localScale.x * _rayHitTransform.parent.localScale.x) * 0.5f); Vector3 _zMinusCorner = _rayHitTransform.position - _rayHitTransform.forward * ((_rayHitTransform.localScale.z * _rayHitTransform.parent.localScale.z) * 0.5f); Vector3 _zPlusCorner = _rayHitTransform.position + _rayHitTransform.forward * ((_rayHitTransform.localScale.z * _rayHitTransform.parent.localScale.z) * 0.5f); /* 왼쪽 모퉁이와 가까워지면 */ if (Vector3.Distance(_xMinusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_xMinusCorner, _rayHit.point)) { /* 왼쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _xMinusCorner; } /* 오른쪽 모퉁이와 가까워지면 */ else if (Vector3.Distance(_xPlusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_xPlusCorner, _rayHit.point)) { /* 오른쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _xPlusCorner; } /* 아래쪽 모퉁이와 가까워지면 */ else if (Vector3.Distance(_zMinusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_zMinusCorner, _rayHit.point)) { /* 아래쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _zMinusCorner; } /* 위쪽 모퉁이와 가까워지면 */ else if (Vector3.Distance(_zPlusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_zPlusCorner, _rayHit.point)) { /* 위쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _zPlusCorner; } /* 아무런 모퉁이와 가깝지 않으면 */ else { /* 닿은 위치로 건물 이동 */ _locatedBuilding.GetComponent <Transform>().position = _rayHit.point; } } else if (_rayHit.transform.tag == "Wall") //벽에 설치하는 경우 { Transform _rayHitTransform = _rayHit.transform; /* 벽 네 개의 모퉁이 좌표를 구함*/ Vector3 _yPlusCorner = _rayHitTransform.position + _rayHitTransform.up * ((_rayHitTransform.localScale.y * _rayHitTransform.parent.localScale.y) * 0.5f); Vector3 _yMinusCorner = _rayHitTransform.position - _rayHitTransform.up * ((_rayHitTransform.localScale.y * _rayHitTransform.parent.localScale.y) * 0.5f); Vector3 _xMinusCorner = _rayHitTransform.position - _rayHitTransform.right * ((_rayHitTransform.localScale.x * _rayHitTransform.parent.localScale.x) * 0.5f); Vector3 _xPlusCorner = _rayHitTransform.position + _rayHitTransform.right * ((_rayHitTransform.localScale.x * _rayHitTransform.parent.localScale.x) * 0.5f); Debug.Log(_xMinusCorner); /* 위 모퉁이와 가까워지면 */ if (Vector3.Distance(_yPlusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_yPlusCorner, _rayHit.point)) { /* 위쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _yPlusCorner; } /* 아래쪽 모퉁이와 가까워지면 */ else if (Vector3.Distance(_yMinusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_yMinusCorner, _rayHit.point)) { /* 아래쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _yMinusCorner; } /* 왼쪽 모퉁이와 가까워지면 */ else if (Vector3.Distance(_xMinusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_xMinusCorner, _rayHit.point)) { /* 왼쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _xMinusCorner; } /* 오른쪽 모퉁이와 가까워지면 */ else if (Vector3.Distance(_xPlusCorner, _rayHitTransform.position) / 2f > Vector3.Distance(_xPlusCorner, _rayHit.point)) { /* 오른쪽 모퉁이로 이동 */ _locatedBuilding.GetComponent <Transform>().position = _xPlusCorner; } /* 아무런 모퉁이와 가깝지 않으면 */ else { /* 닿은 위치로 건물 이동 */ _locatedBuilding.GetComponent <Transform>().position = _rayHit.point; } } } /* 도킹 기능이 비활성화 중이면 */ else { /* 건물 위치 변경 */ _locatedBuilding.GetComponent <Transform>().position = _rayHit.point; } } /* 마우스 휠을 회전하면 건물 회전 */ float _wheel = Input.GetAxis("Mouse ScrollWheel"); if (_wheel > 0f) { _locatedBuilding.GetComponent <Transform>().Rotate(0, 15f, 0, Space.World); } else if (_wheel < 0f) { _locatedBuilding.GetComponent <Transform>().Rotate(0, -15f, 0, Space.World); } /* 마우스 왼쪽 버튼을 누르면 */ if (Input.GetMouseButtonDown(0)) { if (!_isRelocated) //최초의 건물 배치이면 { /* 배치한 ItemObject라는 스크립트 추가 */ ItemObject _tmpItemObject = _locatedBuilding.GetComponent <Transform>().GetChild(0).gameObject.AddComponent <ItemObject>(); /* Item Component 할당 */ Item _tmpItem = new Item(_locatedBuildingItem.itemName, _itemListControl._wallDBIndex + 1, _locatedBuildingItem._originNumber, _locatedBuilding.GetComponent <Transform>().GetChild(0).gameObject); /* DB에 Item Component 삽입 */ _itemListControl.AddWall(_tmpItem); HistoryController.pushObjectCreateHist(_locatedBuildingItem.item3d, _tmpItem._originNumber, _tmpItem._objectNumber); /* Item Component 삽입 */ _tmpItemObject._thisItem = _tmpItem; /* PlaceNumber 초기화 */ _tmpItemObject._placeNumber = 3000; /* Tiling 값 초기화 */ _tmpItemObject._tilingX = 1f; _tmpItemObject._tilingY = 1f; } /* RayCast 적용 */ _locatedBuilding.GetComponent <Transform>().GetChild(0).gameObject.layer = 0; /* 이동시킬 건물 없음 */ _locatedBuilding = null; /* 기준 Plane 비활성화 */ _measurePlane.SetActive(false); /* 카메라 움직일 수 있음 */ _cameraMoveAroun._cameraAroun = true; /* ClickedPlaceCanvas의 위치 InputField를 갱신 */ _clickedPlaceControl.ResetPositionInputField(); } } }