public override Block BuildBlock(Vector3Int pos) { Block newBlock = null; if (blockType == FillArea.BlockType.BLOCK) { newBlock = new Block(); } else if (blockType == FillArea.BlockType.GRASS) { newBlock = new BlockGrass(); } else if (blockType == FillArea.BlockType.DESERT) { newBlock = new BlockDesert(); } else if (blockType == FillArea.BlockType.CLOUD) { newBlock = new BlockCloud(); } else if (blockType == FillArea.BlockType.WATER) { newBlock = new BlockWater(); } else { newBlock = new BlockAir(); } return(newBlock); }
public override Block BuildBlock(Vector3Int pos) { Block newBlock = null; float noise = (MyUtil.Get3DNoise(pos.x, pos.y, pos.z, frequency, octave, persistence) + 1.0f) * 0.5f; noise = Mathf.Clamp01(noise); if (noise <= blockRate) { newBlock = new Block(); } else if (noise <= desertRate) { newBlock = new BlockDesert(); } else if (noise <= grassRate) { newBlock = new BlockGrass(); } else if (noise <= cloudRate) { newBlock = new BlockCloud(); } else { newBlock = new BlockAir(); } return(newBlock); }
/** * @brief 지형 블럭을 생성한다. * @return 만들어진 지형을 반환한다. */ private Block CreateBlock(Vector3Int worldPos) { Block newBlock = null; var info = planetInfo.terrainInfo; float coreRange = info.radius * info.coreRate; //코어의 표면은 블럭으로 생성 int isInVertCnt = MyUtil.IsCubeInRange(worldPos, 1, coreRange); if (isInVertCnt > 0 && isInVertCnt < 8) { newBlock = new Block(); newBlock.isLock = true; } //코어 외부는 Mode에 따라 함수를 통해 생성 else if (isInVertCnt == 0) { if (MyUtil.GetSNoise(worldPos.x, worldPos.y, worldPos.z, 0.05f, 50) > 20) { float noise = (MyUtil.Get3DNoise(worldPos.x, worldPos.y, worldPos.z, info.frequency, info.octave, info.persistence) + 1.0f) * 0.5f; //int holeChance = MyUtil.GetSNoise(worldPos.x, worldPos.y, worldPos.z, 0.05f, 50); noise = Mathf.Clamp01(noise); if (noise <= info.blockRate) { newBlock = new Block(); } else if (noise <= info.desertRate) { newBlock = new BlockDesert(); } else if (noise <= info.grassRate) { newBlock = new BlockGrass(); } } } //Ocean BLock if (newBlock == null) { float height = Mathf.Max(Mathf.Abs(worldPos.x + 0.5f), Mathf.Abs(worldPos.y + 0.5f), Mathf.Abs(worldPos.z + 0.5f)); if (height <= info.oceanHeight && height > info.oceanHeight - info.oceanDepth) { newBlock = new BlockWater(); newBlock.isLock = true; } } if (newBlock == null) { newBlock = new BlockAir(); } return(newBlock); }