Exemple #1
0
    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;
        }
    }
Exemple #2
0
    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문 종료========//
    }