private void Awake()
 {
     boxCollider2D        = GetComponent <BoxCollider2D>();
     spriteRenderer       = transform.Find("sprite").GetComponent <SpriteRenderer>();
     buildingTypeHolder   = GetComponent <BuildingTypeHolder>();
     constructionMaterial = spriteRenderer.material;
 }
Esempio n. 2
0
    private void Awake()
    {
        boxCollider2D        = GetComponent <BoxCollider2D>();
        spriteRenderer       = transform.Find("Sprite").GetComponent <SpriteRenderer>();
        buildingTypeHolder   = GetComponent <BuildingTypeHolder>();
        constructionMaterial = spriteRenderer.material;

        Instantiate(GameAssets.Instance.pfBuildingPlacedParticles, transform.position, Quaternion.identity);
    }
    void Awake()
    {
        colli          = GetComponent <BoxCollider2D>();
        spriteRenderer = GetComponentInChildren <SpriteRenderer>();
        typeHolder     = GetComponent <BuildingTypeHolder>();
        constMaterial  = spriteRenderer.material;

        particles = Resources.Load <Transform>("pfBuildingPlacedParticles");
        Instantiate(particles, transform.position, Quaternion.identity);
    }
Esempio n. 4
0
    private bool CanSpawnBuilding(BuildingTypeSO buildingType, Vector3 position, out string errorMessage)
    {
        BoxCollider2D boxCollider2D = buildingType.prefab.GetComponent <BoxCollider2D>();

        Collider2D[] collider2dArray = Physics2D.OverlapBoxAll(position + (Vector3)boxCollider2D.offset, boxCollider2D.size, 0);

        bool isAreaClear = collider2dArray.Length == 0;

        if (!isAreaClear)
        {
            errorMessage = "Area is not clear!";
            return(false);
        }
        collider2dArray = Physics2D.OverlapCircleAll(position, buildingType.minConstructionRadius);

        foreach (Collider2D collider2D in collider2dArray)
        {
            // Colliders inside the construction radius
            BuildingTypeHolder buildingTypeHolder = collider2D.GetComponent <BuildingTypeHolder>();
            if (buildingTypeHolder != null)
            {
                // Has a BuildingTypeHolder
                if (buildingTypeHolder.buildingType == buildingType)
                {
                    // Theres already a building of this type within the construction radius!
                    errorMessage = "Too close to another building of the same type!";
                    return(false);
                }
            }
        }

        float maxConstructionRadius = 25;

        collider2dArray = Physics2D.OverlapCircleAll(position, maxConstructionRadius);

        foreach (Collider2D collider2D in collider2dArray)
        {
            // Colliders inside the construction radius
            BuildingTypeHolder buildingTypeHolder = collider2D.GetComponent <BuildingTypeHolder>();
            if (buildingTypeHolder != null)
            {
                // It's a building
                errorMessage = "";
                return(true);
            }
        }
        errorMessage = "Too far from any other building!";
        return(false);
    }
Esempio n. 5
0
    // 건물 배치가 있을 때, 다른 오브젝트 ( 자원, 건물 ) 와 겹치지 않을 것
    // 같은 종류의 건물을 지을때는 최소한의 거리를 유지해서 짓게할 것
    // 커맨드센터를 기준으로 너무 멀리 떨어지면 건물을 못짓게 할 것

    public bool CanSpawnBuilding(BuildingTypeSO buildingType, Vector3 mousePos, out string errorMsg)
    {
        // 다른 오브젝트가 존재 하는지 검사
        BoxCollider2D boxCol2D = buildingType.prefab.GetComponent <BoxCollider2D>();

        Collider2D[] colliders = Physics2D.OverlapBoxAll(mousePos + (Vector3)boxCol2D.offset, (Vector3)boxCol2D.size, 0);


        bool bAreaClear = colliders.Length == 0;

        if (!bAreaClear)
        {
            errorMsg = "이곳에는 지을 수 없습니다!";
            return(false); // 첫째 조건 ( 건물이 겹침 )
        }

        colliders = Physics2D.OverlapCircleAll(mousePos, buildingType.minConstructRadius);
        foreach (var item in colliders)
        {
            BuildingTypeHolder buildingTypeHolder = item.GetComponent <BuildingTypeHolder>();
            if (buildingTypeHolder != null)
            {
                if (buildingTypeHolder.buildingType == buildingType)
                {
                    errorMsg = "같은 타입의 건물이 근처에 있습니다!";
                    return(false); // 둘째 조건 ( 같은 건물이 주변에 너무 가까이 있음 )
                }
            }
        }

        float maxConstructRadius = 50f;

        colliders = Physics2D.OverlapCircleAll(mousePos, maxConstructRadius);
        foreach (var item in colliders)
        {
            BuildingTypeHolder buildingTypeHolder = item.GetComponent <BuildingTypeHolder>();
            if (buildingTypeHolder != null)
            {
                errorMsg = "";
                return(true); // 조건 만족
            }
        }
        errorMsg = "건설 할 수 있는 범위를 벗어났습니다!";
        return(false); // 3번째 조건 ( 커맨드 센터랑 너무 멈 )
    }
Esempio n. 6
0
    private bool CanSpawnBuilding(BuildingTypeSO buildingType, Vector3 position, out string errorMessage)
    {
        BoxCollider2D boxCollider2D = buildingType.prefab.GetComponent <BoxCollider2D>();

        // Search for things with collider in the placement area.
        Collider2D[] collider2DArray = Physics2D.OverlapBoxAll(position + (Vector3)boxCollider2D.offset, boxCollider2D.size, 0);
        bool         isAreaClear     = collider2DArray.Length == 0;

        if (!isAreaClear)
        {
            errorMessage = "Area is not clear!";
            return(false);
        }

        // Search for building of the same type in a minConstructionRadius
        collider2DArray = Physics2D.OverlapCircleAll(position, buildingType.minConstructionRadius);
        foreach (Collider2D collider2D in collider2DArray)
        {
            // Collider inside contruction Radius
            BuildingTypeHolder buildingTypeHolder = collider2D.GetComponent <BuildingTypeHolder>();
            if (buildingTypeHolder != null)
            {
                // Has a BuildingTypeHolder
                if (buildingTypeHolder.buildingType == buildingType)
                {
                    // There is a building of this type in radius
                    errorMessage = "To close of a building of the same type!";
                    return(false);
                }
            }
        }

        // IS it will be greater than 0 of production
        if (buildingType.hasResourceGeneratorData)
        {
            ResourceGeneratorData resourceGeneratorData = buildingType.resourceGeneratorData;
            int nearbyResourceAmount = ResourceGenerator.GetNearbyResourceAmount(resourceGeneratorData, position);

            if (nearbyResourceAmount == 0)
            {
                errorMessage = "There are no nearby Resource Nodes!";
                return(false);
            }
        }

        // Max Contruction Radius Rule
        float maxConstructionRadius = 25;

        collider2DArray = Physics2D.OverlapCircleAll(position, maxConstructionRadius);
        foreach (Collider2D collider2D in collider2DArray)
        {
            // Collider inside contruction Radius
            BuildingTypeHolder buildingTypeHolder = collider2D.GetComponent <BuildingTypeHolder>();
            if (buildingTypeHolder != null)
            {
                // It´s a Bulding!
                errorMessage = "";
                return(true);
            }
        }
        errorMessage = "To far of your base!";
        return(false);
    }
Esempio n. 7
0
    private bool CanSpawnBuilding(BuildingTypeSO buildingType, Vector3 position, out string errorMessage)
    {
        if (buildingType == null)
        {
            errorMessage = "BuildingType = null";
            return(false);
        }
        BoxCollider2D boxCollider2D = buildingType.prefab.GetComponent <BoxCollider2D>();

        Collider2D[] collider2DArray = Physics2D.OverlapBoxAll(position + (Vector3)boxCollider2D.offset, boxCollider2D.size, 0);

        bool isAreaClear = collider2DArray.Length == 0;

        if (!isAreaClear)
        {
            OnBuildingPlacementTrial?.Invoke(this,
                                             new OnBuildingPlacementTrialEventArgs {
                canBePlaced = false
            });
            errorMessage = "Area is not clear!";
            return(false);
        }


        collider2DArray = Physics2D.OverlapCircleAll(position, buildingType.minConstructionRadius);

        foreach (Collider2D collider2D in collider2DArray)
        {
            //Colliders inside the construction raidus;
            BuildingTypeHolder buildingTypeHolder = collider2D.GetComponent <BuildingTypeHolder>();

            if (buildingTypeHolder != null)
            {
                if (buildingTypeHolder.buildingType == buildingType)
                {
                    OnBuildingPlacementTrial?.Invoke(this,
                                                     new OnBuildingPlacementTrialEventArgs {
                        canBePlaced = false
                    });
                    errorMessage = "Too close to another building of the same type";
                    return(false);
                }
            }
        }
        if (buildingType.hasResourceGeneratorData)
        {
            ResourceGeneratorData resourceGeneratorData = buildingType.resourceGeneratorData;
            int nearbyResourceAmount = ResourceGenerator.GetNearbyResourceAmount(resourceGeneratorData, position);

            if (nearbyResourceAmount == 0)
            {
                errorMessage = "There are no resources nearby";
                return(false);
            }
        }

        float maxConstructionRadius = 25f;

        collider2DArray = Physics2D.OverlapCircleAll(position, maxConstructionRadius);

        foreach (Collider2D collider2D in collider2DArray)
        {
            //Colliders inside the construction raidus;
            BuildingTypeHolder buildingTypeHolder = collider2D.GetComponent <BuildingTypeHolder>();

            if (buildingTypeHolder != null)
            {
                OnBuildingPlacementTrial?.Invoke(this,
                                                 new OnBuildingPlacementTrialEventArgs {
                    canBePlaced = true
                });
                errorMessage = "";
                return(true);
            }
        }

        OnBuildingPlacementTrial?.Invoke(this,
                                         new OnBuildingPlacementTrialEventArgs {
            canBePlaced = false
        });
        errorMessage = "Too far from any other building!";
        return(false);
    }