예제 #1
0
    float GetHeight(WorldGridTile tile)
    {
        float      height = 0f;
        Vector2Int pos    = tile.Position;
        WorldGrid  grid   = tile.ParentGrid;


        for (int i = pos.x - 1; i < pos.x + 2; i++)
        {
            for (int j = pos.y - 1; j < pos.y + 2; j++)
            {
                WorldGridTile adjTile = grid.GetTile(i, j);
                if (adjTile == null)
                {
                    continue;
                }

                if (adjTile.Model)
                {
                    if (adjTile.Model.GetComponent <MeshRenderer>())
                    {
                        height = (adjTile.Model.GetComponent <MeshRenderer>().bounds.size.y > height) ? adjTile.Model.GetComponent <MeshRenderer>().bounds.size.y : height;
                    }
                    else
                    {
                        height = (adjTile.Model.GetComponentInChildren <MeshRenderer>().bounds.size.y > height) ? adjTile.Model.GetComponentInChildren <MeshRenderer>().bounds.size.y : height;
                    }
                }
            }
        }
        return(height);
    }
예제 #2
0
    void CheckTarget()
    {
        if (GazeManager.Instance.HitObject && GazeManager.Instance.HitObject.GetComponent <FocusHighlighter>())
        {
            WorldGridTile tile = GazeManager.Instance.HitObject.transform.parent.GetComponent <WorldGridTile>();

            CheckPlacement(tile);

            if (tile == prevTile)
            {
                return;
            }
            else
            {
                prevTile = tile;
            }

            SetGhostPosition(ghostEnt, tile.transform);
        }
        else
        {
            ghostEnt.SetActive(false);
            validPlace = false;
        }
    }
예제 #3
0
        public override void OnWorldGridTileCreated(WorldGridTile tile)
        {
            base.OnWorldGridTileCreated(tile);

            _tile = tile;
            InstantiateWarningIndicators(tile);
        }
예제 #4
0
    void Start()
    {
        _tileParent      = GetComponentInParent <WorldGridTile>();
        _handDetection   = FindObjectOfType <HandDetection>();
        _cameraTransform = Camera.main.transform;
        _gesturesManager = Camera.main.GetComponent <GesturesManager>();

        gridTile = GetComponentInParent <WorldGridTile>().GridTileCounterpart;
    }
예제 #5
0
 void StopTool()
 {
     active    = false;
     startTile = null;
     endTiles.Clear();
     tiles.Clear();
     DestroyIndicators();
     tileHighlighter.ValidPlace = true;
     buttonMenuPrefab.SetActive(false);
 }
예제 #6
0
    void UndoRoad(GameObject go)
    {
        if (endTiles.Count < 2)
        {
            return;
        }

        endTiles.Pop();
        startTile = endTiles.Peek();

        ClearLine();
        DisableIndicators();
    }
예제 #7
0
    public void MoveToTile(WorldGridTile tile)
    {
        FollowGaze = false;

        float height = GetHeight(tile) + 0.025f;

        Vector3 pos = tile.transform.position;

        pos.y += height;

        menuTransform.localPosition = Vector3.zero;
        transform.position          = pos;
    }
예제 #8
0
    private WorldGridTile CreateWorldGridTile(Vector2Int tileposition)
    {
        GameObject newTileGameObject = new GameObject();

        newTileGameObject.name = string.Format("WorldTile({0},{1})", tileposition.x, tileposition.y);
        newTileGameObject.transform.SetParent(GridContainer.transform);
        newTileGameObject.transform.localPosition = new Vector3(tileposition.x * TileScale, 0, tileposition.y * TileScale);
        //Add WorldGridTile component and set up.
        WorldGridTile tile = newTileGameObject.AddComponent <WorldGridTile>();

        tile.Initialize(tileposition, this);

        return(tile);
    }
예제 #9
0
        protected void InstantiateWarningIndicators(WorldGridTile tile)
        {
            float        boundmax = 0.1f;
            MeshRenderer renderer = tile.Model.GetComponent <MeshRenderer>();

            if (renderer == null)
            {
                MeshRenderer[] renderers = tile.Model.GetComponentsInChildren <MeshRenderer>();
                foreach (MeshRenderer rend in renderers)
                {
                    Vector3 bounds = new Vector3(rend.bounds.max.x * rend.transform.lossyScale.x, rend.bounds.max.y * rend.transform.lossyScale.y, rend.bounds.max.z * rend.transform.lossyScale.z);
                    if (bounds.y > boundmax)
                    {
                        boundmax = bounds.y;
                    }
                    if (bounds.z > boundmax)
                    {
                        boundmax = bounds.z;
                    }
                }
            }
            else
            {
                boundmax = renderer.bounds.max.y * renderer.transform.lossyScale.y;
                float boundzscaled = renderer.bounds.max.z * renderer.transform.lossyScale.z;
                if (boundzscaled > boundmax)
                {
                    boundmax = boundzscaled;
                }
            }

            //if (boundmax < tile.Model.GetComponent<MeshRenderer>().bounds.max.z) boundmax = tile.Model.GetComponent<MeshRenderer>().bounds.max.z;
            Vector3 offset = tile.transform.position + new Vector3(0, boundmax, 0);

            if (ElectricityWarning != null)
            {
                UnityEngine.Object.Destroy(ElectricityWarning);
            }
            ElectricityWarning = UnityEngine.Object.Instantiate(Game.CurrentSession.Cache.ElectricityWarning, ParentTile.ParentGridSystem.WorldGrid.transform);
            ElectricityWarning.transform.position = offset;

            if (WaterWarning != null)
            {
                UnityEngine.Object.Destroy(WaterWarning);
            }
            WaterWarning = UnityEngine.Object.Instantiate(Game.CurrentSession.Cache.WaterWarning, ParentTile.ParentGridSystem.WorldGrid.transform);
            WaterWarning.transform.position = offset;
        }
예제 #10
0
 public void TilePressed()
 {
     if (tileHighlighter.ValidPlace && tiles.Count > 0)
     {
         if (!endTiles.Contains(endTile))
         {
             startTile = endTile;
             endTiles.Push(endTile);
         }
     }
     else
     {
         // play some error sound
         // AudioManager.Instance.errorSound();
     }
 }
예제 #11
0
파일: Road.cs 프로젝트: rob5300/Holocity
        public override void OnWorldGridTileCreated(WorldGridTile tile)
        {
            worldTile = tile;
            ApplyModelRotation();

            //Tell any adjacent road tiles to check and update their models.
            GridTile[] adjacentTiles = GetAdjacentGridTiles();

            foreach (GridTile adjtile in adjacentTiles)
            {
                if (adjtile?.Entity is Road)
                {
                    ((Road)adjtile.Entity).RecheckAndApplyRoadModel();
                }
            }
        }
예제 #12
0
    void BuildingPressed(GameObject go)
    {
        if (!UIManager.Instance.targetTile)
        {
            return;
        }


        WorldGridTile targetTile = UIManager.Instance.targetTile;

        int index = go.GetComponent <BuildingButton>().index;

        buildingTool.StartTool(Buildings[index].BuildingType, index, targetTile.ParentGrid.Id);

        DestroyBuildingButtons();
        UIManager.Instance.SwitchState(UIManager.MenuState.Off);
    }
예제 #13
0
    /// <summary>
    /// Swap the positions of these two tiles. Simply a data swap and visual only.
    /// </summary>
    /// <param name="tileA"></param>
    /// <param name="tileB"></param>
    public void SwapGridTiles(Vector2Int tileA, Vector2Int tileB)
    {
        //Get Tiles.
        WorldGridTile a = GetTile(tileA);
        WorldGridTile b = GetTile(tileB);
        //Store the old a positions.
        Vector3    oldAPos     = a.transform.position;
        Vector2Int oldATilePos = a.Position;

        //Change a to b's data.
        a.Position           = b.Position;
        a.transform.position = b.transform.position;
        GridTiles[b.Position.x][b.Position.y] = a;
        //Change b's data to a's.
        b.Position           = oldATilePos;
        b.transform.position = oldAPos;
        GridTiles[oldATilePos.x][oldATilePos.y] = b;
    }
예제 #14
0
    private void CheckPlacement(WorldGridTile tile)
    {
        validPlace = buildingMenu.CheckCanPlace(tile, buildingIndex);
        validPlace = CheckCost();

        if (validPlace)
        {
            foreach (PreviewBuilding ghostTile in ghostTiles)
            {
                if (ghostTile.tile == tile)
                {
                    validPlace = false;
                    break;
                }
            }
        }

        SetGhostColour(validPlace);
    }
예제 #15
0
    public void PlaceBuilding(WorldGridTile tile, int index, TileEntity tileEnt)
    {
        int gridID = 0;

        gridID = tile.ParentGrid.Id;
        Vector2Int pos = tile.Position;


        if (tile.Model)
        {
            tile.UpdateModel(tileEnt.GetModel());
        }
        else if (CheckCanPlace(tile, index))
        {
            Game.CurrentSession.City.GetGrid(gridID).AddTileEntityToTile(pos.x, pos.y, tileEnt);
            //Take money
            Game.CurrentSession.TakeFunds(Buildings[index].Cost);
        }
    }
예제 #16
0
    public void TilePressed(WorldGridTile tile)
    {
        if (roadTool.active || buildingTool.active)
        {
            return;
        }

        // move the menu up if surrounding tiles have things on them.. or scale it up,.
        if (targetTile == tile && menuState != MenuState.Off)
        {
            SwitchState(MenuState.Off);
            return;
        }
        targetTile = tile;

        moveUI.MoveToTile(targetTile);
        tileHighlighter.currentTarget = targetTile.transform.GetChild(0).gameObject;

        SwitchState(MenuState.BuildMenu);
    }
예제 #17
0
    public bool AttemptBuildingSwap(Vector3 checkPosition)
    {
        //Will need to update to work with multiple grids.

        LayerMask  layerMask = LayerMask.NameToLayer("Hologram");
        RaycastHit hit;

        if (Physics.Raycast(checkPosition, -Vector3.up, out hit, layerMask))
        {
            //Check for WorldGridTile.
            WorldGridTile foundTile = hit.transform.parent.GetComponent <WorldGridTile>() ?? hit.transform.parent.GetComponentInParent <WorldGridTile>();

            //Check if there was a found tile and if the found grid tile shares the same grid id.
            if (foundTile != null && foundTile.ParentGrid.Id == ParentGrid.Id)
            {
                //Try to swap these two tiles around. if it fails we know to reset the positions.
                return(ParentGrid.GridSystem.SwapTileEntities(Position, foundTile.Position));
            }
        }
        return(false);
    }
예제 #18
0
    public void StartTool(WorldGridTile tile)
    {
        if (active)
        {
            return;
        }

        startTile = (tile != null) ? tile : null;
        if (startTile == null)
        {
            return;
        }

        active = true;
        endTiles.Push(startTile);
        HighlightStartTile();

        buttonMenuPrefab.SetActive(true);
        buttonMenuPrefab.transform.parent        = startTile.transform;
        buttonMenuPrefab.transform.localPosition = offset;
    }
예제 #19
0
    public void OnInputClicked(InputClickedEventData eventData)
    {
        if (timeofuse + 0.5f > Time.time)
        {
            return;
        }

        timeofuse = Time.time;

        eventData.Use();

        if (UIManager.Instance.roadTool.active)
        {
            UIManager.Instance.roadTool.TilePressed();
        }
        else if (UIManager.Instance.buildingTool.active)
        {
            UIManager.Instance.buildingTool.TilePressed();
        }
        else if (GazeManager.Instance.HitObject && GazeManager.Instance.HitObject.GetComponent <CompoundButton>())
        {
            AudioManager.Instance.UISound(true);
        }
        else if (GazeManager.Instance.HitObject && GazeManager.Instance.HitObject.GetComponentInParent <WorldGridTile>())
        {
            WorldGridTile tile = GazeManager.Instance.HitObject.transform.parent.GetComponent <WorldGridTile>();
            UIManager.Instance.TilePressed(tile);
            AudioManager.Instance.SelectSound(true);
        }
        else if (!GazeManager.Instance.HitObject && UIManager.Instance.menuState != UIManager.MenuState.Off)
        {
            UIManager.Instance.SwitchState(UIManager.MenuState.Off);
            AudioManager.Instance.SelectSound(false);
            //turn off UI if player clicks away.
        }
    }
예제 #20
0
    public void Initialize(int id, int width, int height, GridSystem gridSystem)
    {
        Id         = id;
        GridSystem = gridSystem;
        GridTiles  = new WorldGridTile[width][];
        for (int w = 0; w < width; w++)
        {
            GridTiles[w] = new WorldGridTile[height];
            for (int h = 0; h < height; h++)
            {
                GridTiles[w][h] = CreateWorldGridTile(new Vector2Int(w, h));
            }
        }
        Width  = width;
        Height = height;
        CenterGridTiles();
        AddMoveButton(new Vector3(GridTiles[0][0].transform.localPosition.x - 0.15f, GridTiles[0][0].transform.localPosition.y, GridTiles[0][0].transform.localPosition.z));
        AddScaleButton(new Vector3(GridTiles[0][0].transform.localPosition.x - 0.15f, GridTiles[0][0].transform.localPosition.y, GridTiles[0][0].transform.localPosition.z + 0.45f));
        AddRotateButton(new Vector3(GridTiles[0][0].transform.localPosition.x - 0.15f, GridTiles[0][0].transform.localPosition.y, GridTiles[0][0].transform.localPosition.z + 0.90f));
        AddNewGridButton(new Vector3(GridTiles[0][0].transform.localPosition.x - 0.15f, GridTiles[0][0].transform.localPosition.y, GridTiles[0][0].transform.localPosition.z + 1.35f));


        //Add ambient sound
        AddAmbientSound();

        //Add in the resources UI.
        AddResourcesUI();

        //Attempt to scale the grid container
        GridContainer.transform.localScale = ContainerScaleFactor;

        RotateToFaceUser();


        UIGuideCircle.instance.AddTarget(GridContainer.transform);
    }
예제 #21
0
 public PreviewBuilding(WorldGridTile Tile, GameObject GhostBuilding)
 {
     tile          = Tile;
     ghostBuilding = GhostBuilding;
 }
예제 #22
0
        public override void OnWorldGridTileCreated(WorldGridTile tile)
        {
            base.OnWorldGridTileCreated(tile);

            gridtile = tile;
        }
예제 #23
0
 public bool CheckCanPlace(WorldGridTile tile, int index)
 {
     return(tile.ParentGrid.GridSystem.QueryPlaceByType(Buildings[index].BuildingType, tile.Position));
 }
예제 #24
0
    void GetTiles()
    {
        if (GazeManager.Instance.HitObject && GazeManager.Instance.HitObject.GetComponent <FocusHighlighter>() && GazeManager.Instance.HitObject != prevTarget)
        {
            prevTarget = GazeManager.Instance.HitObject;
            endTile    = GazeManager.Instance.HitObject.transform.parent.GetComponent <WorldGridTile>();
            WorldGrid grid = startTile.ParentGrid;

            ClearLine();
            DisableIndicators();


            if (startTile.Position.x == endTile.Position.x)
            {
                int i = (startTile.Position.y <= endTile.Position.y) ? 1 : -1;

                for (int y = startTile.Position.y; ;)
                {
                    WorldGridTile tile = grid.GetTile(startTile.Position.x, y);

                    if (!tiles.Contains(tile))
                    {
                        tiles.Add(tile);
                    }

                    if (y == endTile.Position.y)
                    {
                        break;
                    }

                    y += i;
                }

                tileHighlighter.ValidPlace = true;
            }
            else if (startTile.Position.y == endTile.Position.y)
            {
                int i = (startTile.Position.x <= endTile.Position.x) ? 1 : -1;

                for (int x = startTile.Position.x; ;)
                {
                    WorldGridTile tile = grid.GetTile(x, startTile.Position.y);

                    if (!tiles.Contains(tile))
                    {
                        tiles.Add(tile);
                    }

                    if (x == endTile.Position.x)
                    {
                        break;
                    }

                    x += i;
                }

                tileHighlighter.ValidPlace = true;
            }
            else
            {
                tileHighlighter.ValidPlace = false;
            }

            HighlightTiles();
        }
    }
예제 #25
0
 public virtual void OnWorldGridTileCreated(WorldGridTile tile)
 {
 }
예제 #26
0
        public override void OnWorldGridTileCreated(WorldGridTile tile)
        {
            base.OnWorldGridTileCreated(tile);

            tile.Model.transform.localPosition = new Vector3(-0.075f, 0, 0.075f);
        }
예제 #27
0
 void Start()
 {
     _tileParent      = GetComponentInParent <WorldGridTile>();
     _gesturesManager = Camera.main.GetComponent <GesturesManager>();
 }