Beispiel #1
0
    private bool isColliding(BuildingLimits item1, BuildingLimits item2)
    {
        // Get the distance beetween item 1 and item 2
        float centersDistance = (item1.GetCenter().position - item2.GetCenter().position).magnitude;

        // Get horizontal and vertical half size for item 1 and item 2
        float item1HorizontalHalfSize = (item1.GetTransformR().position - item1.GetCenter().position).magnitude;
        float item1VerticalHalfSize   = (item1.GetCenter().position - item1.GetTransformD().position).magnitude;

        float item2HorizontalHalfSize = (item2.GetTransformR().position - item2.GetCenter().position).magnitude;
        float item2VerticalHalfSize   = (item2.GetCenter().position - item2.GetTransformD().position).magnitude;

        /**
         * Attention aux nombres magique
         */
        if (item2.GetCenter().position.x != item1.GetCenter().position.x)
        {
            return(item2HorizontalHalfSize + item1HorizontalHalfSize > centersDistance * 2);
        }
        else
        {
            return(item1VerticalHalfSize + item2VerticalHalfSize > centersDistance * 1.25);
        }
    }
Beispiel #2
0
    IEnumerator OnDragBuilding()
    {
        Vector3    mousePositionInWorldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        GameObject tmpBuilding;

        tmpBuilding = Instantiate(tmpBuildingRef, mousePositionInWorldPoint, Quaternion.identity);

        while (true)
        {
            mousePositionInWorldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            float x = (float)System.Math.Round(mousePositionInWorldPoint.x * 2f, System.MidpointRounding.AwayFromZero) / 2f;//Mathf.RoundToInt(mousePositionInWorldPoint.x);
            float y = (float)System.Math.Round(mousePositionInWorldPoint.y * 2f, System.MidpointRounding.AwayFromZero) / 2f - 0.25f;
            if (x % 1 != 0)
            {
                y += 0.25f;
            }
            Vector3 cellPosition = gridLayout.LocalToCellInterpolated(new Vector3(x, y, 0));

            tmpBuilding.transform.position = gridLayout.CellToLocalInterpolated(cellPosition);

            if (dragNDrop.cityBuildings != null)
            {
                BuildingLimits tmpBuildingLimit = tmpBuilding.GetComponent <BuildingLimits>();
                bool           collide          = false;
                foreach (GameObject item in dragNDrop.cityBuildings)
                {
                    BuildingLimits itemLimit = item.GetComponent <BuildingLimits>();
                    if (isColliding(itemLimit, tmpBuildingLimit))
                    {
                        // collision !
                        collide = true;
                        Debug.Log("Invalid");
                    }
                }
                if (collide)
                {
                    vstate = ValidationState.INVALID;
                }
                else
                {
                    vstate = ValidationState.VALID;
                }
            }

            yield return(new WaitForEndOfFrame());

            if (actionCancelled)
            {
                Destroy(tmpBuilding);
                actionCancelled = false;
                break;
            }

            if (actionValidate)
            {
                dragNDrop.AddCityBuilding(tmpBuilding);
                tmpBuilding    = Instantiate(tmpBuildingRef);
                actionValidate = false;
            }
        }
        dragCoroutine = null;
    }