İçeriğe geç
TREN
Atlıhan Harita

LCC for Unity Kullanım Kılavuzu · Özellik Geliştirme Kılavuzu

Çarpışma Sistemi Geliştirme Kılavuzu

Bölüm 15.19 / 17Kılavuz sürümü v2.3.0Türkçe

LCC Unity SDK, yerleşik bir çarpışma sistemine sahiptir. Bu sistem, çarpışma alanı (collider) oluşturmayı ve çarpışma algılamayı hızlandırmaya, yani çarpışma performansı sorununu çözmeye odaklanır. Unity'nin Collider sistemi, çok büyük sahnelerde gerçek zamanlı algılamayı işleyemez.

LCC Unity SDK, Unity'nin MeshCollider bileşenine ve ilgili özelliklere dayanmayan, kendi yerleşik çarpışma sistemini kullanır. Bu nedenle Unity sahnesindeki GameObject'ler üzerinde doğrudan etkili olamaz. XGrids'in ürettiği resmi LCC veri formatı (LCC Studio), yeniden oluşturma sırasında çarpışma için kullanılan mesh verisini de aynı anda üretir. SDK bu çarpışma verisini kullanarak sahne çarpışmasını hızlı ve verimli biçimde oluşturur. Çarpışma sistemi SDK'ya özgü olduğundan, çarpışma özelliğini kullanmak için SDK'nın sunduğu ilgili metotları çağırmanız gerekir.

Not:

SDK'nın yerleşik çarpışma sistemi Unity'nin Collider sistemiyle uyumlu değildir ve Unity'deki Rigidbody nesneleri üzerinde doğrudan etkili olamaz. Dijital insan gibi karakterlerin çarpışması, SDK'nın algılama metotlarıyla yönetilmelidir (aşağıdaki "Dijital İnsan Çarpışma Uygulaması" bölümüne bakın).

Sabit sahnelerde mesh verisini çıkarıp önceden NavMesh olarak bake edebilirsiniz. Bu yöntem Unity'nin Collider sistemiyle uyumludur. Ayrıntılar için NavMesh kılavuzuna bakın.

Veri Ön Koşulları

Çarpışma algılamanın çalışması için ön koşul, sahnenin ilgili çarpışma verisine sahip olmasıdır. Önceki sürümlerde yeniden oluşturulan veriler çarpışma verisi içermeyebilir. Bu durumda SetColliderEnable(true) çağrısı false döndürür ve sonraki tüm algılama metotları kullanılamaz.

Bu nedenle çarpışmayı etkinleştirdikten sonra dönüş değerini mutlaka kontrol edin:

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("The current data contains no collider, cannot enable collision detection");
}

Temel Kullanım İş Akışı

Çarpışma özelliğinin temel iş akışı üç adımdan oluşur:

  1. Sahne verisini Load() metodu ile yükleyin.
  2. Yükleme tamamlandığında çağrılan geri çağrı fonksiyonunda SetColliderEnable(true) ile çarpışmayı etkinleştirin.
  3. Çeşitli algılama metotlarıyla (RaycastMesh / IntersectsSphere / IntersectsCapsule) çarpışma algılamayı gerçekleştirin.
// 1. Load the scene
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. Enable collision after loading completes
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

void Update()
{
    if (!colliderReady) return;

    // 3. Perform collision detection every frame
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

Not:

SetColliderEnable(), Renderer sınıfının bir metodudur. Algılama metotları (RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast) ise LCCManager üzerindedir. Bunları ilgili nesneler üzerinde ayrı ayrı çağırın.

Temel çarpışma sistemi iş akışı: sahneyi yükleme → çarpışmayı etkinleştirme → çarpışma algılama

Temel çarpışma sistemi iş akışı

Dijital İnsan Çarpışma Uygulaması

SDK'nın çarpışma sistemi Unity'nin Rigidbody bileşeni üzerinde etkili olmadığından, dijital insanların (karakterlerin) çarpışması algılama metotlarıyla yönetilmelidir. Yaygın olarak üç yaklaşım kullanılır:

  • Çift ışın algılama: RaycastMesh() ile biri aşağı, biri ileri olmak üzere iki ışın gönderin. Karakterin yürüyüp yürüyemeyeceğini ışın sonuçlarına göre belirleyin (aşağı doğru zemini, ileri doğru engelleri yoklayın).
  • Kapsül algılama: IntersectsCapsule() ile dijital insanın içinde bulunduğu kapsülün çarpışma mesh'i ile kesişip kesişmediğini algılayın ve yürüyüp yürüyemeyeceğini belirleyin. Aşırı yüklenmiş sürümün _delta değeri, güvenle ulaşılabilecek bir sonraki noktanın ofsetini döndürür.
  • Küre algılama: IntersectsSphere() ile dijital insanın içinde bulunduğu kürenin çarpışma mesh'i ile kesişip kesişmediğini algılayın ve yürüyüp yürüyemeyeceğini belirleyin. Aşırı yüklenmiş sürümün _delta değeri de güvenle ulaşılabilecek bir noktanın ofsetini döndürür.
Dijital insan çarpışması için üç uygulama yaklaşımı: çift ışın, kapsül ve küre algılama

Dijital insan çarpışması için üç uygulama yaklaşımı

RaycastMesh ve Raycast Arasında Seçim

SDK, farklı amaçlara yönelik iki tür ışın algılama metodu sunar:

YöntemAlgılama hedefiHassasiyetHızUygun senaryo
RaycastMesh()Çarpışma mesh'i (Collider verisi)Göreceli olarak düşükHızlıDijital insan çarpışması, kare başına algılama
Raycast()Gauss primitifleri (çarpışma mesh'ine dayanmaz)Göreceli olarak yüksekYavaşÖlçüm türü uygulamalar

Raycast(), ışın algılamayı doğrudan Gauss primitifleri üzerinde yapar. Hassasiyeti daha yüksektir ancak hızı düşüktür ve her karede çağrılması önerilmez. Bu nedenle dijital insan çarpışması için uygun değildir, yalnızca ölçüm türü kullanımlara uygundur. Dijital insan çarpışması için çarpışma mesh'ine dayanan RaycastMesh() metodunu tercih edin.

Aşağıdaki çarpışmayla ilgili metotlardan SetColliderEnable(), Renderer üzerindedir; diğer algılama metotları ise LCCManager üzerindedir. Tüm algılama metotları yalnızca sahne yüklemeyi tamamladıktan ve SetColliderEnable(true) başarıyla çağrıldıktan sonra kullanılabilir.

SetColliderEnable

// Return value: bool → true=set successfully, false=data contains no collider or instance is not active
public bool SetColliderEnable(bool _enable)

Collider özelliğini açar veya kapatır. Etkinleştirildikten sonra IntersectsSphere / IntersectsCapsule / RaycastMesh kullanılabilir hale gelir.

ParametreTürAçıklama
_enableboolCollider'ın etkinleştirilip etkinleştirilmeyeceği

Kullanım örneği:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("Data contains no collider");

Açıklama:

  • Veri çarpışma (Mesh) verisi içermelidir, aksi halde false döndürülür.
  • Renderer bileşeninin etkin durumda olması gerekir.

RaycastMesh (ekran koordinatları)

// Return value: bool → true=hit
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

Ekran koordinatlarından bir ışın göndererek çarpışma mesh'ini algılar. Algılama için Collider verisini kullanır; Raycast metodundan daha hızlıdır ancak hassasiyeti daha düşüktür.

ParametreTürAçıklama
mousePosVector3Ekran koordinatları
_finalResultout HitResultİsabet sonucu
_disatncefloatMaksimum algılama mesafesi, varsayılan 70.0

Kullanım örneği:

if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Açıklama:

  • Önce çarpışmanın başarıyla etkinleştirilmiş olması gerekir.
  • Önce SetColliderEnable(true) çağrılmalıdır.

RaycastMesh (Işın + Sınırlar)

// Return value: bool → true=hit
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

Çarpışma mesh'i algılaması için özel bir Ray kullanır ve isabet eden düğümün sınırlayıcı kutu bilgisini de döndürür.

ParametreTürAçıklama
rayRayIşın
resultout HitResultİsabet sonucu
hitBoundsout Boundsİsabet eden düğümün sınırlayıcı kutusu (isabet eden LOD düğümünün sınırlayıcı kutusu)
maxDistfloatMaksimum algılama mesafesi, varsayılan 70.0

Kullanım örneği:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
    Debug.Log(bounds.center);
}

Açıklama:

  • Önce çarpışmanın başarıyla etkinleştirilmiş olması gerekir.
  • Bu metot, bir dijital insanın yürüyüp yürüyemeyeceğini belirlemek için çoğunlukla çift ışın algılamada (aşağı ve ileri) kullanılır.

IntersectsSphere

// Return value: bool → true=intersect
public bool IntersectsSphere(Sphere sphere)

// Return value: bool → true=intersect
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

Bir kürenin çarpışma mesh'i ile kesişip kesişmediğini algılar. İkinci aşırı yükleme ek olarak, bir sonraki güvenli ulaşılabilir noktayı hesaplamak için kullanılabilen delta penetrasyon vektörünü (itme yönü ve mesafesi) döndürür.

ParametreTürAçıklama
sphereSphereAlgılanacak küre
deltaout Vector3Penetrasyon vektörü (itme yönü ve mesafesi)

Kullanım örneği:

var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
    transform.position += delta;
}

Açıklama:

  • Önce çarpışmanın başarıyla etkinleştirilmiş olması gerekir.
  • Önce SetColliderEnable(true) çağrılmalıdır.
  • Etkin tüm Renderer bileşenleri üzerinde yineleme yapar.

IntersectsCapsule

// Return value: bool → true=intersect
public bool IntersectsCapsule(Capsule capsule)

// Return value: bool → true=intersect
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

Bir kapsülün çarpışma mesh'i ile kesişip kesişmediğini algılar. Çoğunlukla karakter denetleyicisi çarpışma algılamada kullanılır. İkinci aşırı yükleme, dijital insan için bir sonraki güvenli ulaşılabilir noktaya ofset olarak kullanılabilen delta penetrasyon vektörünü döndürür.

ParametreTürAçıklama
capsuleCapsuleAlgılanacak kapsül
deltaout Vector3Penetrasyon vektörü

Kullanım örneği:

var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
    characterController.Move(delta);
}

Açıklama:

  • Verinin çarpışma düğümleri içermesi gerekir.
  • Önce SetColliderEnable(true) çağrılmalıdır.
  • Birinci şahıs / üçüncü şahıs karakter çarpışması için uygundur.

Raycast

// Return value: bool → true=hit
public bool Raycast(Ray _ray, out HitResult _finalResult)

Gauss primitifleri üzerinde ışın algılama yapmak için özel bir Ray kullanır, etkin tüm Renderer bileşenleri üzerinde yineleme yapar ve en yakın isabeti döndürür. Çarpışma mesh'ine dayanmaz; hassasiyeti daha yüksektir ancak daha yavaştır.

ParametreTürAçıklama
_rayRayIşın
_finalResultout HitResultİsabet sonucu

Kullanım örneği:

Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

Açıklama:

  • Çarpışma mesh'ine dayanmaz, SetColliderEnable gerekmez.
  • Hassasiyeti daha yüksektir ancak daha yavaştır, her karede çağrılması önerilmez, ölçüm türü uygulamalara uygundur, dijital insan çarpışması için uygun değildir.

HitResult

Yukarıdaki algılama metotlarının isabet sonuçları HitResult struct'ı ile döndürülür:

public struct HitResult {
    public bool isHit;             // Whether it hit
    public float distance;         // Distance
    public Vector3 hitPos;         // Hit point world coordinates (field name is hitPos, not position)
    public Vector3 normal;         // Hit normal
    public float hitAlpha;         // Alpha of the hit ellipsoid
    public float dist2Origin;      // Distance to the ray origin
    public float scale;            // Ellipsoid scale
}

Not:

İsabet noktasının dünya koordinatlarını içeren alanın adı position değil, hitPos şeklindedir. Alana gerçek adıyla erişin.

Bu bölüm XGRIDS'in resmî kullanım kılavuzundan Türkçeye çevrildi; ekran görüntüleri ve arayüz adları özgün haliyle İngilizcedir. İngilizce aslı (yeni sekmede açılır) · Güncelleme:

XGRIDS Türkiye

Kurulumda ve Sahada Yanınızdayız

Atlıhan Harita; cihaz kurulumu, firmware güncellemesi, yazılım kullanımı ve saha uygulamalarında eğitim ve teknik destek verir. Sorunuzu iletin, uzmanımız size dönsün.

+90 216 546 0804