Ontwikkelgids voor het botsingssysteem
De LCC Unity SDK heeft een ingebouwd botsingssysteem, gericht op het oplossen van de versnelling van colliderconstructie en botsingsdetectie — dat wil zeggen het botsingsprestatieprobleem. Het Collider-systeem van Unity kan geen realtime detectie in zeer grote scènes aan.
De LCC Unity SDK gebruikt zijn eigen ingebouwde botsingssysteem en vertrouwt niet langer op de MeshCollider-component en de gerelateerde mogelijkheden van Unity, zodat het niet rechtstreeks op GameObjects in een Unity-scène kan inwerken. De officiële LCC-gegevensindeling die door XGrids (LCC Studio) wordt gegenereerd, genereert tijdens de reconstructie tegelijkertijd Mesh-gegevens die voor botsing worden gebruikt, en de SDK gebruikt deze botsingsgegevens om snel en efficiënt scènebotsing op te bouwen. Omdat het een zelfgebouwd botsingssysteem is, moet je voor het gebruik van de botsingsfunctie de bijbehorende methoden aanroepen die door de SDK worden aangeboden.
Opmerking:
Het ingebouwde botsingssysteem van de SDK is niet compatibel met het Collider-systeem van Unity en kan niet rechtstreeks inwerken op
Rigidbody-objecten in Unity. Botsing voor personages zoals digitale mensen moet worden aangestuurd door de detectiemethoden van de SDK (zie "Implementatie van botsing van digitale mensen" hieronder).Voor vaste scènes kun je ook de Mesh-gegevens extraheren en deze vooraf in een NavMesh bakken, wat compatibel kan zijn met het Collider-systeem van Unity; zie de NavMesh-gids voor meer informatie.
Gegevensvereisten
De voorwaarde voor het functioneren van botsingsdetectie is dat de scène over de bijbehorende botsingsgegevens beschikt. Gegevens die in eerdere versies zijn gereconstrueerd, bevatten mogelijk geen botsingsgegevens; in dat geval retourneert het aanroepen van SetColliderEnable(true) false en zijn alle daaropvolgende detectiemethoden niet beschikbaar.
Controleer daarom na het inschakelen van botsing altijd de retourwaarde:
bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
Debug.LogWarning("De huidige gegevens bevatten geen collider, botsingsdetectie kan niet worden ingeschakeld");
}
Basisgebruiksworkflow
De basisworkflow voor de botsingsfunctie bestaat uit drie stappen:
- Laad de scènegegevens via de
Load()-methode. - Schakel botsing in via
SetColliderEnable(true)in de laadvoltooiingscallback. - Voer botsingsdetectie uit via de verschillende detectiemethoden (
RaycastMesh/IntersectsSphere/IntersectsCapsule).
// 1. Laad de scène
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
// 2. Schakel botsing in nadat het laden is voltooid
if (renderer.SetColliderEnable(true))
{
colliderReady = true;
}
});
void Update()
{
if (!colliderReady) return;
// 3. Voer elke frame botsingsdetectie uit
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
}
Opmerking:
SetColliderEnable()is een methode vanRenderer, terwijl de detectiemethoden (RaycastMesh/IntersectsSphere/IntersectsCapsule/Raycast) opLCCManagerstaan. Roep ze respectievelijk op de bijbehorende objecten aan.

Basisworkflow van het botsingssysteem
Implementatie van botsing van digitale mensen
Omdat het botsingssysteem van de SDK niet inwerkt op de Rigidbody van Unity, moet botsing voor digitale mensen (personages) worden aangestuurd door de detectiemethoden. Er zijn drie veelvoorkomende benaderingen:
- Detectie met dubbele stralen: gebruik
RaycastMesh()om één straal naar beneden en één naar voren te schieten en beoordeel op basis van de retourresultaten van de stralen of het personage kan lopen (peil de grond naar beneden, peil obstakels naar voren). - Capsuledetectie: gebruik
IntersectsCapsule()om te detecteren of de capsule waarin de digitale mens zich bevindt de botsings-Mesh snijdt en beoordeel of deze kan lopen. De_deltavan de overbelaste versie retourneert de verschuiving van het volgende veilig bereikbare punt. - Boldetectie: gebruik
IntersectsSphere()om te detecteren of de bol waarin de digitale mens zich bevindt de botsings-Mesh snijdt en beoordeel of deze kan lopen. De_deltavan de overbelaste versie retourneert eveneens de verschuiving van een veilig bereikbaar punt.

Drie implementatiebenaderingen voor botsing van digitale mensen
Kiezen tussen RaycastMesh en Raycast
De SDK biedt twee soorten straaldetectiemethoden met verschillende doeleinden:
| Methode | Detectiedoel | Precisie | Snelheid | Toepasselijk scenario |
|---|---|---|---|---|
RaycastMesh() | Botsings-Mesh (Collider-gegevens) | Relatief laag | Snel | Botsing van digitale mensen, detectie per frame |
Raycast() | Gaussiaanse primitieven (vertrouwt niet op de botsings-Mesh) | Relatief hoog | Langzaam | Meettoepassingen |
Raycast() voert straaldetectie rechtstreeks op Gaussiaanse primitieven uit, met een hogere precisie maar een lagere snelheid, en wordt niet aanbevolen voor aanroepen per frame, dus het is niet geschikt voor botsing van digitale mensen, alleen voor meettoepassingen. Geef voor botsing van digitale mensen de voorkeur aan RaycastMesh(), dat op de botsings-Mesh vertrouwt.
Gerelateerde API's
Van de onderstaande botsingsgerelateerde methoden staat SetColliderEnable() op Renderer, terwijl de overige detectiemethoden op LCCManager staan. Alle detectiemethoden zijn pas beschikbaar nadat de scène klaar is met laden en SetColliderEnable(true) met succes is aangeroepen.
SetColliderEnable
// Retourwaarde: bool → true=succesvol ingesteld, false=de gegevens bevatten geen collider of de instantie is niet actief
public bool SetColliderEnable(bool _enable)
Schakelt de colliderfunctie in of uit. Na het inschakelen worden IntersectsSphere / IntersectsCapsule / RaycastMesh beschikbaar.
| Parameter | Type | Beschrijving |
|---|---|---|
_enable | bool | Of de collider moet worden ingeschakeld |
Gebruiksvoorbeeld:
bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("De gegevens bevatten geen collider");
Beschrijving:
- De gegevens moeten botsingsgegevens (Mesh) bevatten, anders wordt
falsegeretourneerd. - Vereist dat de
Rendererzich in een actieve staat bevindt.
RaycastMesh (schermcoördinaten)
// Retourwaarde: bool → true=geraakt
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)
Schiet een straal vanuit schermcoördinaten om de botsings-Mesh te detecteren. Maakt gebruik van Collider-gegevens voor detectie, sneller dan Raycast maar met een lagere precisie.
| Parameter | Type | Beschrijving |
|---|---|---|
mousePos | Vector3 | Schermcoördinaten |
_finalResult | out HitResult | Hitresultaat |
_disatnce | float | Maximale detectieafstand, standaard 70.0 |
Gebruiksvoorbeeld:
if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
Beschrijving:
- Vereist dat botsing eerst met succes is ingeschakeld.
- Vereist dat
SetColliderEnable(true)eerst wordt aangeroepen.
RaycastMesh (Ray + Bounds)
// Retourwaarde: bool → true=geraakt
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)
Gebruikt een aangepaste Ray voor detectie van de botsings-Mesh en retourneert ook de begrenzingskaderinformatie van het geraakte knooppunt.
| Parameter | Type | Beschrijving |
|---|---|---|
ray | Ray | De straal |
result | out HitResult | Hitresultaat |
hitBounds | out Bounds | Begrenzingskader van het geraakte knooppunt (begrenzingskader van het geraakte LOD-knooppunt) |
maxDist | float | Maximale detectieafstand, standaard 70.0 |
Gebruiksvoorbeeld:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
Debug.Log(bounds.center);
}
Beschrijving:
- Vereist dat botsing eerst met succes is ingeschakeld.
- Deze methode wordt vaak gebruikt voor detectie met dubbele stralen (naar beneden, naar voren) om te beoordelen of een digitale mens kan lopen.
IntersectsSphere
// Retourwaarde: bool → true=snijdt
public bool IntersectsSphere(Sphere sphere)
// Retourwaarde: bool → true=snijdt
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)
Detecteert of een bol de botsings-Mesh snijdt. De tweede overbelasting retourneert bovendien de penetratievector delta (uitduwrichting en -afstand), die kan worden gebruikt om het volgende veilig bereikbare punt te berekenen.
| Parameter | Type | Beschrijving |
|---|---|---|
sphere | Sphere | De te detecteren bol |
delta | out Vector3 | Penetratievector (uitduwrichting en -afstand) |
Gebruiksvoorbeeld:
var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
transform.position += delta;
}
Beschrijving:
- Vereist dat botsing eerst met succes is ingeschakeld.
- Vereist dat
SetColliderEnable(true)eerst wordt aangeroepen. - Itereert over alle actieve
Renderers.
IntersectsCapsule
// Retourwaarde: bool → true=snijdt
public bool IntersectsCapsule(Capsule capsule)
// Retourwaarde: bool → true=snijdt
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)
Detecteert of een capsule de botsings-Mesh snijdt. Wordt vaak gebruikt voor botsingsdetectie van de character controller. De tweede overbelasting retourneert de penetratievector delta, die kan worden gebruikt als verschuiving naar het volgende veilig bereikbare punt voor een digitale mens.
| Parameter | Type | Beschrijving |
|---|---|---|
capsule | Capsule | De te detecteren capsule |
delta | out Vector3 | Penetratievector |
Gebruiksvoorbeeld:
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
Beschrijving:
- Vereist dat de gegevens botsingsknooppunten bevatten.
- Vereist dat
SetColliderEnable(true)eerst wordt aangeroepen. - Geschikt voor botsing van first-person / third-person personages.
Raycast
// Retourwaarde: bool → true=geraakt
public bool Raycast(Ray _ray, out HitResult _finalResult)
Gebruikt een aangepaste Ray om straaldetectie op Gaussiaanse primitieven uit te voeren, waarbij alle actieve Renderers worden doorlopen en de dichtstbijzijnde treffer wordt geretourneerd. Vertrouwt niet op de botsings-Mesh; hogere precisie maar langzamer.
| Parameter | Type | Beschrijving |
|---|---|---|
_ray | Ray | De straal |
_finalResult | out HitResult | Hitresultaat |
Gebruiksvoorbeeld:
Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
Beschrijving:
- Vertrouwt niet op de botsings-Mesh, geen
SetColliderEnablenodig. - Hogere precisie maar langzamer, niet aanbevolen voor aanroepen per frame, geschikt voor meettoepassingen, niet geschikt voor botsing van digitale mensen.
HitResult
De hitresultaten van de bovenstaande detectiemethoden worden geretourneerd via de HitResult-struct:
public struct HitResult {
public bool isHit; // Of er een treffer is geweest
public float distance; // Afstand
public Vector3 hitPos; // Wereldcoördinaten van het trefpunt (de veldnaam is hitPos, niet position)
public Vector3 normal; // Treffernormaal
public float hitAlpha; // Alpha van de geraakte ellipsoïde
public float dist2Origin; // Afstand tot de straaloorsprong
public float scale; // Ellipsoïdeschaal
}
Opmerking:
De veldnaam van de wereldcoördinaten van het trefpunt is
hitPos, nietposition; benader deze via de daadwerkelijke veldnaam.