This document is about: QUANTUM 1
SWITCH TO

자주 문의하는 질문

대부분의 FAQ 내용은#quantum-sdk 디스코드 채팅에서 개발자가 문의하셨던 질문들을 모아놓은 것입니다. 또한 더 많은 도움이 필요하시면 검색 기능을 사용하십시오.

Quantum 유니티 프레임워크

데모 메뉴에서 게임을 시작할 때 게임 씬이 로드되지 않는 이유는 무엇입니까?

서버에서 AppId를 거부하면 아직은 적절한 오류 메시지가 표시되지 않습니다. AppId를 올바르게 생성했는지 확인해 주십시오:

Quantum 앱을 만드는 방법에 대한 자세한 지침은 여기Photon Quantum 앱 생성하기 에서 찾으실 수 있습니다.

  1. Photon 관리화면에서 Quantum App Id를 생성합니다.
  2. 새로운 앱 생성을 클릭하세요.
  3. Photon 유형을 Photon Quantum으로 설정합니다.
  4. 이름 필드를 입력하고 생성을 누릅니다.
  5. 새로운 Quantum 앱을 찾고 관리를 클릭합니다.
  6. 아래로 스크롤 하여 새로운 플러그인 생성을 누릅니다.
  7. 저장을 누릅니다.

Quantum 게임이 시작되기 전에 왜 5초가 지연되나요?

Deterministic Config 을 확인하고Room Wait Time (seconds)를 더 작은 값으로 설정합니다.

룸 대기 시간은 변동하는 Ping 시간에 대처하는 데 사용됩니다.

모든 클라이언트 세션을 동기화하는 데 항상 전체로 사용됩니다: 이 세션을 1초로 설정하면 항상 1초 동안 기다립니다.

이것은 씬 로드 시간을 동기화하는 데 사용하면 안 됩니다: 이 시간을 조정하려면 Quantum 세션을 시작하기 전에 씬을 로드하고 Photon과 직접 조정하십시오. 그러면 값을 0으로 안전하게 설정할 수 있습니다.

ns.exitgames.com에 연결하는 동안 연결 시간이 초과되는 이유는 무엇입니까?

연결 로그의 상세 내용을 보기 위해서 PhotonServerSettings에서 로그 레벨을 Network Logging으로 높일 수 있습니다.

UDP 트래픽이 차단되어 종종 타임아웃이 발생됩니다.

Photon이 사용하는 포트를 열 수 있는지 확인합니다: Photon TCP 와 UDP 포트 번호

회사 네트워크에서 포트를 열 수 없는 경우 저희에게 연락해 주십시오.

로컬 모드에서 실행하는 동안 멀티플레이어 모드로 게임을 실행할 때 플레이어 엔티티가 인스턴스화되지 않는 이유는 무엇인가요?

QuantumGame.SendPlayerData()가 각 플레이어에서 실행되지 않았을 가능성이 대부분입니다.

데모 메뉴를 사용하여 게임을 시작하는 경우 CustomCallbacks.cs 스크립트를 메뉴 씬에 추가합니다.

시작 후 Quantum 게임에 참가하고 OnGameStart 시그널이 발생된 후 각 플레이어는 SendPlayerData 메소드를 호출하여 모든 시뮬레이션에서 플레이어로 추가해야 합니다. 이것을 명시적으로 불러야 하는 이유는 이후에 참여한 플레이어를 크게 단순화하기 때문입니다.

Quantum 엔티티를 얻는 것이 왜 그렇게 장황해야 합니까?

QuantumRunner.Default.Game.Frames.Current.GetEntity(entityRef)

잠재적으로 동시에 여러개의 시뮬레이션을 실행할 수 있습니다(예: 킬 캠 기능). 게임과 프레임에 액세스할 수 있는 기본 방법으로 이러한 기능을 통합할 때 개발자가 코드 베이스를 재구성할 필요가 없습니다.

다음은 이에 대처하는 몇 가지 방법입니다.:

  • QuantumCallbacks.cs은 인수로 불리는 Quantum 게임 객체를 전달합니다. 글로벌 게임 대신 quantum 게임 객체를 사용합니다.
  • DSL(EventBase)로 생성된 Quantum 이벤트도 IDeterministicGame 객체를 전달합니다. 슬프게도, 대부분의 경우 QuantumGame으로 캐스팅해야 합니다.
  • 기본 게임과 현재 프레임을 사용하여 포인터를 잡는 콘크리트 EntityRefs 각각에 대해 확장 메소드를 생성합니다.

C#

namespace Quantum {
    public unsafe static class EntityExtensions {
        public static Ball* GetPtr(this EntityRefBall entityRef) {
            return QuantumRunner.Default.Game.Frames.Current.GetBall(entityRef);
        }
    }
}
  • 자신의 글로벌 바로 가기를 생성합니다:

C#

namespace Quantum {
    public static class MyGame {
        public static Frame CurrentFrame {
            get {
                return QuantumRunner.Default.Game.Frames.Current;
            }
        }
    }
}

NetworkPeier 클래스에서 처리되지 않은 이벤트 경고를 수신하는 이유는 무엇입니까?

이벤트 102 그리고 103.

이 이벤트들은 세션 전에 Session.Join() 호출전에 수신한 클럭 동기화 및 입력 메시지입니다. 시뮬레이션에 참여한 후 클라이언트가 관련 정보를 다시 받게 됩니다.

기본적으로 이미 룸에 있으므로 실행 중인 플러그인 세션은 로컬 세션을 시작하기 전부터 메시지를 전송합니다.

Quantum 이벤트 순서가 잘못된 이유는 무엇인가요?

Quantum은 Quantum_system 프로젝트에서 QUANTUM_FLIP_EVENT_ORDER 스크립팅 정의 심볼을 설정하지 않는 한 유니티에서 이벤트를 역순으로 전송합니다.

다음을 참고하세요: Community Wiki/Quantum-Gotchas

Unity 에셋 폴더 내에서 Quantum dll 소스 코드를 이동할 수 있습니까?

분리된 dll을 사용하는 워크플로우에 대한 지원을 권장하고 보장하지만 개발 프로세스의 속도를 높일 수 있습니다.

최종 게임 앱은 항상 릴리즈 dll들로 제작되어야 합니다! 그렇지 않으면 중요한 IL 성능 패치가 누락됩니다.

  • Unity 2017.3의 어셈블리 정의 기능이 필요합니다.
  • quantum state 프로젝트의 모든 코드 파일들은 quantum.state라고 하는 하나의 어셈블리 정의에 따라 번들 되어야 합니다.
  • 안전하지 않은 코드를 허용하도록 어셈블리 정의를 설정해야 합니다.
  • quantum system 프로젝트에 추가 asm def가 있는 경우 quantum asm def를 quantum 상태에 연결합니다.
  • Unity 프로젝트의 Scripting Runtime Version.NET 4.x Equivalent로 설정합니다.
  • Quantum ECS에 대한 코드 생성 및 파이프라인 어딘가에 있는 유니티 에셋 스크립트의 코드 생성을 실행하려면 해결 방법이 필요합니다(quantum.state의 사전-빌드 이벤트와 퀀텀의 사후-빌드 이벤트를 참조하십시오).

팔로잉 AssetLinks 전에 UnityDB.Init() 을 호출하세요.

여러 번 안전하게 호출할 수 있으며 게임이 실행되지 않을 때도 호출할 수 있습니다.

링크에서 인스턴스 getter를 사용하면 링크에 저장된 GUID를 사용하여 Quantum DB에서 Quantum 에셋을 검색하려고 합니다.

Unity Editor에서 게임을 실행할 때 네트워크 지연 시간을 시뮬레이션하는 효과적인 방법이 있나요?

연결할 때 quantum_unity/Assets/Photon Unity Networking/Plugins/PhotonNetwork/PhotonLagSimulationGui.cs 스크립트를 게임 객체에 붙여주십시오.

게임을 하는 동안 simulate을 전환하여 지연, 지터, 손실을 활성화합니다.

중단점을 일시 중지하거나 디버깅한 후 게임 시뮬레이션이 더 빠르게 실행되는 이유는 무엇입니까?

기본적으로 시간은 내부적으로 측정되며 시뮬레이션 중지를 보상하지 않습니다. SimulationConfig의 DeltaTimeTypeEngineDeltaTime으로 변경될 때 게임 플레이는 일시 중지된 후 정상 속도로 재개됩니다. Caveat은 다음과 같은 이 설정을 변경하면 모든 클라이언트가 이 설정을 사용하게 되며 디버깅에만 사용할 경우 바람직하지 않을 수 있습니다. 카메라 컨트롤이 매우 엄격한 일부 게임(예: 비행 시뮬레이션)은 EngineDeltaTime으로 설정하면 이익을 얻을 수 있습니다.

C#

public enum SimulationUpdateTime {
    Default = 0,                        // internal clock
    EngineDeltaTime = 1,                // Time.deltaTime (Unity)
    EngineUnscaledDeltaTime = 2         // Time.unscaledDeltaTime
}

IL2CPP를 사용할 때 Json 직렬화가 중단되는 이유는 무엇입니까?

사용되지 않는 코드는 자동으로 스트립 됩니다. 여기 https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html를 읽어보세요.

PUN 폴더 안에는 이미 link.xml이 있습니다. 프로젝트에 자체 link.xml을 추가하고 이러한 방법으로 사용자 정의 라이브러리를 실행할 수 있습니다.

Quantum은 HTML5 내보내기에서 작동합니까?

아니오. 웹 GL에서는 Memcopy가 충분히 빠르지 않습니다.

그 플랫폼을 지원할 계획이 있습니까?

네, 우리는 그 문제를 극복할 방법을 끊임없이 찾고 있습니다.

로컬 플레이어를 어떻게 가져오나요?

QuantumGame.GetLocalPlayers()는 모든 클라이언트에 고유한 배열을 반환하고 Quantum 시뮬레이션에서 로컬 컴퓨터가 제어하는 플레이어의 인덱스를 나타냅니다.

  • 일반적으로 하나의 인덱스를 반환하지만 로컬 시스템이 둘 이상의 플레이어를 제어하는 경우 배열은 로컬 플레이어 수의 길이를 가집니다.
  • 이 인덱스들은 QuantumInput.Instance.PollInput(int player) 에 전달되는 동일한 인덱스입니다.
  • 인덱스는 서버에 의해 정의됩니다(로컬 게임이 아닌 경우).
  • 인덱스는 항상 [0, PlayerCount-1] 내에 있습니다. PlayerCount는 경기의 총 플레이어 수를 나타냅니다. 이 숫자는 퀀텀 게임으로 전달됩니다. QuantumGame.StartGame()로 전달되며 DeterministicConfig를 설정합니다.
  • 인덱스 값은 임의(물론 범위 내에서)이며, 여러 플레이어가 연결 및 연결을 끊는 순서 및 메시지가 서버에 도달하는 시점에 따라 달라집니다.
  • 로컬 시스템에 둘 이상의 플레이어가 있는 경우 값이 연속되지 않아도 됩니다.
  • 동일한 GUID로 Session.Join() 호출하고 룸이 이미 새로운 플레이어로 채워져있지 않은 경우이면 게임에 다시 참여했을 때 동일한 플레이어 인덱스를 지정할 수 있습니다.

Session.IsLocalPlayer(int player) 는 엔티티가 (player_ref 멤버를 가지고 있는) 로컬 플레이어와 연관이 있는지 결정하는 것에 도움을 줄 수 있습니다.

예를 들어 해당 Photon 플레이어 ID를 찾아 PhotonPlayer를 통해 PhotonPlayer.Nickname으로 플레이어 이름을 표시하려면 Frame.PlayerToActorId(PlayerRef player)Frame.ActorIdToAllPlayers(Int32 actorId) 를 사용하세요.

플레이어 인덱스와 대조적으로 PlayerRef는 1-기반입니다. 그 이유는 기본값(PlayerRef)이 편의를 위해 "널/잘못된 값" 참조 구조체를 반환하기 때문입니다. PlayerRef에 int를 캐스팅할 수 있는 자동 캐스팅 연산자가 있습니다.

  • 기본값(PlayerRef), 내부적으로 0은 아무도 없다라는 의미입니다
  • PlayerRef, 내부적으로 1은 플레이어 인덱스 0과 동일합니다.
  • PlayerRef, 내부적으로 2은 플레이어 인덱스 1과 동일합니다.

IL2CPP를 사용하여 빌드 할 때 JSON에서 DB를 비직렬화할 때 예외를 수정하는 방법은 무엇입니까?

Json.Net은 직렬화된 어레이 및 사용되지 않은 지네릭을 IL2CPP 빌드에서 삭제하면 임시 목록 집합을 생성합니다.

ExecutionEngineException: Attempting to call method 'System.Collections.Generic.List`1[[Photon.Deterministic.DeterministicTickInputSet, PhotonDeterministic, Version=1.2.4.0, Culture=neutral, PublicKeyToken=null]]::.cctor' for which no ahead of time (AOT) code was generated.
  (...)
  at Newtonsoft.Json.Serialization.JsonArrayContract.CreateTemporaryCollection()

Unity 자체 link.xmlPreserveAttribute는 다음과 같은 방법으로 Unity 스크립트에 명시적으로 나열하는 것이 유일한 해결책입니다:

C#

using System.Collections.Generic;

public class QuantumAOT {
  public List<Photon.Deterministic.DeterministicTickInputSet> DeterministicTickInputSet;
  public List<Photon.Deterministic.FP> FP;
  public List<Photon.Deterministic.FPVector2> FPVector2;
  public List<Photon.Deterministic.FPVector3> FPVector3;
  public List<Quantum.AssetLink> AssetLink;
  public List<Quantum.BuffDataLink> BuffDataLink;
  public List<Quantum.Core.CCWTri> CCWTri;
  public List<Quantum.FPAnimationCurve.Keyframe> Keyframe;
  public List<Quantum.MapStaticCollider> MapStaticCollider;
  public List<Quantum.MapStaticCollider3D> MapStaticCollider3D;
  public List<Quantum.NavMeshLink> NavMeshLink;
  public List<System.Byte> Byte;
  public List<System.Int32> Int32;
}

Quantum 2.0은 자동으로 이 파일을 생성하지만 이전 Quantum 버전에서는 DB 내에서 사용되는 모든 값 유형을 수작업으로 만들어야 합니다(아래 참조). 배열에 저장된 AssetObjects, 중첩 및 필드)는 위의 파일로 이동해야 합니다.

C#

namespace Quantum {
  public struct Foo1 {
    public int Bar;
  }

  public class Foo2 {
    public int Bar;
  }

  partial class SomeAssetData {
    // Needs List<Foo1> to be known
    public Foo1[] Foo1;
    // Does not need special attention for Quantum apart from Unity having problems serializing nestes value and reference types under IL2CPP :)
    public Foo2[] Foo2;
  }
}

Quantum에서 시뮬레이션 개발

시뮬레이셔은 왜 프레임 60부터 시작하나요?

시뮬레이션 시작 시 할당된 롤백 가능한 프레임의 수입니다. 이 숫자는 DeterministicConfig->Rollback 윈도우에 설정된 값과 일치합니다.

동일한 프레임 번호에서 Update()가 왜 여러 번 호출되나요?

롤백 시 동일한 프레임 번호에 대해 시스템에서 Update()를 여러 번 호출합니다. 이 문제는 원격 플레이어 입력의 예측이 잘못된 것으로 감지되고 시뮬레이션이 결정론적 상태로 돌아가기 위해 올바른 입력 데이터가 있는 프레임을 다시 실행해야 하는 경우에 발생합니다.

현재 이 문제는 내부 아키텍처 결정으로 인해 로컬 모드에서 실행되는 경우에도 발생합니다. 이 문제는 향후 버전의 Quantum에서 해결될 예정입니다.

Visual Studio에서 포인터를 디버깅하려면 어떻게 해야 합니까? 주소만 보입니다.

  • 유니티 2018 그리고 Visual Studio 2017가 필요합니다.
  • 유니티 프로젝트의 Scripting Runtime Version.NET 4.x Equivalent으로 설정합니다.
  • Quantum dlls 이 Debug dlls로 빌드 했는지 확인해 주십시오.
  • VS 메뉴 Debug->Attach Unity Debugger 메뉴를 통해 Visual Studio를 Unity에 연결하고 올바른 Unity Editor 인스턴스를 선택합니다.
  • VS 및 Unity Editor의 모든 인스턴스를 닫고 VS를 시작하고 Quantum dll을 다시 구성한 다음 Unity를 시작하고 다시 로드한 다음 Debugger를 연결합니다.

DynamicHits 또는 컴포넌트 버퍼를 반복할 때 할당되는 이유는 무엇입니까?

Quantum DSL(코드 생성)에서 생성하는 모든 Quantum 컴포넌트 대해 Frame 클래스에 다음과 같은 getter가 있습니다:public Buffer<CollisionsFilter> GetAllCollisions(Boolean excludeCulled = false).

Buffer 개체는 캐싱 되고 재사용되며 필요할 때만 생성 및 확장됩니다. 목록이 더 이상 사용되지 않을 때 풀링이 작동하려면 Buffer.Disposed() 를 호출해야 합니다. 이 작업은 using구문을 사용하여 자동으로 수행됩니다.

C#

using (var collisionComponents = f.GetAllCollisions()) {
    for (Int32 x = 0; x < collisionComponents.Count; x++) {
        // ...
    }
}

충돌 검사에서 얻은 DynamicHits 객체의 경우도 마찬가지입니다:

C#

using (var hits = f.Scene.OverlapCircle(i->Data.ClickToMove.Target, 1)) {
    foreach (var hit in hits)  {
        // ...
    }
}

FFP.MaxValue 와 FP.UseableMax 의 차이점은 무엇입니까?

고정 소수점 산술은 64비트 값의 16+16비트만 사용합니다. 이렇게 하면 오버플로를 확인할 필요가 없기 때문에 연산의 일부가 더 빨리 만들어집니다. 다시 말하면: FP.MinValueFP.MaxValue는 64비트를 모두 사용하고 있으므로 절대로계산에 사용하면 안 됩니다. 대신 FP.UseableMaxFP.UseableMin를 사용합니다(예를 들어 최소 FP 값으로 거리 변수를 초기화합니다).

참고: FP는 -32,768 에서 32,768 까지의 값을 나타낼 수 있습니다(-2¹⁵ to 2¹⁵).

OnCollisionStatic 콜백을 왜 받을 수 없나요?

성능상의 이유로 활성을 옵트인 방식입니다. SimulationConfig 를 확인하고 Physics->통계를 위한 충돌 통계 발생를 토글 합니다.

Quantum은 플레이어의 ID를 어떻게 결정합니까?

Quantum 플레이어 인덱스(Quantum Player Id, PlayerRef)는 Session.Join 메시지가 서버에 도착한 세션의 순서를 기반으로 합니다. 다시 말하면 임의로 결정합니다.

Photon Id(Photon 플레이어 Id, 액터 Id)도 시퀀스에 기반하지만 Photon 룸 조인 순서에 기반합니다.

아직 Photon Player에서 "Descired Quantum Id"를 설정할 수 없습니다.

클라이언트가 다시 연결되면 새 Photon ID를 얻지만 동일한 ClientId로 연결할 때 동일한 Quantum 인덱스를 얻을 수 있습니다:public static QuantumRunner StartGame(String clientId, Int32 playerCount, StartParameters param)

QuantumGame.SendPlayerData(RuntimePlayer 기능)와 함께 특정 플레이어 관련 설정을 전송합니다.

시뮬레이션에 플레이어를 추가하려면 어떻게 해야 합니까?

최대 플레이어 수는 각 프레임에 대해 메모리 청크 내부에 할당해야 하는 공간을 정의하기 때문에 미리 알고 있어야 합니다.

다음 행을 qtn-파일 중 하나에서 추가 또는 구성하고 원하는 수를 설정합니다.

#define PLAYER_COUNT 8
#pragma max_players PLAYER_COUNT
  • define은 DSL 내부에서 사용할 수 있는 정의(예: 플레이어 수로 배열을 할당하는 경우)와 같이 행동합니다.
  • pragma 시뮬레이션에서 처리할 수 있는 플레이어의 수를 실제로 정의합니다.

새 구조체를 가르키는 포인터가 오래된 데이터를 가리키는 이유는 무엇입니까?

루프 내부에서 구조물에 대한 포인터는 동일한 스택 포인터를 가지며 not new 또는 default를 사용하는 경우 오래된 데이터가 포함됩니다.

C#

struct Bar {
    public bool Foo;
}

static unsafe void Main(string[] args) {
    for (int i = 0; i < 2; i++) {

        Bar bar;
        //Bar bar = default(Bar); // <---- Fixes the stale data
       
        Bar* barPt = &bar;
        if (barPt->Foo)
            Console.WriteLine("Wtf");
  
        barPt->Foo = true;
    }

    Console.ReadKey();
}

시뮬레이션이 동기화되지 않는 이유는 무엇입니까?

DeterministicConfig.ChecksumInterval 이 > 0 일 때 확인된 프레임의 체크섬이 계산되어 서버로 전송되고 다른 클라이언트가 전송한 체크섬과 비교됩니다.

어떤 값이 비동기화의 원인이 되는지 커뮤니티 위키에서 비동기화 체크 코드를 확인해보세요.

대부분의 원인은 다음과 같습니다:

Quantum 데이터 에셋에 쓰는 것

C#

c->CharacterSpec = DB.FindAsset<CharacterSpec>("WhiteFacedBarghast");
c->CharacterSpec.RemainigLifetime = 21;

절대로 Quantum 에셋에 아무것도 쓰지 마세요. 여기에는 읽기 전용 데이터가 포함되어 있습니다.

유니티 쓰레드에서 Quantum에 쓰는 것

Unity의 모든 스크립트는 Quantum 프레임을 통해 노출되는 모든 항목에 읽기 전용 접근 권한을 가집니다. 입력 및/또는 명령을 통해서만 시뮬레이션에 영향을 미칩니다.

데이터 캐싱

C#

public class CleaningSystem : SystemBase {
    public Boolean hasShoweredToday;    // <----- Error
    public override void Update(Frame f) {
        if (!hasShoweredToday && f.Global->ElapsedTime > 100) {
            Shower();
            hasShoweredToday = true;
        }
    }
}

시뮬레이션이 롤백 될 때 위의 코드는 결국 비동기화됩니다. 대신 프레임 또는 엔티티 구성요소에 임시 데이터를 저장합니다.

사용자 정의 프레임 UserData 미 복사

C#

unsafe partial class Frame {
    public Boolean HasShoweredToday;
    partial void CopyFromUser(Frame frame) {
        // <----- Error
    }
}

Frame.User.cs 사용 방법 예제를 읽어보십시오.

부동 소수점 대수

시뮬레이션 내부의 부동액 사용을 자제하고 FP 수학만 사용합니다.

또한 FP.FromFloat_UNSAFE()를 주의해서 다루십시오. 한 시스템에서 자산 생성의 밸런스를 조정하는 데 사용되는 "오프라인"은 괜찮습니다. 하지만 이렇게 하면 서로 다른 플랫폼에서 서로 다른 결과를 얻을 수 있습니다. 런타임 중에 부동 소수점을 가져와야 하며 정수 또는 FP를 사용할 수 없는 경우입니다.(예 밸런싱 데이터 다운로드): String 에서 FP로 변환하십시오.

크로스 플랫폼 체크섬

두 개의 다른 플랫폼(PC vs iOS)에서 게임을 실행할 때, PhotonDeterministic.ChecksumCrossplatformDeterminism을 사용할 때만 체크섬이 일치합니다.

동일한 클라이언트에서 새 Quantum 세션을 위해 Photon 룸을 재사용할 수 있습니까?

A) 아니요, 권장되고 깔끔한 해결책은 룸을 바꾸는 것입니다.

  • Photon을 사용하여 클라이언트 간에 새 룸의 ID를 공유합니다(예: 룸 속성).
  • 퀀텀 세션을 중지합니다. LeaveRoom() 을 하나 연결이 끊기지 않습니다.
  • 동시에 클라이언트들이 룸에 들어갈 때 경합 조건을 방지하기 위해서는 새로운 룸에 연결하기 위해 JoinOrCreate()을 사용합니다.

PUN 매치메이킹 지침

B) 네, 게임을 소프트-재시작할 때

  • 게임 라운드가 끝났지만 Quantum 세션을 계속 실행합니다.
  • (선택) 이 시간에 Quantum 시스템을 결정적으로 비활성화할 수 있습니다.
  • 게임 라운드 재시작을 처리하는 게임 플레이 시스템(예: 게임 상태 기계)에 코드를 추가합니다.

Caveat(솔루션 B의 경우): 서버에서 시뮬레이션을 실행하지 않으면(사용자 지정 Quantum 플러그인 스냅샷 다시 연결) 모든 라운드에서 후기 가입자가 입력을 받거나 버디 스냅샷에 의한 (다시 연결) 연결을 밝게 합니다(다른 클라이언트가 보낸 게임의 유효 상태).

Collision.OnEnter, OnStay 그리고 OnExit 콜백은 왜 없는 거죠?

성능상의 이유로 프레임 간에 저장하는 데이터양을 줄였습니다.

하지만 이러한 기능을 가능하게 하는 작은 애드온이 있습니다. ComplexCollisions에 대해서는 직접 문의해 주십시오.

Back to top