사용자의 평면 터치 여부 감지
Tutorial
·
Beginner
·
+10XP
·
60 mins
·
Unity Technologies

드디어 사용자가 평면을 터치하면 포털이 생성됩니다. 이 튜토리얼에서는 먼저 환경에서 감지된 평면을 사용자가 성공적으로 터치했는지 판별합니다.
이 기능을 구현하기 위해 레이캐스팅이라는 기법을 사용해 보겠습니다.
Languages available:
1. 개요
앱은 환경의 수직면 도는 수평면을 감지하며, 화면에 대한 사용자의 터치 위치도 감지합니다. 이제 사용자가 평면을 성공적으로 터치했는지 판별하려면 이 두 가지 기능을 사용해야 합니다.
나중에는 사용자가 평면을 터치하면 포털이 생성되므로 실제 환경의 표면을 통해 가상 세계를 볼 수 있습니다.
이 기능을 구현하기 위해 레이캐스팅이라는 기법을 사용해 보겠습니다.
2. 레이캐스팅의 정의
레이캐스팅은 원점에서 시작해 씬을 통과하며 보이지 않는 직선(광선)을 투사하여 직선과 만나는 오브젝트를 판별하는 프로세스입니다. 낚싯줄을 던져 어떤 물고기를 낚을 수 있는지 판별한다는 점에서 낚시와 조금 유사하기도 합니다. 레이캐스팅의 경우에는 광선을 쏘고 씬에서 이 광선과 만나는 오브젝트가 무엇인지 판별합니다.
레이캐스트가 닿는 모든 오브젝트는 일반적으로 목록 변수에 저장됩니다. 그러면 해당 목록 내에 있는 오브젝트에 액세스하여 관련 작업을 수행할 수 있습니다.

레이캐스트는 프로그래밍에서 매우 유용합니다. 예를 들어 광선을 쏘아 특정 무기가 타겟을 맞혔는지, 주변에 오브젝트가 있는지 등을 판별할 수 있습니다.
앱에서 레이캐스트는 화면에 있는 무언가를 사용자가 성공적으로 터치했는지 판별하는 데 도움이 됩니다. 사용자가 화면을 터치하면 앱에서는 터치 위치를 원점으로 사용하여 광선을 씬에 일직선으로 쏩니다. 광선이 평면에 부딪히면 앱은 이를 성공적인 터치로 등록합니다.
3. AR Raycast Manager 추가
이전에는 씬에서 감지되는 평면을 관리하기 위해 AR Plane Manager 컴포넌트를 추가했습니다. 이와 마찬가지로, 씬에서 레이캐스트를 관리하려면 AR Raycast Manager 컴포넌트가 필요합니다. AR Raycast Manager는 이 부분에 필요한 기능을 정확히 제공합니다. 즉, 화면 터치 위치에서 광선을 쏘고 그 광선이 수평면 또는 수직면과 같이 추적 가능한 오브젝트와 만나는지 여부를 판별합니다.
먼저 새 컴포넌트를 추가하는 방법은 다음과 같습니다.
1. 계층 구조에서 AR Session Origin 게임 오브젝트를 선택합니다.
2. 인스펙터에서 새로운 AR Raycast Manager 컴포넌트를 추가합니다.

4. AR Foundation 노드 라이브러리 추가
이 기능을 완성하려면 AR Raycast Manager: Raycast 비주얼 스크립팅 노드를 사용해야 합니다.

하지만 이 노드를 스크립트 그래프에 추가하려고 해도 노드 라이브러리에서 찾을 수 없습니다. 그래프 에디터에서 지금 바로 노드를 검색해 보세요. 결과가 표시되지 않을 것입니다.

지금까지 사실 AR 개발 또는 AR Foundation 패키지에 특화된 노드는 전혀 사용하지 않았습니다. 비주얼 스크립팅 라이브러리는 기본적으로 AR 관련 노드와 함께 제공되지 않습니다. AR Foundation 노드 라이브러리를 수동으로 임포트해야 AR 관련 노드를 추가할 수 있습니다.
아래의 영상을 시청하거나 지침을 따라 AR Foundation 노드 라이브러리를 임포트하세요.
1. 메인 메뉴에서 Edit > Project settings로 이동합니다.
2. Project Settings 창의 왼쪽 패널에서 Visual Scripting을 선택합니다.
3. 폴드아웃(세모)을 사용하여 Node Library 섹션을 확장한 다음 노드 어셈블리 목록 하단으로 스크롤합니다.
4. 목록 하단에서 추가(+)를 선택하여 목록에 새 항목을 추가합니다.
5. 새 항목의 어셈블리 드롭다운을 선택한 다음 'AR Foundation'을 검색하고 Unity.XR.ARFoundation을 선택합니다.
6. 목록 아래에서 Regenerate Nodes를 선택하여 Script Graph 창에서 액세스 가능한 새 노드를 생성합니다.

7. 그래프 에디터에서 퍼지 파인더를 사용하여 'AR Raycast Manager'를 검색하고 이제 AR 관련 노드를 사용할 수 있는지 확인합니다.
5. 레이캐스팅에 필요한 변수 추가
이 기능을 완성하려면 비주얼 스크립트에 2개의 새로운 Object 변수, 즉 방금 추가한 AR Raycast Manager 컴포넌트용 변수, 그리고 레이캐스트에 닿는 오브젝트를 저장할 목록용 변수가 필요합니다.
레이캐스트가 목적에 따라 오브젝트를 맞히면 해당 레이캐스트는 맞힌 오브젝트의 목록을 생성합니다. 새 변수로 해당 목록을 저장해야 합니다. 이 예에서는 Aot List라는 특정 유형의 목록을 사용합니다. AOT는 Ahead Of Time(예정보다 빠름)을 의미하는데, 이는 애플리케이션이 실행되기도 전에 목록이 정의되기 때문입니다.
다음 지침에 따라 AR Raycast Manager와 Aot List에 필요한 새 변수를 생성하세요.
1. TapToPlace 스크립트가 Script Graph 창에서 열려 있는지 확인합니다.
2. Blackboard에서 Object 변수 탭을 선택합니다.
3. 'arRaycastManager'라는 새 변수를 생성하고 Type을 AR Raycast Manager로 설정합니다.
4. Value 오브젝트 피커(동그라미 모양)를 선택하고 AR Raycast Manager 컴포넌트가 포함된 AR Session Origin을 선택합니다.
5. 'hits'라는 또 다른 새 변수를 생성하고 Type을 Aot List로 설정하되 Value는 비워 둡니다. 그러면 앱이 실행되는 동안 레이캐스트가 오브젝트를 목록에 추가합니다.

이제 레이캐스트 구현에 필요한 모든 변수가 있습니다.
6. Raycast 노드를 노드 시퀀스에 추가
앱은 사용자 터치 위치를 판별한 직후에 레이캐스트를 수행하지만, 그 시점은 앱이 디버그 UI에 메시지를 보내기 전입니다.
아래의 영상을 시청하거나 지침을 따라 Raycast 노드를 그래프에 추가하세요.
1. 그래프 에디터에서 Get Touch 및 Get Position 노드 뒤에 새로운 Raycast 노드를 위한 공간을 만듭니다.
2. 퍼지 파인더를 사용하여 AR Raycast Manager: Raycast (Screen Point, Hit Results, Trackable Types) 노드를 추가합니다.
중요: 위에 나와 있는 특정 입력이 포함된 Raycast 노드를 선택해야 합니다. 동일한 기능을 제공하지 않는데 입력은 매우 유사한 다른 노드가 있습니다.
3. 레이캐스트가 Get Touch 노드 뒤, To String 노드 전에 수행되도록 노드의 연결을 해제했다가 다시 연결합니다.

이제 시퀀스에서 Raycast 노드가 올바르게 배치되었습니다.
7. Raycast 노드 입력 설정
이제 특정 입력을 포함하여 레이캐스트를 설정할 준비가 되었습니다. Raycast 노드를 선택하면 Graph Inspector에서 이 노드에 필요한 모든 입력을 살펴볼 수 있습니다.

아래의 영상을 시청하거나 지침을 따라 Raycast 노드 입력을 설정하세요.
1. Blackboard에서 Object 탭으로 이동합니다. arRaycastManager 및 hits 변수를 클릭하여 그래프 에디터로 드래그합니다.
2. Target 입력을 arRaycastManager 변수 노드에 연결합니다.
3. Screen Point 입력을 Get Position 노드에 연결합니다.
4. Hit Results 입력을 hits 변수 노드에 연결합니다.
5. Raycast 노드의 Trackable Types 프로퍼티를 None으로 설정하여 사용 가능한 모든 옵션의 선택을 해제한 후 Plane Within Polygon을 선택합니다.

8. 디버그 UI에 레이캐스트 결과 표시
디버그 UI를 사용하여 앱이 올바르게 작동하는지 확인해야 합니다. 사용자가 유효한 평면을 터치하면 참을, 유효하지 않은 곳을 터치하면 거짓을 표시하도록 디버그 UI를 설정해 보겠습니다. 이렇게 하면 사용자가 앱에서 포털이 배치될 수 있는 평면을 선택하고 있는지 여부를 앱이 올바르게 기록하고 있음을 확인할 수 있습니다.
이전에는 Vector 2: To String 노드를 사용하여 터치 위치를 UI에 표시할 수 있는 텍스트로 전환했습니다. 하지만 Raycast 노드를 사용하여 다른 접근 방식을 취할 수 있습니다.
Raycast 노드를 선택하고 Graph Inspector를 확인해 보면 출력이 레이캐스트가 평면에 닿았는지 여부를 나타내는 참 또는 거짓, 즉 부울 값임을 알 수 있습니다.

디버그 UI에 터치 위치를 표시하는 대신 이제 해당 부울을 표시하게 됩니다. 따라서 Vector 2: To String 노드가 아니라 Boolean: To String 노드가 필요합니다.
아래 동영상을 시청하거나 지침에 따라 디버그 UI의 메시지를 Raycast 노드의 부울 출력으로 대체하세요.
1. 그래프 에디터에서 Vector 2: To String 노드를 오른쪽 클릭하고 Replace를 선택합니다. Boolean: To String () 노드를 대신 검색하고 선택합니다.
2. Raycast 출력을 To String 입력에 연결합니다. To String 노드의 출력은 계속 Set Text 노드에 연결해야 합니다.

3. 앱을 빌드하고 실행하여 새로운 기능을 미리 봅니다. 유효한 평면을 터치하면 UI에 True가 표시되어야 하며, 유효한 평면이 아닌 곳을 터치하면 UI에 False가 표시되어야 합니다.
축하합니다. 사용자의 화면 터치를 감지할 수 있도록 레이캐스팅을 성공적으로 사용했습니다.
9. 추가 작업
기술을 더 개발하거나, 새로운 개념을 살펴보거나, 프로젝트를 개선하려면 아래의 추가 활동을 확인해 보세요.
이 활동은 필수는 아니므로 관심이 없다면 이 단계를 건너뛰어도 무방합니다.
이 학습 경험을 최대한 활용하려면 이러한 종류의 과제를 시도해 보세요. 행운을 빕니다!
보통: 더욱 구체적인 디버그 메시지 연결
이 튜토리얼에서는 디버그 UI에 'true' 또는 'false'라고 하는 부울 값을 표시했습니다. 이는 아주 명확한 디버그 메시지가 아니며, 'plane touched: true' 또는 'plane touched: false'와 같이 더 구체적이어야 합니다.
이러한 종류의 메시지를 표시하려면 '연결'을 사용해야 합니다. 프로그래밍 용어인 연결(concatenation)은 문자로 구성된 여러 문자열을 함께 잇는 프로세스를 말합니다. 일반 텍스트 문자열(예: 'plane touched:')을 보다 동적인 데이터(예: 부울 값)와 연결하여 데이터의 가독성을 높이는 경우가 많습니다. 앱에서 보다 유용한 연결된 디버그 메시지를 구현할 수 있는지 알아보세요.
이 과제를 완료하는 데 도움이 필요한 경우에는 다음 가이드를 확인해 보세요.
- String: Concat (arg 0, arg 1) 노드를 사용합니다.
- 'plane touched: '이라는 간단한 문자열을 첫 번째 입력에, Raycast 부울을 두 번째 입력에 연결합니다.
- Concat 노드 출력을 Set Text 노드에 연결합니다.
10. 다음 단계
이 튜토리얼에서는 레이캐스트를 사용하여 사용자가 화면에 유효한 평면 타겟을 터치했는지 여부를 판별했습니다. 다음 튜토리얼에서는 실제로 포털 게임 오브젝트를 씬에 생성하여 사용자가 선택한 평면에 배치합니다.