게임 패드를 전제로 하는 UI를 설치할 때 특정 클릭이나 터치 조작을 통해 버튼 클래스의 초점이 움직이지 않게 한다

5688 단어 uGUIUnity

개요


예를 들어 게임 매트 체조를 전제로 다음 UI가 설치되었을 때 버튼 이외의 곳(파란색 배경 부분 등)을 클릭/터치하면 버튼1에 걸린 포커스가 빠진다.
※ 캔버스 리모브'그래픽 레이캐스터'로도 판정이 나고, Bitbucket에 공개된 소스 파일의 해당 위치를 느끼면 이렇게 처리되기 때문에 고장 등이 아닌 의도적인 행동입니다.

이 방법 자체가'마우스/터치 조작과 키보드/게임 패드 조작에 대응하는 두 가지 게임'이므로'원래부터 마우스/터치 조작이 불가능한 환경'이라면 문제없을 것 같다.예컨대 둘 다 조작이 가능한 환경에서'게임 매트 조작만을 전제로 한 게임'을 만들려면 잘못 만든 클릭/터치 판정이 취소되면 버튼의 초점이 사라져 복구가 불가능하다는 문제가 발생할 수 있다.
어쨌든 이 일은 실상부에서 주의를 기울이면 피할 수 있지만 이번에는 "원래 이 규격을 피할 수 없나요?"그러고 보니 조사를 많이 해서 적어놨어요.
※ 경험증의 유니티 버전은 5.6.1p2

마우스/터치 작업 비활성화


다양한 정보를 수집하던 중 아래 슬라이드와 신경 쓰이는 글을 발견했다.

  • 프로그래머가 Unity에서 STG를 만드는 이야기
  • 18페이지: "Standalone InputModule 대신 Controller InputModule를 사용하면 마우스 조작을 무효화할 수 있습니다"
  • 그래서 즉시 글에 링크가 붙어 있는 ControllerInputModule를 가져와 분석하고 집행하여 마우스/터치 조작이 완전히 무효임을 확인하였다.
    우선 문제 자체를 회피할 수 있다.

    Controller InputModule 정보


    내용을 조사할 때 물품 자체는 기본적으로 준비된 Standalone Input Module에서 마우스/터치와 관련된 처리 형식의 물건을 단순히 삭제했다.
    ※ Input Module 및 Standalone Input Module에 대해서는 설명서 참조
  • 입력 모듈

  • Standalone Input Module
  • ※ Standalone Input Module을 포함한 Input Module 관련 소스 파일은 Bitbucket에 공개된 소스 파일에서 얻을 수 있습니다.
  • 사용 방법은 간단합니다. Hierrarchy의 이벤트시스템 대상에 첨부된 'Standalone Input Module' 를 Remove하고 대신 첨부해서 유효하게 하면 됩니다.
    ※ 주의해야 할 점은 Controller InputModule의 출처 자체가 낡았거나 일부는 API 호환성이라고 판단되는 부분에 오류가 발생할 수 있으므로 사용 시 새로운 API를 교체해야 합니다.

    "최신 버전의 반영" 및 "컨트롤 로고를 통해 마우스/터치 판정 전환" 설정


    상술한 주의점도 기재되어 있지만, Controller Input Module의 원래 소스는 과거의 것이 기본이 되었기 때문에, 최신 버전에 비해 API의 호환성을 제외하고는 처리가 몇 가지 다르다는 것을 발견했다.
    이를 바탕으로 마우스/터치 조작 자체도 완전히 삭제되고'마우스/터치 조작의 유효/무효 전환'을 하려면 Standalone Input Module를 사용해야 한다.나는'최신 버전의 반영'과'로고를 제어하는 마우스/터치로 전환'에 대응하는 사용자 정의 유형의 Inpud Module를 직접 만들었다.
    소스 자체는 유니티 5.6개의 물건을 기초로 한 것이기 때문에 같은 버전이나 비슷한 버전이면 움직일 수 있을 것이다.
    ※ 변경 내용은'm Enable Mouse'값에 따라 분할할 수 있도록 내부 처리를 통해 간단하게 진행된 마우스/터치 판정 처리만 변경되었습니다.아래 부분 발췌문.
    public override void Process()
    {
        bool usedEvent = SendUpdateEventToSelectedObject();
    
        if (eventSystem.sendNavigationEvents)
        {
            if (!usedEvent)
                usedEvent |= SendMoveEventToSelectedObject();
    
            if (!usedEvent)
                SendSubmitEventToSelectedObject();
        }
    
        // ※以降がマウス/タッチ関連のイベントとなるので、ここで処理を切り分け
        // →m_EnableMouseはInspector上からも設定可能
        if (!m_EnableMouse) { return; }
        // touch needs to take precedence because of the mouse emulation layer
        if (!ProcessTouchEvents() && input.mousePresent)
            ProcessMouseEvent();
    }
    
    소스 및 테스트 장면이 GiitHub에 업로드되었습니다.
    CustomStandaloneInputModule
    ※ 전체적으로 처리된 느낌은 마우스/터치 판정 자체가 유효하며, 버튼 이외의 버튼을 클릭해도 초점에서 벗어나지 않는 인풋모드도 할 수 없지는 않지만, 여기까지입니다.

    참조/관련 웹 사이트


  • 프로그래머가 Unity에서 STG를 만드는 이야기
  • stramit/ControllerInputModule.cs

  • 입력 모듈
  • Standalone Input Module
  • Unity-Technologies/ui
  • 좋은 웹페이지 즐겨찾기