Entwicklungsanleitung für das Kollisionssystem
Das LCC Unity SDK verfügt über ein eingebautes Kollisionssystem, das sich darauf konzentriert, die Beschleunigung der Collider-Konstruktion und der Kollisionserkennung zu lösen — also das Kollisionsleistungsproblem. Das Collider-System von Unity kann Echtzeit-Erkennung in sehr großen Szenen nicht bewältigen.
Das LCC Unity SDK verwendet sein eigenes eingebautes Kollisionssystem und stützt sich nicht mehr auf die Komponente MeshCollider von Unity und zugehörige Fähigkeiten, daher kann es nicht direkt auf GameObjects in einer Unity-Szene einwirken. Das offizielle LCC-Datenformat, das von XGrids (LCC Studio) erzeugt wird, erzeugt während der Rekonstruktion gleichzeitig Mesh-Daten, die für Kollisionen verwendet werden, und das SDK nutzt diese Kollisionsdaten, um die Szenenkollision schnell und effizient aufzubauen. Da es sich um ein selbstgebautes Kollisionssystem handelt, erfordert die Verwendung der Kollisionsfunktion den Aufruf der entsprechenden, vom SDK bereitgestellten Methoden.
Hinweis:
Das eingebaute Kollisionssystem des SDK ist mit dem Collider-System von Unity inkompatibel und kann nicht direkt auf
Rigidbody-Objekte in Unity einwirken. Die Kollision für Figuren wie digitale Menschen muss durch die Erkennungsmethoden des SDK angetrieben werden (siehe „Implementierung der Kollision digitaler Menschen“ unten).Für feste Szenen können Sie die Mesh-Daten auch extrahieren und im Voraus in ein NavMesh backen, das mit dem Collider-System von Unity kompatibel ist; Einzelheiten finden Sie in der NavMesh-Anleitung.
Datenvoraussetzungen
Die Voraussetzung für das Funktionieren der Kollisionserkennung ist, dass die Szene über entsprechende Kollisionsdaten verfügt. In früheren Versionen rekonstruierte Daten enthalten möglicherweise keine Kollisionsdaten; in diesem Fall gibt der Aufruf von SetColliderEnable(true) false zurück, und alle nachfolgenden Erkennungsmethoden sind nicht verfügbar.
Überprüfen Sie daher nach dem Aktivieren der Kollision unbedingt den Rückgabewert:
bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
Debug.LogWarning("Die aktuellen Daten enthalten keinen Collider, die Kollisionserkennung kann nicht aktiviert werden");
}
Grundlegender Verwendungsablauf
Der grundlegende Ablauf der Kollisionsfunktion besteht aus drei Schritten:
- Die Szenendaten über die Methode
Load()laden. - Im Abschluss-Callback des Ladens die Kollision über
SetColliderEnable(true)aktivieren. - Die Kollisionserkennung über die verschiedenen Erkennungsmethoden (
RaycastMesh/IntersectsSphere/IntersectsCapsule) ausführen.
// 1. Die Szene laden
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
// 2. Kollision nach Abschluss des Ladens aktivieren
if (renderer.SetColliderEnable(true))
{
colliderReady = true;
}
});
void Update()
{
if (!colliderReady) return;
// 3. Kollisionserkennung in jedem Frame ausführen
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
}
Hinweis:
SetColliderEnable()ist eine Methode vonRenderer, während sich die Erkennungsmethoden (RaycastMesh/IntersectsSphere/IntersectsCapsule/Raycast) aufLCCManagerbefinden. Rufen Sie sie jeweils auf den entsprechenden Objekten auf.

Grundlegender Ablauf des Kollisionssystems
Implementierung der Kollision digitaler Menschen
Da das Kollisionssystem des SDK nicht auf das Rigidbody von Unity einwirkt, muss die Kollision für digitale Menschen (Figuren) durch die Erkennungsmethoden angetrieben werden. Es gibt drei gängige Ansätze:
- Dual-Ray-Erkennung:
RaycastMesh()verwenden, um einen Strahl nach unten und einen nach vorn abzufeuern, und anhand der Strahlergebnisse beurteilen, ob die Figur laufen kann (nach unten den Boden sondieren, nach vorn Hindernisse sondieren). - Kapsel-Erkennung:
IntersectsCapsule()verwenden, um zu erkennen, ob die Kapsel, in der sich der digitale Mensch befindet, das Kollisions-Mesh schneidet, und beurteilen, ob er laufen kann. Die_deltader überladenen Version gibt den Versatz des nächsten sicher erreichbaren Punkts zurück. - Kugel-Erkennung:
IntersectsSphere()verwenden, um zu erkennen, ob die Kugel, in der sich der digitale Mensch befindet, das Kollisions-Mesh schneidet, und beurteilen, ob er laufen kann. Die_deltader überladenen Version gibt ebenfalls den Versatz eines sicher erreichbaren Punkts zurück.

Drei Implementierungsansätze für die Kollision digitaler Menschen
Wahl zwischen RaycastMesh und Raycast
Das SDK stellt zwei Arten von Strahlerkennungsmethoden mit unterschiedlichen Zwecken bereit:
| Methode | Erkennungsziel | Präzision | Geschwindigkeit | Geeignetes Szenario |
|---|---|---|---|---|
RaycastMesh() | Kollisions-Mesh (Collider-Daten) | Relativ niedrig | Schnell | Kollision digitaler Menschen, Erkennung pro Frame |
Raycast() | Gauß-Primitive (stützt sich nicht auf das Kollisions-Mesh) | Relativ hoch | Langsam | Messungsartige Anwendungen |
Raycast() führt die Strahlerkennung direkt auf Gauß-Primitiven aus, mit höherer Präzision, aber langsamerer Geschwindigkeit, und wird nicht für Aufrufe pro Frame empfohlen, daher ist es nicht für die Kollision digitaler Menschen geeignet, sondern nur für messungsartige Verwendungen. Für die Kollision digitaler Menschen bevorzugen Sie RaycastMesh(), das sich auf das Kollisions-Mesh stützt.
Zugehörige APIs
Bei den folgenden kollisionsbezogenen Methoden befindet sich SetColliderEnable() auf Renderer, während sich die übrigen Erkennungsmethoden auf LCCManager befinden. Alle Erkennungsmethoden sind erst verfügbar, nachdem die Szene das Laden abgeschlossen hat und SetColliderEnable(true) erfolgreich aufgerufen wurde.
SetColliderEnable
// Rückgabewert: bool → true=erfolgreich gesetzt, false=Daten enthalten keinen Collider oder Instanz ist nicht aktiv
public bool SetColliderEnable(bool _enable)
Schaltet die Collider-Funktion um. Nach dem Aktivieren werden IntersectsSphere / IntersectsCapsule / RaycastMesh verfügbar.
| Parameter | Typ | Beschreibung |
|---|---|---|
_enable | bool | Ob der Collider aktiviert werden soll |
Verwendungsbeispiel:
bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Daten enthalten keinen Collider");
Beschreibung:
- Die Daten müssen Kollisions- (Mesh-) Daten enthalten, andernfalls wird
falsezurückgegeben. - Erfordert, dass der
Renderersich in einem aktiven Zustand befindet.
RaycastMesh (Bildschirmkoordinaten)
// Rückgabewert: bool → true=Treffer
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)
Feuert einen Strahl aus Bildschirmkoordinaten ab, um das Kollisions-Mesh zu erkennen. Verwendet Collider-Daten für die Erkennung, schneller als Raycast, aber mit niedrigerer Präzision.
| Parameter | Typ | Beschreibung |
|---|---|---|
mousePos | Vector3 | Bildschirmkoordinaten |
_finalResult | out HitResult | Trefferergebnis |
_disatnce | float | Maximale Erkennungsdistanz, Standard 70.0 |
Verwendungsbeispiel:
if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
Beschreibung:
- Erfordert, dass die Kollision zuerst erfolgreich aktiviert wurde.
- Erfordert, dass zuerst
SetColliderEnable(true)aufgerufen wurde.
RaycastMesh (Ray + Bounds)
// Rückgabewert: bool → true=Treffer
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)
Verwendet einen benutzerdefinierten Ray für die Kollisions-Mesh-Erkennung und gibt außerdem die Bounding-Box-Informationen des getroffenen Knotens zurück.
| Parameter | Typ | Beschreibung |
|---|---|---|
ray | Ray | Der Strahl |
result | out HitResult | Trefferergebnis |
hitBounds | out Bounds | Bounding Box des getroffenen Knotens (Bounding Box des getroffenen LOD-Knotens) |
maxDist | float | Maximale Erkennungsdistanz, Standard 70.0 |
Verwendungsbeispiel:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
Debug.Log(bounds.center);
}
Beschreibung:
- Erfordert, dass die Kollision zuerst erfolgreich aktiviert wurde.
- Diese Methode wird üblicherweise für die Dual-Ray-Erkennung (nach unten, nach vorn) verwendet, um zu beurteilen, ob ein digitaler Mensch laufen kann.
IntersectsSphere
// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsSphere(Sphere sphere)
// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)
Erkennt, ob eine Kugel das Kollisions-Mesh schneidet. Die zweite Überladung gibt zusätzlich den Durchdringungsvektor delta (Ausschieberichtung und -distanz) zurück, der verwendet werden kann, um den nächsten sicher erreichbaren Punkt zu berechnen.
| Parameter | Typ | Beschreibung |
|---|---|---|
sphere | Sphere | Die zu erkennende Kugel |
delta | out Vector3 | Durchdringungsvektor (Ausschieberichtung und -distanz) |
Verwendungsbeispiel:
var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
transform.position += delta;
}
Beschreibung:
- Erfordert, dass die Kollision zuerst erfolgreich aktiviert wurde.
- Erfordert, dass zuerst
SetColliderEnable(true)aufgerufen wurde. - Iteriert über alle aktiven
Renderer.
IntersectsCapsule
// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsCapsule(Capsule capsule)
// Rückgabewert: bool → true=Schnittpunkt
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)
Erkennt, ob eine Kapsel das Kollisions-Mesh schneidet. Wird üblicherweise für die Kollisionserkennung von Character Controllern verwendet. Die zweite Überladung gibt den Durchdringungsvektor delta zurück, der als Versatz zum nächsten sicher erreichbaren Punkt für einen digitalen Menschen verwendet werden kann.
| Parameter | Typ | Beschreibung |
|---|---|---|
capsule | Capsule | Die zu erkennende Kapsel |
delta | out Vector3 | Durchdringungsvektor |
Verwendungsbeispiel:
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
Beschreibung:
- Erfordert, dass die Daten Kollisionsknoten enthalten.
- Erfordert, dass zuerst
SetColliderEnable(true)aufgerufen wurde. - Geeignet für die Kollision von Erst-Person-/Dritt-Person-Figuren.
Raycast
// Rückgabewert: bool → true=Treffer
public bool Raycast(Ray _ray, out HitResult _finalResult)
Verwendet einen benutzerdefinierten Ray, um eine Strahlerkennung auf Gauß-Primitiven auszuführen, iteriert über alle aktiven Renderer und gibt den nächsten Treffer zurück. Stützt sich nicht auf das Kollisions-Mesh; höhere Präzision, aber langsamer.
| Parameter | Typ | Beschreibung |
|---|---|---|
_ray | Ray | Der Strahl |
_finalResult | out HitResult | Trefferergebnis |
Verwendungsbeispiel:
Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
Beschreibung:
- Stützt sich nicht auf das Kollisions-Mesh, kein
SetColliderEnableerforderlich. - Höhere Präzision, aber langsamer, nicht für Aufrufe pro Frame empfohlen, geeignet für messungsartige Anwendungen, nicht geeignet für die Kollision digitaler Menschen.
HitResult
Die Trefferergebnisse der obigen Erkennungsmethoden werden über die Struktur HitResult zurückgegeben:
public struct HitResult {
public bool isHit; // Ob ein Treffer aufgetreten ist
public float distance; // Distanz
public Vector3 hitPos; // Trefferpunkt in Weltkoordinaten (Feldname ist hitPos, nicht position)
public Vector3 normal; // Treffernormale
public float hitAlpha; // Alpha des getroffenen Ellipsoids
public float dist2Origin; // Distanz zum Strahlursprung
public float scale; // Ellipsoid-Skalierung
}
Hinweis:
Der Feldname der Trefferpunkt-Weltkoordinaten lautet
hitPos, nichtposition; greifen Sie über den tatsächlichen Feldnamen darauf zu.