유니티/유니티 공부

#5 맵 생성 보완(점선 메터리얼, 강조 효과)

DOlpa_ 2026. 2. 26. 23:01
728x90

이번엔 스테이지 맵을 더 보기좋게 보완해보도록 하겠다

 

 

가장 먼저 거슬리는 분홍색 실선부터 검정 점선으로 바꿔보도록 하자

 

 

 

우선 점선으로 쓰일 선 이미지를 하나 만들어준다

절반은 검정, 절반은 투명이다. (중요! 세로가 아니라 가로로 만들어줄것. 유니티는 가로 기준으로 반복한다)

 

이미지를 가져와 설정을 만져준다

텍스쳐타입, Wrap Mode > Repeat, Filter Mode > Point

Max Size, Compression 모두 알아서 맞춰주자

 

 

그리고 메터리얼을 하나 만들고 쉐이더를 Unlit/Transparent로 잡아주자

그리고 저 안에 내가 방금 가져온 이미지를 넣어주면 된다

 

그리고 여태 공석이었던 라인 메터리얼 자리에 넣어주면 끝!

 

 

아... 근데 딱 보니까 이미지가 들어가 반복없이 딱 한번만 보여주는것 같다

내가 원하는 점선은 이런 느낌이 아니다

 

    void CreateLine(Vector2 start, Vector2 end)
    {
    
    ....

        이미지를 쭈욱 늘리지 말고, 타일(Tile)처럼 반복해서 붙이도록 설정!
        lr.textureMode = LineTextureMode.Tile;

        // 3. 선의 거리를 계산해서 점선이 몇 번 반복될지(촘촘함) 결정
        float distance = Vector2.Distance(start, end);
        float repeatingFactor = 0.5f; // 숫자를 키울수록 점선이 더 촘촘해짐. 이게 중요
        lr.material.mainTextureScale = new Vector2(distance * repeatingFactor, 1f);
    }

 

코드를 조금 손봐주자 여기서 중요한건 점선을 촘촘하게 만드는 저 변수. 0.5 정도는 내려야 딱 알맞게 나온다

 

 

우와! 선이 좀 더 굵어도 이쁠것 같은데 이건 나중에 아이콘 싹 다 갈아엎으면서 그때 고쳐보도록 하자

 

 

----------------------------

 

이번엔 현재 진행상황에 해당되는 오브젝트만 활성화하도록 해보겠다

 

    [Header("게임 진행 상황")]
    public int currentFloor = 0;

 

일단 게임매니저에 현재 진행 상황을 담고 있는 변수를 하나 추가해준다

 

    void Start()
    {
        originalScale = transform.localScale;
        spriteRenderer = GetComponent<SpriteRenderer>();
        originalColor = spriteRenderer.color;
        nodeCollider = GetComponent<Collider2D>();
        
        // 현재 층인지 확인
        if (myNodeData != null && GameManager.instance != null)
        {
            bool isCurrentFloor = (myNodeData.y == GameManager.instance.currentFloor);
            
            if (isCurrentFloor)
            {
                // 현재 층 노드: 펄스 애니메이션과 원래 색상 유지, 콜라이더 활성화
                pulseTween = transform.DOScale(originalScale * 1.2f, 0.8f)
                    .SetLoops(-1, LoopType.Yoyo)
                    .SetEase(Ease.InOutSine);
                
                if (nodeCollider != null)
                    nodeCollider.enabled = true;
            }
            else
            {
                // 다른 층 노드: 색상 어둡게 (RGB 150/255) 및 콜라이더 비활성화
                Color dimmedColor = new Color(150f/255f, 150f/255f, 150f/255f, originalColor.a);
                spriteRenderer.color = dimmedColor;
                
                if (nodeCollider != null)
                    nodeCollider.enabled = false;
            }
        }
    }

 

 

그리고 currentFloor의 값과 mynodedata.y 값이 일치하는 이미지만

커졌다 작아졌다 하는 효과를 주고

 

그 외에 나머지 오브젝트들은 RGB값을 150으로 내린 뒤 클릭 비활성화를 걸어놔

누가봐도 해금되지 않는 것처럼 보이는 효과를 준다

 

 

그럼 이렇게 된다. 이제 영상을 첨부 못한다는 사실이 너무나 통탄스럽다 흑흑

 

    void OnMouseUpAsButton()
    {
        if (myNodeData != null)
        {
            Debug.Log($"클릭 성공! 여기는 {myNodeData.y + 1}층에 있는 {myNodeData.type} 방입니다.");
            SceneManager.LoadScene("InGameScene");
        }
    }

 

추가로 이제 오브젝트를 클릭 혹은 터치를 하면 인게임씬으로 이동한다

터치 오류를 방지하기 위해 OnMouseUpAsButton 을 사용했다

 

이렇게 하면 드래그하는 과정에서 닿은 오브젝트는 클릭으로 간주하지 않는다 

728x90
반응형