bool DoAttack() { eye.aimList.RemoveAll((g) => g == null || TerrainUnit.IsStaticType(g.type)); if (eye.aimList.Count > 0) { eye.aimList.OrderBy((g) => (g.transform.position - transform.position).magnitude); int i = 0; bool validTarget = true; while (!TerrainUnit.IsManualType(eye.aimList[i].GetComponent <TerrainUnit>().type)) { i++; if (i >= eye.aimList.Count) { validTarget = false; break; } } if (validTarget) { GameObject instance = Instantiate(bulletPrefab, this.transform.position, Quaternion.identity); instance.GetComponent <BulletMotivation>().target = eye.aimList[i].gameObject; return(true); } } return(false); // return false; }
IEnumerable <TerrainUnit> GetNeibours(int x, int y) { x %= size.x; for (int i = 0; i < 4; i++) { if (((_4direction[i, 0] + x) < 0) || ((_4direction[i, 0] + x) >= size.x) || (_4direction[i, 1] + y < 0) || (_4direction[i, 1] + y >= size.y) ) { continue; } TerrainUnit t = null; try { t = map[_4direction[i, 0] + x, _4direction[i, 1] + y]; } catch (System.Exception) { Debug.Log((_4direction[i, 0] + x) + " " + (_4direction[i, 1] + y)); } if (t != null) { yield return(t); } } }
/// <summary> /// 查找四周有无符合条件的邻居 /// /// t: 留空则搜索 IsManualType /// </summary> public bool HasNeibour(int x, int y, Func <UnitType, bool> t = null ) { // x += poolCur; x %= size.x; for (int i = 0; i < 4; i++) { if (_4direction[i, 0] + x < 0 || _4direction[i, 0] + x >= size.x || _4direction[i, 1] + y < 0 || _4direction[i, 1] + y >= size.y) { continue; } if (t == null) { if (!TerrainUnit.IsManualType(map[_4direction[i, 0] + x, _4direction[i, 1] + y].type))// type { continue; } } else { if (!t(map[_4direction[i, 0] + x, _4direction[i, 1] + y].type))// type { continue; } } if (1 >= Mathf.Abs(map[_4direction[i, 0] + x, _4direction[i, 1] + y].position.y - map[x, y].position.y))// 0<= dy <= 1 { return(true); } } return(false); }
/// <summary> /// 生成单片walkable方块 /// </summary> /// <returns></returns> IEnumerator SpawnPiece() { pieceCount++; this.nextPieces.Dequeue(); //update resource for (int i = 0; i < unitConfig.GetConfig(this.selectedType).resourceNeeded.Length; i++) { this.playerResources[(ResourceType)i] -= unitConfig.GetConfig(this.selectedType).resourceNeeded[i]; } hudManager.UpdateResource(playerResources, playerMaxResources); hudManager.Placed(this.selectedType); foreach (Vector3Int occ in this.selectedData.GetOccupy()) { TerrainUnit targetTerrain = worldManager.GetUnit(selectingPosition.x + occ.x, selectingPosition.z + occ.z); if (targetTerrain != null) { targetTerrain.SetType(this.selectedType); } else { continue; } yield return(new WaitForSeconds(0.1f)); } // end piece this.selectedData.ResetRotate(); }
void Start() { map = new TerrainUnit[MAP_X, MAP_Y, MAP_Z]; for (int x = 0; x < MAP_X; x++) { for (int y = 0; y < MAP_Y; y++) { for (int z = 0; z < MAP_Z; z++) { TerrainUnit t = new TerrainUnit(); t.ID = x.ToString() + y.ToString() + z.ToString(); if (z <= SEA_LEVEL) { string[] tempC = { "Si", "Fe", "C-", "Au" }; t.Composition = tempC; float[] tempCP = { 91.00f, 3.00f, 3.00f, 3.00f }; t.CompositionPercentages = tempCP; } map [x, y, z] = t; Instantiate(tr, new Vector3(x, y, z), Quaternion.identity); } } } Debug.Log("Generated: " + Time.realtimeSinceStartup); }
/// <summary> /// cd count if has target in field /// </summary> /// <returns></returns> bool HaveTarget() { previteHaveTargetCount++; if (previteHaveTargetCount > 5) { foreach (var item in eye.aimList) { if (TerrainUnit.IsManualType(item.GetComponent <TerrainUnit>().type)) { previteHaveTarget = true; previteHaveTargetCount = 0; return(true); } } previteHaveTargetCount = 0; previteHaveTarget = false; return(false); } return(previteHaveTarget); }
public void Deposit(TerrainUnit deposit) { strata.Push(deposit); }
public void RefreshBuff() { while (buffInstances.Count > 0) { Destroy(buffInstances.Dequeue()); } if (worldManager) { bool[,] visited = new bool[worldManager.size.x, worldManager.size.y]; for (int _x = 0; _x < worldManager.size.x; _x++) { for (int _z = 0; _z < worldManager.size.y; _z++) { if (!visited[_x, _z] && worldManager.GetUnit(_x, _z).localBuff != UnitBuffType.NONE) { visited[_x, _z] = true; var buffRange = worldManager.SpreadBFS(new Vector3Int(_x, 0, _z), (me, him) => me.localBuff == him.localBuff, p => { visited[p.x, p.z] = true; return(true); }); GameObject buffInstance = Instantiate(buffPrefab, null); buffInstance.GetComponent <BuffEffect>().LoadMeshByBlocks(buffRange, TerrainUnit.GetColorByBuffType(worldManager.GetUnit(_x, _z).localBuff)); buffInstances.Enqueue(buffInstance); } } } } }
public bool SetType(UnitType t) { if (this.type != UnitType.Empty && pieceInstance != null || t == UnitType.Empty) { ClearOut(); Destroy(pieceInstance); if (subInstance != null) { Destroy(subInstance); } } if (!InitStaticType(t)) { this.type = t; if (t == UnitType.Empty) { // reset _canProducing = false; isProducer = false; return(false); } this.pieceInstance = Instantiate(piecePrefab, transform.position + new Vector3(0, 0.5f, 0), Quaternion.identity); this.pieceInstance.transform.SetParent(this.transform); this.pieceInstance.GetComponent <MeshRenderer>().material.SetColor("_Color", TerrainUnit.GetColorByType(this.type)); this.progressFiller = this.pieceInstance.transform.Find("Canvas").Find("Filler").GetComponent <Image>(); this.progressBackground = this.pieceInstance.transform.Find("Canvas").Find("Back").GetComponent <Image>(); // produce handle this.isProducer = unitConfig.IsProducer(this.type); if (this.isProducer) { this.localPeriod = unitConfig.GetProducePeriod(this.type); this.subPrefab = unitConfig.GetProducePrefab(this.type); this.canProducing = true; } else { this.canProducing = false; this.subPrefab = unitConfig.GetProducePrefab(this.type);// for static prefabs if (subPrefab != null) { this.subInstance = Instantiate(subPrefab, transform.position + new Vector3(0, 0.5f, 0), Quaternion.identity); } } // default Prefab switch (t) { case UnitType.Mine: subPrefab = MinePrefab; // static Instance subInstance = Instantiate(MinePrefab, transform.position + new Vector3(-0.5f, 0.5f, -0.5f), Quaternion.identity); // Random Generate Factor Range var buffRange = worldManager.SpreadBFS(this.position, (me, him) => (me.position - him.position).magnitude < 2.3f && Math.Abs(me.position.y - him.position.y) <= 1); foreach (var item in buffRange) { worldManager.GetUnit(item).localBuff = UnitBuffType.INCREASE_FACTORY; } // flush buff mesh break; case UnitType.Storage: playManager.IncreaseMaxResource(); // every storage take 1 break; default: break; } } return(true); }
/// <summary> /// 通过鼠标事件更新预览方块的位置,并计算可否放置(this.slectingCanPlace) /// </summary> /// <param name="unit"></param> public void UpdateSlectingPosition(TerrainUnit unit) { if (playState == PlayState.ELECTED) { selectingPosition = unit.position; if (previewInstance) { // update transform previewInstance.transform.position = new Vector3(selectingPosition.x + 0.5f, selectingPosition.y / 2.0f + 0.2f, selectingPosition.z + 0.5f); // +offsets previewInstance.transform.rotation = Quaternion.Euler(0, -90 * selectedData.rotate, 0) * Quaternion.identity; } slectingCanPlace = true; // whether on save alttitude foreach (Vector3Int occ in this.selectedData.GetOccupy()) { TerrainUnit targetTerrain = worldManager.GetUnit(selectingPosition.x + occ.x, selectingPosition.z + occ.z); if (targetTerrain == null || targetTerrain.type != UnitType.Empty || targetTerrain.position.y != worldManager.GetUnit(selectingPosition.x, selectingPosition.z).position.y) { slectingCanPlace = false; break; } } if (slectingCanPlace) { // is first one // 检查周边有无已放置 // targetTerrain bool hasNeibour = false; foreach (Vector3Int occ in this.selectedData.GetOccupy()) { TerrainUnit targetTerrain = worldManager.GetUnit(selectingPosition.x + occ.x, selectingPosition.z + occ.z); if (targetTerrain != null && worldManager.HasNeibour(selectingPosition.x + occ.x, selectingPosition.z + occ.z, t => t == UnitType.Road || t == UnitType.Spawn )) { hasNeibour = true; break; } } if (!hasNeibour) { slectingCanPlace = false; } } // 染色 for (int i = 0; i < previewInstance.transform.childCount; i++) { Material mt = previewInstance.transform.GetChild(i).GetComponent <MeshRenderer>().material; mt.SetColor( "_Color", TerrainUnit.GetColorByType( (this.slectingCanPlace) ? this.selectedType : UnitType.Empty ) ); mt.SetFloat( "_GOpacity", 0.5f ); mt.SetFloat( "_RimRang", 0 ); } } }