게임의 튜토리얼을 제작하다가 다른 input은 무시하고 정해진 버튼만 클릭할 수 있게 해야 하는 상황이 생겼다.

여러가지 방법을 고민해봤다. 나의 경우는 ScrollRect와 Grid Layout Group을 사용해서 버튼 오브젝트의 parent를 바꾸거나 버튼의 sibling을 추가하면 안됐다. 그러다가 내린 결론.

Canvas의 최상단에 주어진 버튼의 rect만 제외하고는 Raycast Target인 투명한 이미지로 가려서 해당 버튼만 눌릴 수 있게..

 

예시 (이후 투명하게 변경)

이렇게 하기 위해서는 총 4개(좌측, 우측, 상단, 하단)의 이미지 오브젝트가 필요하다.

#주의 Canvas의 최상단에 있어야 input을 막을 수 있다.

 

이미지 오브젝트들의 anchor와 pivot은 다음과 같이 설정해준다.

좌측 블럭
우측 블럭
상단 블럭
하단 블럭

 

코드는 다음과 같다.

 

    [SerializeField]
    private RectTransform[] _blocks; // 4개의 이미지 객체들
    
    private enum Block
    {
        Left,
        Right,
        Top,
        Bottom
    }
    
    // targetRectTM : 유저가 터치하길 원하는 오브젝트의 RectTransform
    public void BlockInputExceptRect(RectTransform targetRectTM)
    {
        _blocks[(int)Block.Left].sizeDelta = new Vector2(targetRectTM.position.x - targetRectTM.rect.width / 2, 0);
        _blocks[(int)Block.Right].sizeDelta = new Vector2(Screen.width - targetRectTM.position.x - targetRectTM.rect.width / 2, 0);
        _blocks[(int)Block.Top].sizeDelta = new Vector2(0, Screen.height - targetRectTM.position.y - targetRectTM.rect.height / 2);
        _blocks[(int)Block.Bottom].sizeDelta = new Vector2(0, targetRectTM.position.y - targetRectTM.rect.height / 2);
        for (int i = 0; i < _blocks.Length; i++)
            _blocks[i].gameObject.SetActive(true);
    }

    public void HideBlocks()
    {
        for (int i = 0; i < _blocks.Length; i++)
            _blocks[i].gameObject.SetActive(false);
    }

 

_blocks에는 Inspector에서 좌측, 우측, 상단, 하단 블럭을 순서대로 넣어준다.

#주의 버튼 오브젝트의 Scale이 (1, 1, 1)일 떄만 적용 가능!

 

결과

아주 잘 작동한다!!

+ Recent posts