Пример #1
0
    void Start()
    {
        // get references
        _tileDB = TileDatabase.instance;
        _camera = Camera.main;

        // freeze camera
        _camera.GetComponent <SimpleCameraController>().Freeze();

        // generate standard 10x10 grid
        GenerateGrid(_gridDefaultSize.x, _gridDefaultSize.y);

        // add all existing tiletypes to dropdown menu
        _dropDownTiles.options.Clear();
        for (int i = 0; i < _tileDB.tileCount; i++)
        {
            _dropDownTiles.options.Add(new Dropdown.OptionData(_tileDB.GetTile(i).typeName));
        }

        // create tile of first type in typearray
        _selectedTile     = Instantiate(_tileDB.GetTile(0).data.prefab, _tileFolder);
        _selectedTileType = _tileDB.GetTile(0).typeName.ToLower();
        _currentEditMode  = EDIT_MODE.PLACE_SINGLE;

        // add collider and set layer of tile (need this to be able to select alredy placed tiles)
        AddcolliderToSelectedTile();

        _currentMinTintText.text = _tintMin.value.ToString("0.00");
        _currentMaxTintText.text = _tintMax.value.ToString("0.00");
    }
Пример #2
0
    public Tile(Vector2DInt position, string tileName, float yRotation, float tintStrength, Transform tilesFolder)
    {
        _tileDB       = TileDatabase.instance;
        model         = _tileDB.GetTile(tileName);
        this.position = position;
        currentHealth = model.data.health;

        CreateView(position, yRotation, tintStrength, tilesFolder);
        CreateSounds();
    }
Пример #3
0
    void Update()
    {
        // change editmode
        if (Input.GetMouseButtonDown(1))
        {
            if ((int)_currentEditMode < (int)EDIT_MODE.NUM_MODES - 1)
            {
                _currentEditMode++;
            }
            else
            {
                _currentEditMode = 0;
            }

            _editModeText.text = string.Format("EDIT MODE: {0}", _currentEditMode);

            // if in place tile mode, delete tile to go into select mode
            if (_currentEditMode == EDIT_MODE.DELETE)
            {
                if (_selectedTile)
                {
                    Destroy(_selectedTile);
                    _selectedTile = null;
                }
            }
        }

        // in placetile mode
        if (_currentEditMode == EDIT_MODE.PLACE_SINGLE || _currentEditMode == EDIT_MODE.PAINT)
        {
            // create plane at zero to raycast at from camera
            Plane targetPlane = new Plane(Vector3.up, Vector3.zero);
            Ray   hitRay      = _camera.ScreenPointToRay(Input.mousePosition);
            float dst         = 0;
            targetPlane.Raycast(hitRay, out dst);

            // get hitpoint from ray and convert to 2d coordinates
            Vector3 hitPoint = hitRay.GetPoint(dst);
            int     CoordY   = Mathf.CeilToInt(hitPoint.z);
            int     CoordX   = Mathf.CeilToInt(hitPoint.x);

            // check so coordinates is inside grid
            if (CoordX >= 0 && CoordX < _gridSize.x && CoordY >= 0 && CoordY < _gridSize.y)
            {
                // check if tile is already placed on coords (all tiles is set to "Death" by defualt meaning they are empty)
                bool  occupied = _tileProperties[CoordY, CoordX].name.ToLower() != "empty";
                float yPos     = 0.0f;
                if (occupied)
                {
                    yPos = 1.0f;
                }

                if (!_selectedTile)
                {
                    _selectedTile = Instantiate(_tileDB.GetTile(_selectedTileType).data.prefab, Vector3.zero, _tileDB.GetTile(_selectedTileType).data.prefab.transform.rotation *Quaternion.Euler(0, _rotationY, 0), _tileFolder);
                    AddcolliderToSelectedTile();
                }

                TintCurrentTile();

                if (Input.GetMouseButtonDown(3) || Input.GetKeyDown(KeyCode.R))
                {
                    _rotationY += 90.0f;
                    if (_rotationY > 360.0f)
                    {
                        _rotationY = 90.0f;
                    }

                    Vector3 oldRotation = _selectedTile.transform.rotation.eulerAngles;
                    oldRotation.y = _rotationY;

                    _selectedTile.transform.rotation = Quaternion.Euler(oldRotation);
                }

                _selectedTile.transform.position = new Vector3(Mathf.CeilToInt(hitPoint.x), yPos, Mathf.CeilToInt(hitPoint.z));

                // set the tiletype and position of this coord in the grid
                if (!occupied)
                {
                    if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
                    {
                        return;
                    }

                    if (_currentEditMode == EDIT_MODE.PLACE_SINGLE && Input.GetMouseButtonDown(0))
                    {
                        PlaceTile(CoordX, CoordY, _rotationY);
                    }
                    else if (_currentEditMode == EDIT_MODE.PAINT && Input.GetMouseButton(0))
                    {
                        PlaceTile(CoordX, CoordY, _rotationY);
                    }
                }
            }
        }
        else         // in delete mode
        {
            if (Input.GetMouseButtonDown(0))
            {
                if (UnityEngine.EventSystems.EventSystem.current.IsPointerOverGameObject())
                {
                    return;
                }

                // raycast and se if we hit a already placed tile and then we can move it
                Ray        ray = _camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                    if (hit.collider.gameObject.layer == 9)
                    {
                        _tileProperties[(int)hit.transform.position.z, (int)hit.transform.position.x].name = "empty";
                        Destroy(hit.collider.gameObject);
                    }
                }
            }
        }
    }