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); }
/// <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); }
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(); }