public void CheckCanGroundTile(cObject pObj) { pObj.notUpBlocked = true; pObj.notGrounded = true; pObj.notRightBlocked = true; pObj.notLeftBlocked = true; CheckTiles(tileMap_canHit, pObj, pObj.rt.size); CheckTiles(tileMap_cannotHit, pObj, pObj.rt.size); if (pObj.notUpBlocked) { pObj.isUpBlocked = false; } if (pObj.notGrounded) { pObj.SetIsGrounded(false); } if (pObj.notLeftBlocked) { pObj.isLeftBlocked = false; } if (pObj.notRightBlocked) { pObj.isRightBlocked = false; } }
private void CheckTiles(Tilemap pTileMap, cObject pObj, Vector2 pSize) { Vector3 originTPos = pObj.originObj.transform.position; float originRtXLenHalf = pObj.rt.size.x * 0.5f; float originRtYLenHalf = pObj.rt.size.y * 0.5f; cellPos = new Vector3Int[] { new Vector3Int((int)originTPos.x, (int)originTPos.y + (int)(pSize.y * 0.7f), 0), new Vector3Int((int)originTPos.x + (int)(pSize.x * 0.4f), (int)originTPos.y + (int)(pSize.y * 0.7f), 0), new Vector3Int((int)originTPos.x + (int)(pSize.x * 0.8f), (int)originTPos.y, 0), new Vector3Int((int)originTPos.x + (int)(pSize.x * 0.4f), (int)originTPos.y - (int)(pSize.y * 0.7f), 0), new Vector3Int((int)originTPos.x, (int)originTPos.y - (int)(pSize.y * 0.7f), 0), new Vector3Int((int)originTPos.x - (int)(pSize.x * 0.4f), (int)originTPos.y - (int)(pSize.y * 0.7f), 0), new Vector3Int((int)originTPos.x - (int)(pSize.x * 0.8f), (int)originTPos.y, 0), new Vector3Int((int)originTPos.x - (int)(pSize.x * 0.4f), (int)originTPos.y + (int)(pSize.y * 0.7f), 0), }; for (short i = 0; i < cellPos.Length; i++) { Vector3Int worldToCellPos = pTileMap.WorldToCell(cellPos[i]); Vector3 cellToWorldPos = pTileMap.CellToWorld(worldToCellPos); TileBase t_tile = pTileMap.GetTile(worldToCellPos); if (t_tile != null) { switch (i) { //위쪽 충돌 case 0: //충돌하였다면.. if (originTPos.y + originRtYLenHalf > cellToWorldPos.y) { pObj.notUpBlocked = false; pObj.isUpBlocked = true; pObj.originObj.transform.position = new Vector3( originTPos.x, cellToWorldPos.y - originRtYLenHalf, originTPos.z ); } break; //오른쪽 위 충돌 case 1: //충돌하였다면.. if (originTPos.x + originRtXLenHalf > cellToWorldPos.x - 1 && originTPos.y + originRtYLenHalf > cellToWorldPos.y) { float distX = Mathf.Abs((originTPos.x + originRtXLenHalf) - cellToWorldPos.x); float distY = Mathf.Abs((originTPos.y + originRtYLenHalf) - cellToWorldPos.y); //가로 면적이 크다면 아래로 if (distX > distY) { pObj.notUpBlocked = false; pObj.isUpBlocked = true; pObj.originObj.transform.position = new Vector3( originTPos.x, cellToWorldPos.y - originRtYLenHalf, originTPos.z ); } //세로 면적이 크다면 왼쪽으로 else { pObj.notRightBlocked = false; pObj.isRightBlocked = true; pObj.originObj.transform.position = new Vector3( cellToWorldPos.x - originRtXLenHalf, originTPos.y, originTPos.z ); } } break; //오른쪽 충돌 case 2: //충돌하였다면.. if (originTPos.x + originRtXLenHalf > cellToWorldPos.x - 1) { pObj.notRightBlocked = false; pObj.isRightBlocked = true; pObj.originObj.transform.position = new Vector3( cellToWorldPos.x - originRtXLenHalf, originTPos.y, originTPos.z ); } Vector3 checkUpRightTile = new Vector3(pObj.originObj.transform.position.x, pObj.originObj.transform.position.y + tileSize, pObj.originObj.transform.position.z); break; //오른쪽 아래 충돌 case 3: //충돌하였다면.. if (originTPos.x + originRtXLenHalf > cellToWorldPos.x - 1 && originTPos.y - originRtYLenHalf < (cellToWorldPos.y + tileSize) + 1) { float distX = Mathf.Abs((originTPos.x + originRtXLenHalf) - cellToWorldPos.x); float distY = Mathf.Abs((originTPos.y - originRtYLenHalf) - (cellToWorldPos.y + tileSize)); //가로 면적이 크다면 위로 if (distX > distY) { pObj.notGrounded = false; pObj.SetIsGrounded(true); pObj.originObj.transform.position = new Vector3( originTPos.x, (cellToWorldPos.y + tileSize) + originRtYLenHalf, originTPos.z ); } //세로 면적이 크다면 왼쪽으로 else { pObj.notRightBlocked = false; pObj.isRightBlocked = true; pObj.originObj.transform.position = new Vector3( cellToWorldPos.x - originRtXLenHalf, originTPos.y, originTPos.z ); } } else if (originTPos.y - originRtYLenHalf < (cellToWorldPos.y + tileSize) + 1) { pObj.notGrounded = false; } break; //아래쪽 충돌 case 4: //충돌하였다면.. if (originTPos.y - originRtYLenHalf < (cellToWorldPos.y + tileSize)) { pObj.notGrounded = false; pObj.SetIsGrounded(true); pObj.originObj.transform.position = new Vector3( originTPos.x, (cellToWorldPos.y + tileSize) + originRtYLenHalf, originTPos.z ); } else if (originTPos.y - originRtYLenHalf < (cellToWorldPos.y + tileSize) + 1) { pObj.notGrounded = false; } break; //왼쪽 아래 충돌 case 5: //충돌하였다면.. if (originTPos.x - originRtXLenHalf < (cellToWorldPos.x + tileSize) - 1 && originTPos.y - originRtYLenHalf < (cellToWorldPos.y + tileSize) - 1) { float distX = Mathf.Abs((originTPos.x - originRtXLenHalf) - (cellToWorldPos.x + tileSize)); float distY = Mathf.Abs((originTPos.y - originRtYLenHalf) - (cellToWorldPos.y + tileSize)); //가로 면적이 크다면 위로 if (distX > distY) { pObj.notGrounded = false; pObj.SetIsGrounded(true); pObj.originObj.transform.position = new Vector3( originTPos.x, (cellToWorldPos.y + tileSize) + originRtYLenHalf, originTPos.z ); } //세로 면적이 크다면 오른쪽으로 else { pObj.notLeftBlocked = false; pObj.isLeftBlocked = true; pObj.originObj.transform.position = new Vector3( (cellToWorldPos.x + tileSize) + originRtXLenHalf, originTPos.y, originTPos.z ); } } else if (originTPos.y - originRtYLenHalf < (cellToWorldPos.y + tileSize) + 1) { pObj.notGrounded = false; } if (originTPos.x - originRtXLenHalf < (cellToWorldPos.x + tileSize) + 1) { pObj.notLeftBlocked = false; } break; //왼쪽 충돌 case 6: //충돌하였다면.. if (originTPos.x - originRtXLenHalf < (cellToWorldPos.x + tileSize) + 1) { pObj.notLeftBlocked = false; pObj.isLeftBlocked = true; pObj.originObj.transform.position = new Vector3( (cellToWorldPos.x + tileSize) + originRtXLenHalf, originTPos.y, originTPos.z ); } if (originTPos.x - originRtXLenHalf < (cellToWorldPos.x + tileSize) - 1) { pObj.notLeftBlocked = false; } break; //왼쪽 위 충돌 case 7: //충돌하였다면.. if (originTPos.x - originRtXLenHalf < (cellToWorldPos.x + tileSize) + 1 && originTPos.y + originRtYLenHalf > cellToWorldPos.y) { float distX = Mathf.Abs((originTPos.x - originRtXLenHalf) - (cellToWorldPos.x + tileSize)); float distY = Mathf.Abs((originTPos.y + originRtYLenHalf) - (cellToWorldPos.y)); //가로 면적이 크다면 아래로 if (distX > distY) { pObj.notUpBlocked = false; pObj.isUpBlocked = true; pObj.originObj.transform.position = new Vector3( originTPos.x, cellToWorldPos.y - originRtYLenHalf, originTPos.z ); } //세로 면적이 크다면 오른쪽으로 else { pObj.notLeftBlocked = false; pObj.isLeftBlocked = true; pObj.originObj.transform.position = new Vector3( (cellToWorldPos.x + tileSize) + originRtXLenHalf, originTPos.y, originTPos.z ); } } break; } originTPos = pObj.originObj.transform.position; } } //========for문 종료========// }