コード例 #1
0
    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);
    }
コード例 #2
0
    /* 건물을 이동하는 함수 */
    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();
            }
        }
    }