コード例 #1
0
 /// <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;
 }
コード例 #2
0
    /// <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);
        }
    }