/// <summary> /// collider check - enables surface collider, if inactive /// </summary> /// <param name="colliderCheck"></param> public void ClearSurface(bool colliderCheck) { // is basement check and special conditions? if (surfaceObjects.Count > 0) { for (int i = 0; i < surfaceObjects.Count; i++) { surfaceObjects[i].Annihilate(true); // чтобы не вызывали removeStructure здесь } surfaceObjects.Clear(); } cellsStatus = 0; artificialStructures = 0; map = new bool[INNER_RESOLUTION, INNER_RESOLUTION]; for (int i = 0; i < INNER_RESOLUTION; i++) { for (int j = 0; j < INNER_RESOLUTION; j++) { map[i, j] = false; } } if (colliderCheck) { surfaceRenderer.GetComponent <MeshCollider>().enabled = true; } structureBlock = null; }
/// <summary> /// Do not use directly, use "Set Basement" instead /// </summary> /// <param name="s">S.</param> public void AddStructure(Structure s) // with autoreplacing { if (s == null) { return; } if (s.innerPosition.x > INNER_RESOLUTION | s.innerPosition.z > INNER_RESOLUTION) { print("error in structure size"); return; } if (s.innerPosition.size == 1 && s.innerPosition.size == 1) { AddCellStructure(s, new PixelPosByte(s.innerPosition.x, s.innerPosition.z)); return; } Structure savedBasementForNow = null; if (cellsStatus != 0) { SurfaceRect sr = s.innerPosition; int i = 0; if (sr == SurfaceRect.full) // destroy everything there //print("fullscale"); { ClearSurface(false); // false так как не нужна лишняя установка коллайдера surfaceRenderer.GetComponent <Collider>().enabled = false; } else { while (i < surfaceObjects.Count) { SurfaceRect a = surfaceObjects[i].innerPosition; int leftX = -1, rightX = -1; if (a.x > sr.x) { leftX = a.x; } else { leftX = sr.x; } if (a.x + a.size > sr.x + sr.size) { rightX = sr.x + sr.size; } else { rightX = a.x + a.size; } if (leftX >= rightX) { i++; continue; } int topZ = -1, downZ = -1; if (a.z > sr.z) { downZ = a.z; } else { downZ = sr.z; } if (a.z + a.size > sr.z + sr.size) { topZ = sr.z + sr.size; } else { topZ = a.z + a.size; } if (topZ <= downZ) { i++; continue; } else { if (surfaceObjects[i].isBasement) { savedBasementForNow = surfaceObjects[i]; } else { surfaceObjects[i].Annihilate(false); } i++; } } } } surfaceObjects.Add(s); s.transform.parent = transform; s.transform.localPosition = GetLocalPosition(s.innerPosition); if (visibilityMask == 0) { s.SetVisibility(false); } else { s.SetVisibility(true); } BlockRendererController brc = s.transform.GetChild(0).GetComponent <BlockRendererController>(); if (brc != null) { structureBlock = brc; brc.SetRenderBitmask(renderMask); brc.SetVisibilityMask(visibilityMask); } else { s.transform.localRotation = Quaternion.Euler(0, s.modelRotation * 45, 0); } if (s.isArtificial) { artificialStructures++; } CellsStatusUpdate(); if (savedBasementForNow != null) { savedBasementForNow.Annihilate(true); } }