Przewodnik systemu kolizji
LCC Unity SDK ma wbudowany system kolizji, skoncentrowany na rozwiązywaniu przyspieszania konstrukcji koliderów i wykrywania kolizji — czyli problemu wydajności kolizji. System Collider Unity nie radzi sobie z wykrywaniem w czasie rzeczywistym w bardzo dużych scenach.
LCC Unity SDK używa własnego wbudowanego systemu kolizji, nie polegając już na komponencie MeshCollider Unity i powiązanych możliwościach, więc nie może bezpośrednio działać na GameObjects w scenie Unity. Oficjalny format danych LCC generowany przez XGrids (LCC Studio) generuje dane siatki używane do kolizji podczas rekonstrukcji w tym samym czasie, a SDK używa tych danych kolizji do szybkiego i wydajnego budowania kolizji sceny. Ponieważ jest to samodzielny system kolizji, użycie funkcji kolizji wymaga wywołania odpowiednich metod udostępnianych przez SDK.
Uwaga:
Wbudowany system kolizji SDK jest niekompatybilny z systemem Collider Unity i nie może bezpośrednio działać na obiektach
Rigidbodyw Unity. Kolizja postaci, takich jak cyfrowi ludzie, musi być napędzana metodami wykrywania SDK (zobacz „Implementacja kolizji cyfrowego człowieka" poniżej).Dla scen stałych możesz również wyodrębnić dane siatki i wypiec je wcześniej w NavMesh, co może być kompatybilne z systemem Collider Unity; szczegóły znajdziesz w przewodniku NavMesh.
Wymagania wstępne danych
Warunkiem zadziałania wykrywania kolizji jest to, że scena ma odpowiednie dane kolizji. Dane rekonstruowane we wcześniejszych wersjach mogą nie zawierać danych kolizji; w takim przypadku wywołanie SetColliderEnable(true) zwraca false, a wszystkie późniejsze metody wykrywania są niedostępne.
Dlatego po włączeniu kolizji koniecznie sprawdź wartość zwracaną:
bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
Debug.LogWarning("Bieżące dane nie zawierają kolidera, nie można włączyć wykrywania kolizji");
}
Podstawowy przepływ użycia
Podstawowy przepływ funkcji kolizji ma trzy kroki:
- Załaduj dane sceny przez metodę
Load(). - W wywołaniu zwrotnym zakończenia ładowania włącz kolizję przez
SetColliderEnable(true). - Wykonuj wykrywanie kolizji przez różne metody wykrywania (
RaycastMesh/IntersectsSphere/IntersectsCapsule).
// 1. Załaduj scenę
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
// 2. Włącz kolizję po zakończeniu ładowania
if (renderer.SetColliderEnable(true))
{
colliderReady = true;
}
});
void Update()
{
if (!colliderReady) return;
// 3. Wykonuj wykrywanie kolizji co klatkę
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
}
Uwaga:
SetColliderEnable()jest metodąRenderer, natomiast metody wykrywania (RaycastMesh/IntersectsSphere/IntersectsCapsule/Raycast) znajdują się wLCCManager. Wywołuj je odpowiednio na odpowiednich obiektach.

Podstawowy przepływ systemu kolizji
Implementacja kolizji cyfrowego człowieka
Ponieważ system kolizji SDK nie działa na Rigidbody Unity, kolizja dla cyfrowych ludzi (postaci) musi być napędzana metodami wykrywania. Istnieją trzy popularne podejścia:
- Wykrywanie podwójnym promieniem: użyj
RaycastMesh(), aby wystrzelić jeden promień w dół i jeden do przodu, i oceniaj, czy postać może iść, na podstawie wyników zwracanych przez promień (sonda podłoża w dół, sonda przeszkód do przodu). - Wykrywanie kapsułą: użyj
IntersectsCapsule(), aby wykryć, czy kapsuła, w której znajduje się cyfrowy człowiek, przecina siatkę kolizji, i oceniaj, czy może iść. Przeciążona wersja_deltazwraca przesunięcie następnego bezpiecznie osiągalnego punktu. - Wykrywanie sferą: użyj
IntersectsSphere(), aby wykryć, czy sfera, w której znajduje się cyfrowy człowiek, przecina siatkę kolizji, i oceniaj, czy może iść. Przeciążona wersja_deltarównież zwraca przesunięcie bezpiecznie osiągalnego punktu.

Trzy podejścia implementacji kolizji cyfrowego człowieka
Wybór między RaycastMesh a Raycast
SDK udostępnia dwa typy metod wykrywania promieniem o różnych celach:
| Metoda | Cel wykrywania | Precyzja | Szybkość | Zastosowanie |
|---|---|---|---|---|
RaycastMesh() | Siatka kolizji (dane Collidera) | Stosunkowo niska | Szybka | Kolizja cyfrowego człowieka, wykrywanie co klatkę |
Raycast() | Prymitywy gaussowskie (nie polega na siatce kolizji) | Stosunkowo wysoka | Wolna | Aplikacje typu pomiarowego |
Raycast() wykonuje wykrywanie promieniem bezpośrednio na prymitywach gaussowskich, z wyższą precyzją, ale wolniej, i nie jest zalecany do wywołań co klatkę, więc nie nadaje się do kolizji cyfrowego człowieka, tylko do użycia pomiarowego. Dla kolizji cyfrowego człowieka preferuj RaycastMesh(), który polega na siatce kolizji.
Powiązane API
Spośród poniższych metod związanych z kolizją SetColliderEnable() znajduje się w Renderer, a pozostałe metody wykrywania w LCCManager. Wszystkie metody wykrywania są dostępne tylko po zakończeniu ładowania sceny i pomyślnym wywołaniu SetColliderEnable(true).
SetColliderEnable
// Wartość zwracana: bool → true=ustawiono pomyślnie, false=dane nie zawierają kolidera lub instancja nie jest aktywna
public bool SetColliderEnable(bool _enable)
Przełącza funkcję kolidera. Po włączeniu IntersectsSphere / IntersectsCapsule / RaycastMesh stają się dostępne.
| Parametr | Typ | Opis |
|---|---|---|
_enable | bool | Czy włączyć kolider |
Przykład użycia:
bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Dane nie zawierają kolidera");
Opis:
- Dane muszą zawierać dane kolizji (siatki), w przeciwnym razie zwraca
false. - Wymaga, aby
Rendererbył w stanie aktywnym.
RaycastMesh (współrzędne ekranu)
// Wartość zwracana: bool → true=trafienie
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)
Wystrzeliwuje promień ze współrzędnych ekranu, aby wykryć siatkę kolizji. Używa danych Collidera do wykrywania, szybciej niż Raycast, ale z niższą precyzją.
| Parametr | Typ | Opis |
|---|---|---|
mousePos | Vector3 | Współrzędne ekranu |
_finalResult | out HitResult | Wynik trafienia |
_disatnce | float | Maksymalna odległość wykrywania, domyślnie 70.0 |
Przykład użycia:
if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
Opis:
- Wymaga wcześniejszego pomyślnego włączenia kolizji.
- Wymaga wcześniejszego wywołania
SetColliderEnable(true).
RaycastMesh (Ray + Bounds)
// Wartość zwracana: bool → true=trafienie
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)
Używa własnego Ray do wykrywania siatki kolizji, a także zwraca informacje o prostokącie ograniczającym trafionego węzła.
| Parametr | Typ | Opis |
|---|---|---|
ray | Ray | Promień |
result | out HitResult | Wynik trafienia |
hitBounds | out Bounds | Prostokąt ograniczający trafionego węzła (prostokąt ograniczający trafionego węzła LOD) |
maxDist | float | Maksymalna odległość wykrywania, domyślnie 70.0 |
Przykład użycia:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
Debug.Log(bounds.center);
}
Opis:
- Wymaga wcześniejszego pomyślnego włączenia kolizji.
- Ta metoda jest powszechnie używana do wykrywania podwójnym promieniem (w dół, do przodu), aby ocenić, czy cyfrowy człowiek może iść.
IntersectsSphere
// Wartość zwracana: bool → true=przecięcie
public bool IntersectsSphere(Sphere sphere)
// Wartość zwracana: bool → true=przecięcie
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)
Wykrywa, czy sfera przecina siatkę kolizji. Drugie przeciążenie dodatkowo zwraca wektor penetracji delta (kierunek i odległość wypchnięcia), który można wykorzystać do obliczenia następnego bezpiecznie osiągalnego punktu.
| Parametr | Typ | Opis |
|---|---|---|
sphere | Sphere | Sfera do wykrycia |
delta | out Vector3 | Wektor penetracji (kierunek i odległość wypchnięcia) |
Przykład użycia:
var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
transform.position += delta;
}
Opis:
- Wymaga wcześniejszego pomyślnego włączenia kolizji.
- Wymaga wcześniejszego wywołania
SetColliderEnable(true). - Iteruje po wszystkich aktywnych
Rendererach.
IntersectsCapsule
// Wartość zwracana: bool → true=przecięcie
public bool IntersectsCapsule(Capsule capsule)
// Wartość zwracana: bool → true=przecięcie
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)
Wykrywa, czy kapsuła przecina siatkę kolizji. Powszechnie używane do wykrywania kolizji kontrolera postaci. Drugie przeciążenie zwraca wektor penetracji delta, który można wykorzystać jako przesunięcie do następnego bezpiecznie osiągalnego punktu dla cyfrowego człowieka.
| Parametr | Typ | Opis |
|---|---|---|
capsule | Capsule | Kapsuła do wykrycia |
delta | out Vector3 | Wektor penetracji |
Przykład użycia:
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
Opis:
- Wymaga, aby dane zawierały węzły kolizji.
- Wymaga wcześniejszego wywołania
SetColliderEnable(true). - Odpowiednie do kolizji postaci pierwszoosobowej / trzecioosobowej.
Raycast
// Wartość zwracana: bool → true=trafienie
public bool Raycast(Ray _ray, out HitResult _finalResult)
Używa własnego Ray do wykrywania promieniem na prymitywach gaussowskich, iterując po wszystkich aktywnych Rendererach i zwracając najbliższe trafienie. Nie polega na siatce kolizji; wyższa precyzja, ale wolniejsze.
| Parametr | Typ | Opis |
|---|---|---|
_ray | Ray | Promień |
_finalResult | out HitResult | Wynik trafienia |
Przykład użycia:
Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
Opis:
- Nie polega na siatce kolizji, nie wymaga
SetColliderEnable. - Wyższa precyzja, ale wolniejsze, nie zalecane do wywołań co klatkę, odpowiednie do aplikacji pomiarowych, nie do kolizji cyfrowego człowieka.
HitResult
Wyniki trafień powyższych metod wykrywania są zwracane przez strukturę HitResult:
public struct HitResult {
public bool isHit; // Czy trafiono
public float distance; // Odległość
public Vector3 hitPos; // Współrzędne świata punktu trafienia (nazwa pola to hitPos, nie position)
public Vector3 normal; // Normalna trafienia
public float hitAlpha; // Alfa trafionej elipsoidy
public float dist2Origin; // Odległość do początku promienia
public float scale; // Skala elipsoidy
}
Uwaga:
Nazwa pola współrzędnych świata punktu trafienia to
hitPos, nieposition; uzyskuj do niego dostęp według rzeczywistej nazwy pola.