private void Awake() { boxCollider2D = GetComponent <BoxCollider2D>(); spriteRenderer = transform.Find("sprite").GetComponent <SpriteRenderer>(); buildingTypeHolder = GetComponent <BuildingTypeHolder>(); constructionMaterial = spriteRenderer.material; }
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); }
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); }
// 건물 배치가 있을 때, 다른 오브젝트 ( 자원, 건물 ) 와 겹치지 않을 것 // 같은 종류의 건물을 지을때는 최소한의 거리를 유지해서 짓게할 것 // 커맨드센터를 기준으로 너무 멀리 떨어지면 건물을 못짓게 할 것 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번째 조건 ( 커맨드 센터랑 너무 멈 ) }
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); }
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); }