الكيانات ذات الصلة

تمثل الوحدة كائنا قابلا للنقل في الفضاء وهي اللبنة الأساسية للمحتوى المعروض عن بعد.

خصائص الكيان

الكيانات لها تحويل يحدده الموضع والتناوب والمقياس. لا تحتوي الكيانات في حد ذاتها على أي وظائف يمكن ملاحظتها. بدلا من ذلك، تتم إضافة السلوك من خلال المكونات المرفقة بالكيانات. على سبيل المثال، يؤدي إرفاق CutPlaneComponent إلى إنشاء مستوى قطع في موضع الكيان.

الجانب الأكثر أهمية للكيان نفسه هو التسلسل الهرمي والتحول الهرمي الناتج. على سبيل المثال، عند إرفاق كيانات متعددة ككيانات فرعية بكيان أصل مشترك، يمكن نقل جميع هذه الكيانات وتدويرها وتوسيع نطاقها في انسجام عن طريق تغيير تحويل الكيان الأصل. أيضا، يمكن استخدام حالة الكيان enabled لإيقاف الرؤية والاستجابات لأجهزة إرسال الأشعة للحصول على رسم بياني فرعي كامل في التسلسل الهرمي.

الكيان مملوك بشكل فريد من قبل الأصل الخاص به، ما يعني أنه عندما يتم تدمير الأصل مع Entity.Destroy()، وكذلك التوابع الخاصة به وجميع المكونات المتصلة. وبالتالي، تتم إزالة نموذج من المشهد عن طريق استدعاء Destroy على العقدة الجذر للنموذج، التي يتم إرجاعها بواسطة RenderingSession.Connection.LoadModelAsync() أو متغير RenderingSession.Connection.LoadModelFromSasAsync()SAS الخاص به.

يتم إنشاء الكيانات عندما يقوم الخادم بتحميل المحتوى أو عندما يريد المستخدم إضافة عنصر إلى المشهد. على سبيل المثال، إذا أراد المستخدم إضافة مستوى قطع لتصور الجزء الداخلي من شبكة، يمكن للمستخدم إنشاء كيان حيث يجب أن تكون الطائرة موجودة ثم إضافة مكون مستوى القطع إليه.

إنشاء كيان

لإضافة كيان جديد إلى المشهد، على سبيل المثال لتمريره ككائن جذر لتحميل النماذج أو إرفاق مكونات به، استخدم التعليمات البرمجية التالية:

Entity CreateNewEntity(RenderingSession session)
{
    Entity entity = session.Connection.CreateEntity();
    entity.Position = new LocalPosition(1, 2, 3);
    return entity;
}
ApiHandle<Entity> CreateNewEntity(ApiHandle<RenderingSession> session)
{
    ApiHandle<Entity> entity(nullptr);
    if (auto entityRes = session->Connection()->CreateEntity())
    {
        entity = entityRes.value();
        entity->SetPosition(Double3{ 1, 2, 3 });
        return entity;
    }
    return entity;
}

دالات الاستعلام

هناك نوعان من دالات الاستعلام على الكيانات: استدعاءات متزامنة وغير متزامنة. يمكن استخدام الاستعلامات المتزامنة فقط للبيانات الموجودة على العميل ولا تتضمن الكثير من الحساب. ومن الأمثلة على ذلك الاستعلام عن المكونات أو تحويلات الكائنات النسبية أو العلاقات الأصل/التابع. تستخدم الاستعلامات غير المتزامنة للبيانات الموجودة فقط على الخادم أو تتضمن حسابا إضافيا قد يكون مكلفا للغاية لتشغيله على العميل. ومن الأمثلة على ذلك استعلامات الحدود المكانية أو استعلامات بيانات التعريف.

الاستعلام عن المكونات

للعثور على مكون من نوع معين، استخدم FindComponentOfType:

CutPlaneComponent cutplane = (CutPlaneComponent)entity.FindComponentOfType(ObjectType.CutPlaneComponent);

// or alternatively:
CutPlaneComponent cutplane = entity.FindComponentOfType<CutPlaneComponent>();
ApiHandle<CutPlaneComponent> cutplane = entity->FindComponentOfType(ObjectType::CutPlaneComponent)->as<CutPlaneComponent>();

// or alternatively:
ApiHandle<CutPlaneComponent> cutplane = entity->FindComponentOfType<CutPlaneComponent>();

الاستعلام عن التحويلات

استعلامات التحويل هي استدعاءات متزامنة على الكائن. من المهم ملاحظة أن التحويلات المخزنة على جانب واجهة برمجة التطبيقات هي تحويلات مساحة محلية، بالنسبة إلى أصل الكائن. الاستثناءات هي كائنات الجذر، التي تكون المساحة المحلية ومساحة العالم متطابقة لها.

// local space transform of the entity
Double3 translation = entity.Position;
Quaternion rotation = entity.Rotation;
Float3 scale = entity.Scale;
// local space transform of the entity
Double3 translation = entity->GetPosition();
Quaternion rotation = entity->GetRotation();
Float3 scale = entity->GetScale();

في حالة الحاجة إلى استرداد جميع مكونات تحويل الشجرة (الموضع والتناوب والمقياس) أو تعيينها في وقت واحد، يوصى باستخدام خاصية الكيان LocalTransform :

// local space transform of the entity
Transform localTransform = entity.LocalTransform;
Double3 translation = localTransform.Position;
Quaternion rotation = localTransform.Rotation;
Float3 scale = localTransform.Scale;
// local space transform of the entity
Transform localTransform = entity->GetLocalTransform();
Double3& translation = localTransform.Position;
Quaternion& rotation = localTransform.Rotation;
Float3& scale = localTransform.Scale;

هناك أيضا دالة مساعدة لاسترداد التحويل العالمي (الفضاء العالمي) للكيان:

// global space transform of the entity
Transform globalTransform = entity.GlobalTransform;
Double3 translation = globalTransform.Position;
// global space transform of the entity
Transform globalTransform = entity->GetGlobalTransform();
Double3& translation = globalTransform.Position;

عند GlobalTransform استدعاء، يتم حساب التحويل العمومي أثناء التنقل عن طريق اجتياز التسلسل الهرمي للكيان. يتضمن هذا الاجتياز حسابا كبيرا، ولكن بالمقارنة مع القيام بنفس العمليات على جانب العميل من خلال الفئة Entity، تكون الوظيفة المضمنة أسرع. ومع ذلك، قد يفرض استدعاء GlobalTransform مجموعة أكبر من الكيانات ازدحاما في الأداء.

LocalToGlobalMatrix هو متغير من GlobalTransform ذلك يحسب التحويل العالمي كمصفوفة، وهو أمر مناسب في سياق الوحدة:

UnityEngine.Matrix4x4 globalMatrix = entity.LocalToGlobalMatrix.toUnity();
UnityEngine.Vector3 localPos = new UnityEngine.Vector3(0, 0, 0);
UnityEngine.Vector3 globalPos = globalMatrix.MultiplyPoint(localPos);

الاستعلام عن الحدود المكانية

استعلامات الحدود هي استدعاءات غير متزامنة تعمل على تسلسل هرمي كامل للكائنات، باستخدام كيان واحد كجذر. راجع الفصل المخصص حول حدود الكائن.

الاستعلام عن بيانات التعريف

بيانات التعريف هي بيانات إضافية مخزنة على كائنات يتم تجاهلها من قبل الخادم. بيانات تعريف الكائن هي في الأساس مجموعة من أزواج (الاسم، القيمة)، حيث يمكن أن تكون القيمة من نوع رقمي أو منطقي أو سلسلة. يمكن تصدير بيانات التعريف مع النموذج.

استعلامات بيانات التعريف هي استدعاءات غير متزامنة على كيان معين. يقوم الاستعلام بإرجاع بيانات التعريف الخاصة بوحدة واحدة فقط، وليس المعلومات المدمجة لرسم بياني فرعي.

Task<ObjectMetadata> metaDataQuery = entity.QueryMetadataAsync();
ObjectMetadata metaData = await metaDataQuery;
ObjectMetadataEntry entry = metaData.GetMetadataByName("MyInt64Value");
System.Int64 intValue = entry.AsInt64;
// ...
entity->QueryMetadataAsync([](Status status, ApiHandle<ObjectMetadata> metaData) 
{
    if (status == Status::OK)
    {
        ApiHandle<ObjectMetadataEntry> entry = *metaData->GetMetadataByName("MyInt64Value");
        int64_t intValue = *entry->GetAsInt64();

        // ...
    }
});

ينجح الاستعلام حتى إذا كان الكائن لا يحتوي على أي بيانات تعريف.

مستندات API

الخطوات التالية