VRChat 세계 개발 동기화 노하우
개요
VRChat을 만드는 세계적인 익살에서 피할 수 없는 동기화 문제.
동기화 처리를 구성할 때 내가 중요하게 생각하는 점을 설명하고 싶다.
1. 기초 지식
BroadCastType 및 VRCObjectSync
우선 동기화를 진행할 때 가장 중요한 두 가지 요소를 이해해 주십시오.
VRChat에서는 플레이어의 위치를 제외하고 특별한 처리를 하지 않으면 동기화되지 않습니다.
대부분의 동기화 처리는 이 두 요소에 의해 실행된다.
VRC_Trigger의 BroadCastType을 Local 이외에 설정하여 조건이 충족되면 Actions를 세계의 다른 유저에게 반영할 수 있습니다.
여기서 중요한 것은'조건을 충족하는 플레이어는 액션만 전파한다'는 것이다.
다른 유저의 조건 충족 여부는 Action의 전파와 무관하다는 것을 기억하세요.
BroadCastType을 통한 동기화란
모든 유저가 동일 동작 ≈ 모든 유저가 동일 상태
이런 이유가 있지만 액션스의 전파에는 통신 장애가 있어 중력 등 외부 영향을 받으면 편차가 생길 수 있다.
거기서 사용된 건 VRC입니다.ObjectSync는 말 그대로 객체의 위치를 실시간으로 동기화하는 구성 요소입니다.
언뜻 보기엔 너무 편한 VRC.ObjectSync입니다. 질문이 하나 있습니다.
BroadCastType은 조건을 만족하는 유저를 기준으로 Action 동기화를 진행합니다.
VRC_ObjectSync는 위치 동기화를 누가 기준으로 했습니까?"
정답은 경영 능력을 가진 유저다.
소유자 자격은 Pickup 또는 Take OwnnerShip 함수를 실행할 때 이동합니다.
SpawnObject 동작에서 발생하는 객체는 해당 동작을 수행한 유저가 소유자 자격을 가집니다.
스크립트 이동과 관련된 대상을 동기화하려면 누가 소유자 자격을 가지고 있는지 알아야 합니다.
2. 동기화 Tips
처리할 유저를 한 명으로 압축
앞에서 말한 바와 같이 동기화 처리는 반드시 한 유저를 기준으로 해야 한다.
여러 명의 유저가 처리에 참여할 때 통신 지연까지 겹쳐 동기화가 매우 어려워지기 때문에 기본적으로 한 유저가 처리한다.
Local 활용
BroadCastType의 Local은 Action을 다른 사용자에게 전파하지 않습니다.
Local에서 구성 요소의 Enable 및 Animatior 매개변수를 변경하여 특정 사용자만 처리할 수 있습니다.
또한 일부 VRCTrigger의 조건이 복수의 유저가 동시에 만족하는 경우도 있기 때문에 그때도 로컬을 사용해 액션스가 더 많이 퍼지지 않도록 했다.
모든 유저의 조건을 만족시켜야 합니다
OnPlayerJoined OnPlayerLeft OnSpawn OnDestroy OnStationEntered OnStationExited
상황에 따라 여러 유저가 만족하는 조건
Custom OnEnable OnTimer OnEnterTrigger OnExitTrigger OnEnterCollider OnExitCollider OnAvatarHit
마스터로 처리하다
특정 플레이어가 처리할 필요가 없는 상황에서 세계의 마스터에서 처리하는 것이 효과적이다.
BroadCastType의 마스터는 이 조건을 충족한 것이 세계의 마스터인 상황에서만 액션의 집행, 전파를 진행한다.
Always의 Activate Custom Trigger로 마스터에 불을 붙이는 Custom 등 방법으로 모든 처리를 마스터에 집중시킨다.
모양새만 동기화
VRC_ObjectSync에 가입한 대상은 친자 구조가 복잡해지면 경영 자격 취득 문제가 발생하기 쉽다.
이 경우 실제 이동하는 객체는 동기화되지 않으며 모/자 관계 이외의 모양새 및 이퀄라이저에만 있는 객체는 AutoCam, FoollowTarget+LookatTarget가 따르고 VRC가 따릅니다.ObjectSync를 추가하여 동기화 작업을 단순화합니다.
VRC_스테이션에서 플레이어를 이동할 때 피카도 난폭한 현상의 대책으로 바뀐다.
3. 실용 실례
Google Drive에 Unity Package가 업로드되었으므로 가져오고 보십시오.
https://drive.google.com/open?id=1927gFc3JDWZjh-U2soV9BOB-dkz-D4SG
싱크로나이즈드 도어
Prefab 이름 "SyncDoor"
애니메이션으로 닫은 문입니다.
문을 여닫는 정도의 애니메이션을 전환하는 경우 Animatior의 매개변수 변경은 Always를 통해 충분히 동기화할 수 있습니다.
Togle을 사용하지 않고 True 및 False로 객체를 분리합니다.
최근 VRCSyncAnimation을 사용한 동기도 확립됐고 애니메이션의 종류가 많은 경우 등은 그쪽이 안정적이지 않을까 싶습니다.
타이머
Prefab 이름 "TimerSystem"
간편한 카운트다운 타이머.
타이머가 시작되면 Animatior는 1초마다 Timer라는 Custom 트리거를 시작합니다.
이를 로컬로 직접 처리하면 각각의 PC 처리 속도에 따라 타이머의 경과에 차이가 생긴다.
최초의 타이머 시동은 Always로 진행되었고 시간의 진행 처리는 마스터의 것이었으며 모든 유저의 시간의 처리는 세계 마스터가 통일적으로 동기화했다.
총알 재사용 총
Prefab 이름 "ResetPositiongun"
VRC_Scene ResetPosition을 사용하여 총알이 움직이지 않도록 반복적으로 사용하는 총입니다.
총을 들 때 처리하는 것이 가장 중요하다. 우선 총을 든 사람이 모든 총알의 소유자 자격을 얻도록 한다.
그리고 Always에서 모든 게이머들은 Collider와FoollowTarget Disable을 사용하고, Local에서 같은 요소를 반대로 Enable로 바꾼다.
동기화 기준이 되는 플레이어와 이를 제외한 플레이어를 구분하기 위한 처리로 매우 중요하다.
VRC FrollowTarget는 동기화 유저를 제외한 다른 유저는 모두 Enabe라고 밝혔다ObjectSync를 덮어쓰는 위치 동기화로 기준 플레이어 중 총알을 사용하지 않았을 때 세계 상공에 보관되므로 로컬에서 변경됩니다.
그 다음은 총알이 발사된 후 애니메이션 활동에서 Custom 트리거를 호출하여 ResetPosition 함수와 AddForce의 Actions를 설정합니다.
4. 끝말
동기화하는 방법은 정답이 없고 방법은 무한하다.
하고 싶은 처리에 따라 가장 적합한 수단도 달라지기 때문에 제가 취한 수단도 참고 중 하나일 뿐입니다. 자신에게 맞는 방법을 찾아보세요.좋은 방법을 찾으면 나누면 즐거워요.
VRChat 기술 노트
http://vrcworld.wiki.fc2.com/
Reference
이 문제에 관하여(VRChat 세계 개발 동기화 노하우), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hatsuca_vr/items/63ee6ba04d2a785eed16
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
BroadCastType 및 VRCObjectSync
우선 동기화를 진행할 때 가장 중요한 두 가지 요소를 이해해 주십시오.
VRChat에서는 플레이어의 위치를 제외하고 특별한 처리를 하지 않으면 동기화되지 않습니다.
대부분의 동기화 처리는 이 두 요소에 의해 실행된다.
VRC_Trigger의 BroadCastType을 Local 이외에 설정하여 조건이 충족되면 Actions를 세계의 다른 유저에게 반영할 수 있습니다.
여기서 중요한 것은'조건을 충족하는 플레이어는 액션만 전파한다'는 것이다.
다른 유저의 조건 충족 여부는 Action의 전파와 무관하다는 것을 기억하세요.
BroadCastType을 통한 동기화란
모든 유저가 동일 동작 ≈ 모든 유저가 동일 상태
이런 이유가 있지만 액션스의 전파에는 통신 장애가 있어 중력 등 외부 영향을 받으면 편차가 생길 수 있다.
거기서 사용된 건 VRC입니다.ObjectSync는 말 그대로 객체의 위치를 실시간으로 동기화하는 구성 요소입니다.
언뜻 보기엔 너무 편한 VRC.ObjectSync입니다. 질문이 하나 있습니다.
BroadCastType은 조건을 만족하는 유저를 기준으로 Action 동기화를 진행합니다.
VRC_ObjectSync는 위치 동기화를 누가 기준으로 했습니까?"
정답은 경영 능력을 가진 유저다.
소유자 자격은 Pickup 또는 Take OwnnerShip 함수를 실행할 때 이동합니다.
SpawnObject 동작에서 발생하는 객체는 해당 동작을 수행한 유저가 소유자 자격을 가집니다.
스크립트 이동과 관련된 대상을 동기화하려면 누가 소유자 자격을 가지고 있는지 알아야 합니다.
2. 동기화 Tips
처리할 유저를 한 명으로 압축
앞에서 말한 바와 같이 동기화 처리는 반드시 한 유저를 기준으로 해야 한다.
여러 명의 유저가 처리에 참여할 때 통신 지연까지 겹쳐 동기화가 매우 어려워지기 때문에 기본적으로 한 유저가 처리한다.
Local 활용
BroadCastType의 Local은 Action을 다른 사용자에게 전파하지 않습니다.
Local에서 구성 요소의 Enable 및 Animatior 매개변수를 변경하여 특정 사용자만 처리할 수 있습니다.
또한 일부 VRCTrigger의 조건이 복수의 유저가 동시에 만족하는 경우도 있기 때문에 그때도 로컬을 사용해 액션스가 더 많이 퍼지지 않도록 했다.
모든 유저의 조건을 만족시켜야 합니다
OnPlayerJoined OnPlayerLeft OnSpawn OnDestroy OnStationEntered OnStationExited
상황에 따라 여러 유저가 만족하는 조건
Custom OnEnable OnTimer OnEnterTrigger OnExitTrigger OnEnterCollider OnExitCollider OnAvatarHit
마스터로 처리하다
특정 플레이어가 처리할 필요가 없는 상황에서 세계의 마스터에서 처리하는 것이 효과적이다.
BroadCastType의 마스터는 이 조건을 충족한 것이 세계의 마스터인 상황에서만 액션의 집행, 전파를 진행한다.
Always의 Activate Custom Trigger로 마스터에 불을 붙이는 Custom 등 방법으로 모든 처리를 마스터에 집중시킨다.
모양새만 동기화
VRC_ObjectSync에 가입한 대상은 친자 구조가 복잡해지면 경영 자격 취득 문제가 발생하기 쉽다.
이 경우 실제 이동하는 객체는 동기화되지 않으며 모/자 관계 이외의 모양새 및 이퀄라이저에만 있는 객체는 AutoCam, FoollowTarget+LookatTarget가 따르고 VRC가 따릅니다.ObjectSync를 추가하여 동기화 작업을 단순화합니다.
VRC_스테이션에서 플레이어를 이동할 때 피카도 난폭한 현상의 대책으로 바뀐다.
3. 실용 실례
Google Drive에 Unity Package가 업로드되었으므로 가져오고 보십시오.
https://drive.google.com/open?id=1927gFc3JDWZjh-U2soV9BOB-dkz-D4SG
싱크로나이즈드 도어
Prefab 이름 "SyncDoor"
애니메이션으로 닫은 문입니다.
문을 여닫는 정도의 애니메이션을 전환하는 경우 Animatior의 매개변수 변경은 Always를 통해 충분히 동기화할 수 있습니다.
Togle을 사용하지 않고 True 및 False로 객체를 분리합니다.
최근 VRCSyncAnimation을 사용한 동기도 확립됐고 애니메이션의 종류가 많은 경우 등은 그쪽이 안정적이지 않을까 싶습니다.
타이머
Prefab 이름 "TimerSystem"
간편한 카운트다운 타이머.
타이머가 시작되면 Animatior는 1초마다 Timer라는 Custom 트리거를 시작합니다.
이를 로컬로 직접 처리하면 각각의 PC 처리 속도에 따라 타이머의 경과에 차이가 생긴다.
최초의 타이머 시동은 Always로 진행되었고 시간의 진행 처리는 마스터의 것이었으며 모든 유저의 시간의 처리는 세계 마스터가 통일적으로 동기화했다.
총알 재사용 총
Prefab 이름 "ResetPositiongun"
VRC_Scene ResetPosition을 사용하여 총알이 움직이지 않도록 반복적으로 사용하는 총입니다.
총을 들 때 처리하는 것이 가장 중요하다. 우선 총을 든 사람이 모든 총알의 소유자 자격을 얻도록 한다.
그리고 Always에서 모든 게이머들은 Collider와FoollowTarget Disable을 사용하고, Local에서 같은 요소를 반대로 Enable로 바꾼다.
동기화 기준이 되는 플레이어와 이를 제외한 플레이어를 구분하기 위한 처리로 매우 중요하다.
VRC FrollowTarget는 동기화 유저를 제외한 다른 유저는 모두 Enabe라고 밝혔다ObjectSync를 덮어쓰는 위치 동기화로 기준 플레이어 중 총알을 사용하지 않았을 때 세계 상공에 보관되므로 로컬에서 변경됩니다.
그 다음은 총알이 발사된 후 애니메이션 활동에서 Custom 트리거를 호출하여 ResetPosition 함수와 AddForce의 Actions를 설정합니다.
4. 끝말
동기화하는 방법은 정답이 없고 방법은 무한하다.
하고 싶은 처리에 따라 가장 적합한 수단도 달라지기 때문에 제가 취한 수단도 참고 중 하나일 뿐입니다. 자신에게 맞는 방법을 찾아보세요.좋은 방법을 찾으면 나누면 즐거워요.
VRChat 기술 노트
http://vrcworld.wiki.fc2.com/
Reference
이 문제에 관하여(VRChat 세계 개발 동기화 노하우), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hatsuca_vr/items/63ee6ba04d2a785eed16
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Google Drive에 Unity Package가 업로드되었으므로 가져오고 보십시오.
https://drive.google.com/open?id=1927gFc3JDWZjh-U2soV9BOB-dkz-D4SG
싱크로나이즈드 도어
Prefab 이름 "SyncDoor"
애니메이션으로 닫은 문입니다.
문을 여닫는 정도의 애니메이션을 전환하는 경우 Animatior의 매개변수 변경은 Always를 통해 충분히 동기화할 수 있습니다.
Togle을 사용하지 않고 True 및 False로 객체를 분리합니다.
최근 VRCSyncAnimation을 사용한 동기도 확립됐고 애니메이션의 종류가 많은 경우 등은 그쪽이 안정적이지 않을까 싶습니다.
타이머
Prefab 이름 "TimerSystem"
간편한 카운트다운 타이머.
타이머가 시작되면 Animatior는 1초마다 Timer라는 Custom 트리거를 시작합니다.
이를 로컬로 직접 처리하면 각각의 PC 처리 속도에 따라 타이머의 경과에 차이가 생긴다.
최초의 타이머 시동은 Always로 진행되었고 시간의 진행 처리는 마스터의 것이었으며 모든 유저의 시간의 처리는 세계 마스터가 통일적으로 동기화했다.
총알 재사용 총
Prefab 이름 "ResetPositiongun"
VRC_Scene ResetPosition을 사용하여 총알이 움직이지 않도록 반복적으로 사용하는 총입니다.
총을 들 때 처리하는 것이 가장 중요하다. 우선 총을 든 사람이 모든 총알의 소유자 자격을 얻도록 한다.
그리고 Always에서 모든 게이머들은 Collider와FoollowTarget Disable을 사용하고, Local에서 같은 요소를 반대로 Enable로 바꾼다.
동기화 기준이 되는 플레이어와 이를 제외한 플레이어를 구분하기 위한 처리로 매우 중요하다.
VRC FrollowTarget는 동기화 유저를 제외한 다른 유저는 모두 Enabe라고 밝혔다ObjectSync를 덮어쓰는 위치 동기화로 기준 플레이어 중 총알을 사용하지 않았을 때 세계 상공에 보관되므로 로컬에서 변경됩니다.
그 다음은 총알이 발사된 후 애니메이션 활동에서 Custom 트리거를 호출하여 ResetPosition 함수와 AddForce의 Actions를 설정합니다.
4. 끝말
동기화하는 방법은 정답이 없고 방법은 무한하다.
하고 싶은 처리에 따라 가장 적합한 수단도 달라지기 때문에 제가 취한 수단도 참고 중 하나일 뿐입니다. 자신에게 맞는 방법을 찾아보세요.좋은 방법을 찾으면 나누면 즐거워요.
VRChat 기술 노트
http://vrcworld.wiki.fc2.com/
Reference
이 문제에 관하여(VRChat 세계 개발 동기화 노하우), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hatsuca_vr/items/63ee6ba04d2a785eed16
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(VRChat 세계 개발 동기화 노하우), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hatsuca_vr/items/63ee6ba04d2a785eed16텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)