コード例 #1
0
        public bool HasSpace(LayerMask mask, BuildingPiece placedPiece)
        {
            // Get the objects that overlap this socket.
            var overlappingStuff = Physics.OverlapSphere(transform.position, Radius, mask, QueryTriggerInteraction.Ignore);

            foreach (var col in overlappingStuff)
            {
                if (m_Piece != placedPiece)
                {
                    if (!m_Piece.Building.HasCollider(col) && col as TerrainCollider == null)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (!m_Piece.HasCollider(col) && col as TerrainCollider == null)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
コード例 #2
0
        /// <summary>
        /// Is this point stable?
        /// </summary>
        public bool IsStable(BuildingPiece piece, LayerMask mask)
        {
            var hits = Physics.RaycastAll(piece.transform.position + piece.transform.TransformVector(m_Position), piece.transform.TransformDirection(m_Direction), m_Distance, mask, QueryTriggerInteraction.Ignore);

            for (int i = 0; i < hits.Length; i++)
            {
                if (!piece.HasCollider(hits[i].collider))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #3
0
        private void ManageCollision()
        {
            m_PlacementAllowed = true;

            if (m_CurrentPreviewPiece.TerrainProtection || m_CurrentPreviewPiece.RequiresSockets)
            {
                bool overlapsStuff = m_CurrentPreviewPiece.IsBlockedByTerrain();

                //Debug.Log("overlaps terrain: " + overlapsStuff);

                if (!overlapsStuff)
                {
                    Collider[] overlappingStuff = Physics.OverlapBox(m_CurrentPreviewPiece.Bounds.center, m_CurrentPreviewPiece.Bounds.extents, m_CurrentPreviewPiece.transform.rotation, m_FreePlacementMask, QueryTriggerInteraction.Ignore);

                    for (int o = 0; o < overlappingStuff.Length; o++)
                    {
                        if (!m_CurrentPreviewPiece.HasCollider(overlappingStuff[o]))
                        {
                            var terrainCollider = overlappingStuff[o] as TerrainCollider;

                            if (terrainCollider == null)
                            {
                                var piece = overlappingStuff[o].GetComponent <BuildingPiece>();

                                bool isSameBuilding = piece && m_HasSocket && piece.Building == m_LastValidSocket.Piece.Building;

                                if (!isSameBuilding)
                                {
                                    overlapsStuff = true;
                                    break;
                                }
                            }
                        }
                    }
                }

                if (m_HasSocket)
                {
                    //bool isStable = m_CurrentPreviewPiece.DoStabilityCheck(false);
                    m_PlacementAllowed = /*isStable && */ !overlapsStuff;
                }
                else
                {
                    m_PlacementAllowed = !m_CurrentPreviewPiece.RequiresSockets && !overlapsStuff;
                }
            }

            UpdatePreviewColor();
        }