영상을 보고 건축 시스템 기초를 만들게 되었다!

영상에서는 다음편도 기대해달라고 했는데 1년전 영상에 더이상 새로운 영상이 없다면 더 없는거겠지....

먼저 바닥으로 사용할 오브젝트

적당한 크기의 큐브를 만들어주고 각 끝 면에 3D 오브젝트 구체를 만들어 구체 오브젝트를 커넥터로 사용

영상에서 설명을 해주는데.. 해석을 해야해서 아직 완전히 이해는 못한상태

public class Connector : MonoBehaviour
{
    public ConnectorPosition connectorPosition;
    public SelectedBuildType connectorParentType;

    [HideInInspector] public bool isConnectedToFloor = false;
    [HideInInspector] public bool isConnectedToWall = false;
    [HideInInspector] public bool canConnectTo = true;

    [SerializeField] private bool canConnectToFloor = true;
    [SerializeField] private bool canConnectToWall = true;

    private void OnDrawGizmos()
    {
        // 빨강 - 어디어도 설치 불가, 파랑 - 벽에만 설치 가능, 초록 - 바닥 벽 둘다 설치 가능, 노랑 - 바닥에만 설치 가능
        Gizmos.color = isConnectedToFloor ? (isConnectedToWall ? Color.red : Color.blue) : (!isConnectedToWall ? Color.green : Color.yellow);
        Gizmos.DrawWireSphere(transform.position, transform.lossyScale.x / 2f);
    }

    public void UpdateConnectors(bool rootCall = false)
    {
        // 자기 위치를 중심으로 일정 반경 내에 있는 모든 Collider 검색
        Collider[] colliders = Physics.OverlapSphere(transform.position, transform.lossyScale.x / 2f);

        // 연결 상태 초기화 (연결 불가 상태로 설정)
        isConnectedToFloor = !canConnectToFloor;
        isConnectedToWall = !canConnectToWall;

        foreach (Collider collider in colliders)
        {
            // 자기 자신은 무시
            if (collider.GetInstanceID() == GetComponent<Collider>().GetInstanceID())
            {
                continue;
            }

            if (!collider.gameObject.activeInHierarchy)
            {
                continue;
            }

            // 같은 레이어의 오브젝트만 연결 대상으로 삼음
            if (collider.gameObject.layer == gameObject.layer)
            {
                // 해당 오브젝트에서 Connector 컴포넌트 가져오기
                Connector foundConnector = collider.GetComponent<Connector>();

                // 주변 오브젝트가 Floor(바닥) 타입이면, 바닥 연결됨으로 설정
                if (foundConnector.connectorParentType == SelectedBuildType.Floor)
                    isConnectedToFloor = true;

                // 주변 오브젝트가 Wall(벽) 타입이면, 벽 연결됨으로 설정
                if (foundConnector.connectorParentType == SelectedBuildType.Wall)
                    isConnectedToWall = true;

                // rootCall 옵션이 true면, 인접 오브젝트의 연결 상태도 재귀적으로 갱신
                if (rootCall)
                    foundConnector.UpdateConnectors();
            }
        }

        // 일단 연결 가능 상태로 설정
        canConnectTo = true;

        // 바닥과 벽에 모두 연결되어 있으면 연결 불가로 설정
        if (isConnectedToFloor && isConnectedToWall)
            canConnectTo = false;
    }
}

[System.Serializable]
public enum ConnectorPosition
{
    Left,
    Right,
    Top,
    Bottom
}

그다음 빌드 매니저
음 사용한 코드를 그대로 복붙하기엔 너무 많다..

건축 시스템을 만들면서 배우게 된 몇가지

  1. 건축을 할 때 보여주는 초록색(건축 가능!) 빨간색(건축 불가능!) 프리뷰는 일일이 설정해줘야 했다는것
    a. 프리뷰도 게임 오브젝트로 존재해야 게임에서 보여주기 때문에 설치하면 프리뷰 오브젝트를 삭제해야 함
  2. 건축에서 사용되는 커넥터의 위치를 가져올 때 반대되게 불러오도록 왼쪽은 오른쪽이랑 연결될 수 있게끔 설정 - 이어 붙이기 위해서

따라하면서 신기했는데 내일은 가구를 직접 깍아보자!

0개의 댓글