コリジョンシステム開発ガイド
LCC Unity SDK はコリジョンシステムを内蔵しており、コライダー構築とコリジョン検出の高速化、つまりコリジョン性能問題の解決に重点を置いています。Unity の Collider システムは、超大規模シーンでのリアルタイム検出を処理できません。
LCC Unity SDK は自前のコリジョンシステムを使用し、Unity の MeshCollider コンポーネントや関連機能に依存しなくなったため、Unity シーン内の GameObject に直接作用させることはできません。XGrids(LCC Studio)が生成する公式 LCC データ形式は、再構築時にコリジョンに使用する Mesh データを同時に生成し、SDK はこのコリジョンデータを使ってシーンコリジョンを高速かつ効率的に構築します。自前のコリジョンシステムであるため、コリジョン機能を使用するには SDK が提供する対応メソッドを呼び出す必要があります。
注:
SDK 内蔵のコリジョンシステムは Unity の Collider システムと非互換で、Unity 内の
Rigidbodyオブジェクトに直接作用させることはできません。デジタルヒューマンなどのキャラクターのコリジョンは、SDK の検出メソッドで駆動する必要があります(下記「デジタルヒューマンのコリジョン実装」を参照)。固定シーンでは、Mesh データを抽出して事前に NavMesh にベイクすることで、Unity の Collider システムと互換にすることもできます。詳細は NavMesh ガイドを参照してください。
データの前提条件
コリジョン検出が機能する前提条件は、シーンに対応するコリジョンデータがあることです。以前のバージョンで再構築されたデータにはコリジョンデータが含まれない場合があり、その場合は SetColliderEnable(true) を呼び出すと false が返り、以降のすべての検出メソッドが利用できません。
したがって、コリジョンを有効化した後は必ず戻り値を確認してください。
bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
Debug.LogWarning("現在のデータにはコライダーが含まれていないため、コリジョン検出を有効化できません");
}
基本的な使用手順
コリジョン機能の基本手順は 3 ステップです。
Load()メソッドでシーンデータを読み込みます。- 読み込み完了コールバックで
SetColliderEnable(true)によりコリジョンを有効化します。 - 各種検出メソッド(
RaycastMesh/IntersectsSphere/IntersectsCapsule)でコリジョン検出を実行します。
// 1. シーンを読み込む
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
// 2. 読み込み完了後にコリジョンを有効化
if (renderer.SetColliderEnable(true))
{
colliderReady = true;
}
});
void Update()
{
if (!colliderReady) return;
// 3. 毎フレームコリジョン検出を実行
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
}
注:
SetColliderEnable()はRendererのメソッドで、検出メソッド(RaycastMesh/IntersectsSphere/IntersectsCapsule/Raycast)はLCCManagerにあります。それぞれ対応するオブジェクトで呼び出してください。

コリジョンシステムの基本手順
デジタルヒューマンのコリジョン実装
SDK のコリジョンシステムは Unity の Rigidbody に作用しないため、デジタルヒューマン(キャラクター)のコリジョンは検出メソッドで駆動する必要があります。一般的な方法は 3 つあります。
- デュアルレイ検出:
RaycastMesh()で下向きと前向きの 2 本のレイを発射し、レイの戻り結果に基づいてキャラクターが歩行可能か判断します(地面を下向きにプローブ、障害物を前向きにプローブ)。 - カプセル検出:
IntersectsCapsule()でデジタルヒューマンがいるカプセルがコリジョンメッシュと交差するか検出し、歩行可能か判断します。オーバーロード版の_deltaは次の安全到達点のオフセットを返します。 - 球体検出:
IntersectsSphere()でデジタルヒューマンがいる球がコリジョンメッシュと交差するか検出し、歩行可能か判断します。オーバーロード版の_deltaも安全到達点のオフセットを返します。

デジタルヒューマンコリジョンの 3 つの実装方法
RaycastMesh と Raycast の使い分け
SDK は用途の異なる 2 種類のレイ検出メソッドを提供しています。
| メソッド | 検出対象 | 精度 | 速度 | 適用シナリオ |
|---|---|---|---|---|
RaycastMesh() | コリジョンメッシュ(Collider データ) | 比較的低い | 高速 | デジタルヒューマンコリジョン、毎フレーム検出 |
Raycast() | ガウスプリミティブ(コリジョンメッシュに依存しない) | 比較的高い | 低速 | 計測系アプリケーション |
Raycast() はガウスプリミティブに対して直接レイ検出を行い、精度は高いですが速度が遅く、毎フレーム呼び出しには推奨されません。そのためデジタルヒューマンコリジョンには不向きで、計測系用途のみに適しています。デジタルヒューマンコリジョンには、コリジョンメッシュに依存する RaycastMesh() を優先してください。
関連 API
以下のコリジョン関連メソッドのうち、SetColliderEnable() は Renderer にあり、残りの検出メソッドは LCCManager にあります。すべての検出メソッドは、シーンの読み込み完了後 かつ SetColliderEnable(true) が正常に呼び出された後でのみ利用できます。
SetColliderEnable
// 戻り値: bool → true=正常に設定、false=データにコライダーがないかインスタンスが非アクティブ
public bool SetColliderEnable(bool _enable)
コライダー機能を切り替えます。有効化後、IntersectsSphere / IntersectsCapsule / RaycastMesh が利用可能になります。
| パラメータ | 型 | 説明 |
|---|---|---|
_enable | bool | コライダーを有効にするかどうか |
使用例:
bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("データにコライダーが含まれていません");
説明:
- データにコリジョン(Mesh)データが含まれている必要があります。含まれていない場合は
falseを返します。 Rendererがアクティブ状態である必要があります。
RaycastMesh(スクリーン座標)
// 戻り値: bool → true=ヒット
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)
スクリーン座標からレイを発射してコリジョンメッシュを検出します。Collider データで検出するため、Raycast より高速ですが精度は低くなります。
| パラメータ | 型 | 説明 |
|---|---|---|
mousePos | Vector3 | スクリーン座標 |
_finalResult | out HitResult | ヒット結果 |
_disatnce | float | 最大検出距離。デフォルト 70.0 |
使用例:
if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
説明:
- 先にコリジョンを正常に有効化する必要があります。
- 先に
SetColliderEnable(true)を呼び出す必要があります。
RaycastMesh(Ray + Bounds)
// 戻り値: bool → true=ヒット
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)
カスタムの Ray でコリジョンメッシュ検出を行い、ヒットしたノードのバウンディングボックス情報も返します。
| パラメータ | 型 | 説明 |
|---|---|---|
ray | Ray | レイ |
result | out HitResult | ヒット結果 |
hitBounds | out Bounds | ヒットしたノードのバウンディングボックス(ヒットした LOD ノードのバウンディングボックス) |
maxDist | float | 最大検出距離。デフォルト 70.0 |
使用例:
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
Debug.Log(bounds.center);
}
説明:
- 先にコリジョンを正常に有効化する必要があります。
- このメソッドは、デジタルヒューマンが歩行可能か判断するデュアルレイ検出(下向き、前向き)によく使用されます。
IntersectsSphere
// 戻り値: bool → true=交差
public bool IntersectsSphere(Sphere sphere)
// 戻り値: bool → true=交差
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)
球がコリジョンメッシュと交差するか検出します。2 つ目のオーバーロードは貫通ベクトル delta(押し出し方向と距離)も返し、次の安全到達点の計算に使用できます。
| パラメータ | 型 | 説明 |
|---|---|---|
sphere | Sphere | 検出する球 |
delta | out Vector3 | 貫通ベクトル(押し出し方向と距離) |
使用例:
var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
transform.position += delta;
}
説明:
- 先にコリジョンを正常に有効化する必要があります。
- 先に
SetColliderEnable(true)を呼び出す必要があります。 - すべてのアクティブな
Rendererを走査します。
IntersectsCapsule
// 戻り値: bool → true=交差
public bool IntersectsCapsule(Capsule capsule)
// 戻り値: bool → true=交差
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)
カプセルがコリジョンメッシュと交差するか検出します。キャラクターコントローラーのコリジョン検出によく使用されます。2 つ目のオーバーロードは貫通ベクトル delta を返し、デジタルヒューマンの次の安全到達点へのオフセットとして使用できます。
| パラメータ | 型 | 説明 |
|---|---|---|
capsule | Capsule | 検出するカプセル |
delta | out Vector3 | 貫通ベクトル |
使用例:
var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
characterController.Move(delta);
}
説明:
- データにコリジョンノードが含まれている必要があります。
- 先に
SetColliderEnable(true)を呼び出す必要があります。 - 一人称 / 三人称キャラクターのコリジョンに適しています。
Raycast
// 戻り値: bool → true=ヒット
public bool Raycast(Ray _ray, out HitResult _finalResult)
カスタムの Ray でガウスプリミティブに対するレイ検出を行い、すべてのアクティブな Renderer を走査して最も近いヒットを返します。コリジョンメッシュに依存せず、精度は高いですが速度が遅くなります。
| パラメータ | 型 | 説明 |
|---|---|---|
_ray | Ray | レイ |
_finalResult | out HitResult | ヒット結果 |
使用例:
Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
Debug.Log(hit.hitPos);
}
説明:
- コリジョンメッシュに依存せず、
SetColliderEnableは不要です。 - 精度は高いですが速度が遅く、毎フレーム呼び出しには推奨されません。計測系アプリケーションに適しており、デジタルヒューマンコリジョンには適していません。
HitResult
上記の検出メソッドのヒット結果は HitResult 構造体で返されます。
public struct HitResult {
public bool isHit; // ヒットしたかどうか
public float distance; // 距離
public Vector3 hitPos; // ヒット点のワールド座標(フィールド名は position ではなく hitPos)
public Vector3 normal; // ヒット法線
public float hitAlpha; // ヒットした楕円体のアルファ
public float dist2Origin; // レイ原点までの距離
public float scale; // 楕円体のスケール
}
注:
ヒット点ワールド座標のフィールド名は
hitPos(positionではありません)。実際のフィールド名でアクセスしてください。