텍스쳐 그리기
이 애드온은 텍스처 수정을 동기화하는 솔루션을 제공합니다.
개요
이 애드온의 로직은 그리기 포인트(위치, 색상, ... DrawinPoint) 세부 정보를 사용자 간에 공유하는 것입니다.
상태 권한
로직은 펜과 도면 표면 사이에 분할되며, 둘 다 네트워크 동작을 가지며, 펜과 대상 도면 사이에 잠재적으로 다른 상태 권한을 갖습니다:
- 펜 상태 권한은 펜을 쥐고 있습니다
- 여러 사용자가 동시에 표면에 그림을 그릴 수 있으므로 도면 표면 상태 권한이 도면 사용자가 아닐 수 있습니다.
그리기 단계
펜으로 새 그리기 부분을 추가하는 경우 먼저:
- 펜은 도면 표면에 추가해야 하는 도면 점을 감지하고(TexturePen 참고) 정보를 준비합니다(좌표, ...).
- 펜은 텍스처에 임시 선을 그어 즉시 표시합니다(네트워크 통신이 발생하면 도면 표면이 실제로 다시 그립니다)
- 펜에 그릴 최신 포인트는 펜의 네트워크 연결된 링 버퍼에 저장됩니다(TextureDrawer 참조). 그러면 모든 사용자가 그림에 포인트를 추가하려는 의지를 알 수 있습니다
그런 다음 상태 권한을 가진 클라이언트의 도면 표면:
- 펜에 새로운 점이 있다는 것을 감지합니다,
- 이 새 도면점을 최신 추가된 점의 링 버퍼에 저장합니다(같은 사용자가 펜과 도면을 모두 소유할 경우 펜 링 버퍼는 생략됩니다). TextureDrawing 참조
마지막으로 도면 표면의 새 최신 점을 보는 모든 클라이언트가 실제 질감으로 그립니다(TextureSurface 참조).
늦은 참가자
늦게 참여한 가입자의 경우 이 애드온의 도면 표면 컴포넌트는 Fusion 2 스트리밍 API를 사용하여 처음부터 추가된 전체 포인트 목록을 보냅니다.
텍스처 그리기
애드온은 텍스처를 편집하는 두 가지 방식을 제공합니다:
- 기본 솔루션은 셰이더 그래프로 만들어진 특정 드로잉 셰이더를 사용하므로 URP 및 HDRP 렌더 파이프라인과만 호환됩니다. 이 솔루션은 고해상도 텍스처에 더 적합합니다.
- 대체 솔루션은 비트맵 그리기 API를 제공하는
ProtoTurtle.BitmapDrawing
타사 솔루션을 사용하여 텍스처를 편집합니다.
공유-기반 그리기
LinePainter 셰이더는 텍스처에 선을 그릴 수 있습니다. 점에서 그어진 선까지의 거리를 결정하는 하위 그래프 LineSDK가 포함되어 있습니다.
그리는 로직은 다음과 같습니다:
- 도면 표면 머티리얼에 렌더 텍스처 사용
- 선을 그릴 필요가 있을 때마다
Graphics.Blit
를 사용하여 셰이더에 현재 렌더링 텍스처와 선 세부 정보를 제공하고 결과를 저장합니다
클래스 세부내용=
TexturePen
TexturePen
은 펜(BlockableTip
컴포넌트)에 위치하며, TextureDrawing
컴포넌트가 있는 BlockingSurface
컴포넌트와의 접촉을 감지합니다.
접촉이 탐지되면 로컬로 그려지는 점 목록이 업데이트됩니다. 그런 다음 각 점에 대해 TextureDrawer
의 AddDrawingPoint()
메소드를 FixedUpdateNetwork()
에서 호출합니다.
TextureDrawer
DataSyncHelpers 애드온의 RingBufferSyncBehaviour
클래스의 하위 클래스입니다.
펜과 드로잉 표면 사이의 접촉이 감지되었을 때 텍스처에 편집해야 하는 드로잉 포인트를 기록하는 데 사용됩니다.
이를 위해 TexturePen
은 AddDrawingPoint()
메소드를 사용하여 텍스처 표면에 배치해야 할 점 목록에 DrawingPoint
를 추가합니다.
동일한 사용자가 TexturePen
과 대상의 TextureDrawing
을 소유하고 있는 경우, TextureSurface
를 직접 편집하고 TextureDrawing
의 무손실 링 버퍼에 엔트리를 추가하여 OnNewEntries
의 콜백으로 원격 플레이어에게 알려줍니다.
그렇지 않으면 로컬 플레이어의 TextureDrawing
에서 로컬로 임시 그리기를 수행하고 TextureDrawer
링 버퍼에 새로운 항목을 추가합니다.
그러면 모든 플레이어는 TextureDrawer
링 버퍼에 새로운 데이터를 받게 되고, TextureDrawing
에 대한 상태 권한을 가진 원격 플레이어는 TextureDrawing
무손실 링 버퍼에 새로운 DrawingPoint
를 추가하게 됩니다.
TextureDrawing
DataSyncHelpers 애드온의 RingBufferLosslessSyncBehaviour
클래스의 하위 클래스입니다.
이 링 버퍼에는 TextureDrawer
컴포넌트가 추가된 이 그리기를 대상으로 하는 모든 DrawingPoint
가 포함되어 있습니다.
TextureDrawer
에 의해 링 버퍼에 새로운 엔트리가 추가되면 모든 플레이어에게 OnNewEntries()
가 호출되고 Draw()
메서드는 TextureSurface
를 업데이트하여 포인트를 추가하거나 선을 그립니다.
이 링 버퍼의 "손실이 적은" 특징 덕분에, 늦은 가입자들은 방에 들어갈 때 TextureSurface
에 그려야 하는 모든 포인트를 받게 됩니다.
TextureSurface
TextureSurface
는 Renderer
의 컴포넌트를 의미하며 텍스처 초기화, 텍스처 색상 변경, 점 그리기, 선 그리기 등 텍스처 편집을 위한 유틸리티 방법을 담고 있습니다.
따라서 이 클래스는 네트워크 부분과 연결되지 않습니다.
(DataSyncHelpers
의 애드온에서) IRenderTextureProvider
인터페이스를 구현합니다. 외부에서 텍스처를 편집한 경우 onRedrawRequired
이벤트가 발생하고 이 이벤트가 발생하면 TextureDrawing
에 구독하여 포인트를 모두 다시 그립니다.
DrawingPoint
이 클래스는 표면의 드로잉 점(위치, 색상, 압력 및 참조 Id)을 정의합니다. 이 referenceId
는 대상 TextureDrawing
또는 소스 TextureDrawer
를 저장하는 데 사용됩니다.
DataSyncHelpers
애드온의 RingBuffer.IRingBufferEntry
인터페이스를 구현합니다.
의존성
- DataSyncHelpers 애드온
- BlockingContact 애드온
데모
데모 씬은 Assets\Photon\FusionAddons\TextureDrawing\Demo\Scenes\
폴더에 있습니다.
다운로드
이 애드온의 최신 버전은 애드온 프로젝트에 포함되어 있습니다.
지원하는 토폴로지
- 공유 모드
타사 솔루션
- ProtoTurtle.BitmapDrawing, MIT 라이선스, https://github.com/ProtoTurtle/UnityBitmapDrawing
변경 내용
- 버전 2.0.0: 최초 릴리즈