التفاعل مع كائنات ومكونات لعبة Unity
تم تحسين عرض Azure عن بعد (ARR) لعدد كبير من الكائنات (راجع القيود). على الرغم من أنه من الممكن إدارة التسلسلات الهرمية الكبيرة والمعقدة على المضيف ، إلا أن تكرارها جميعا في Unity على الأجهزة منخفضة الطاقة أمر غير ممكن.
لذلك، عند تحميل نموذج على المضيف، يعكس Azure Remote Rendering المعلومات حول بنية النموذج على الجهاز العميل (الذي سيتكبد حركة مرور الشبكة)، ولكنه لا يكرر الكائنات والمكونات الموجودة في Unity. بدلا من ذلك ، يتوقع منك طلب كائنات ومكونات لعبة Unity المطلوبة يدويا ، بحيث يمكنك قصر النفقات العامة على ما هو مطلوب بالفعل. بهذه الطريقة لديك المزيد من التحكم في الأداء من جانب العميل.
وبالتالي، يأتي تكامل Unity الخاص ب Azure Remote Rendering مزودا بوظائف إضافية لتكرار بنية العرض عن بعد عند الطلب.
تحميل نموذج في الوحدة
عند تحميل نموذج، تحصل على مرجع إلى الكائن الجذر للنموذج الذي تم تحميله. هذا المرجع ليس كائن لعبة Unity ، ولكن يمكنك تحويله إلى كائن باستخدام طريقة Entity.GetOrCreateGameObject()الامتداد . تتوقع هذه الوظيفة وسيطة من النوع UnityCreationMode. إذا قمت بالمرور CreateUnityComponents، أيضا ملء كائن لعبة Unity الذي تم إنشاؤه حديثا بمكونات وكيل لكافة مكونات العرض عن بعد الموجودة على المضيف. فمن المستحسن ، على الرغم من ذلك ، أن تفضل DoNotCreateUnityComponents، للحفاظ على الحد الأدنى من النفقات العامة.
نموذج التحميل مع الروتين المشترك للوحدة
IEnumerator LoadModelWithCoroutine(RenderingSession session)
{
float currentProgress = 0.0f;
var task = session.Connection.LoadModelFromSasAsync(new LoadModelFromSasOptions("builtin://Engine"),
(float progress) =>
{
currentProgress = progress;
});
while (!task.IsCompleted && !task.IsFaulted)
{
int percentage = (int)(currentProgress * 100.0f);
yield return null;
}
if (!task.IsFaulted)
{
var gameObject = task.Result.Root?.GetOrCreateGameObject(UnityCreationMode.DoNotCreateUnityComponents);
}
}
نموذج التحميل مع نمط الانتظار
async void LoadModelWithAwait(RenderingSession session)
{
var result = await session.Connection.LoadModelFromSasAsync(new LoadModelFromSasOptions("builtin://Engine"), null);
var gameObject = result.Root?.GetOrCreateGameObject(UnityCreationMode.DoNotCreateUnityComponents);
}
استخدمت نماذج التعليمات البرمجية أعلاه مسار تحميل النموذج عبر SAS لأنه تم تحميل النموذج المدمج. معالجة النموذج عبر حاويات blob (باستخدام LoadModelAsync و LoadModelOptions) يعمل بشكل مماثل تماما.
RemoteEntitySyncObject
يؤدي إنشاء كائن لعبة Unity ضمنيا إلى إضافة RemoteEntitySyncObject مكون إلى كائن اللعبة. يستخدم هذا المكون لمزامنة تحويل الكيان إلى الخادم. بشكل افتراضي RemoteEntitySyncObject يتطلب من المستخدم الاتصال SyncToRemote() صراحة لمزامنة حالة الوحدة المحلية مع الخادم. سيؤدي التمكين إلى مزامنة الكائن SyncEveryFrame تلقائيا.
يمكن للكائنات التي تحتوي على RemoteEntitySyncObject قرص أن يتم إنشاء مثيل لأطفالها البعيدين وعرضها في محرر Unity من خلال الزر Show children .

مكونات المجمع
تتعرض المكونات المرفقة بكيانات العرض عن بعد إلى Unity من خلال الوكيلMonoBehavior. تمثل هذه البروكسيات المكون البعيد في Unity، وتعيد توجيه جميع التعديلات إلى المضيف.
لإنشاء مكونات العرض عن بعد الوكيل، استخدم أسلوب GetOrCreateArrComponentالملحق:
var cutplane = gameObject.GetOrCreateArrComponent<ARRCutPlaneComponent>(RemoteManagerUnity.CurrentSession);
العمر المقترن
يقترن عمر كيان بعيد وكائن لعبة Unity أثناء ارتباطهما عبر RemoteEntitySyncObject. إذا اتصلت UnityEngine.Object.Destroy(...) باستخدام كائن لعبة كهذا ، إزالة الكيان البعيد أيضا.
لتدمير كائن لعبة Unity ، دون التأثير على الكيان البعيد ، تحتاج أولا إلى استدعاء Unbind()RemoteEntitySyncObject.
وينطبق الشيء نفسه على جميع مكونات الوكيل. لتدمير التمثيل من جانب العميل فقط ، تحتاج إلى استدعاء Unbind() مكون الوكيل أولا:
var cutplane = gameObject.GetComponent<ARRCutPlaneComponent>();
if (cutplane != null)
{
cutplane.Unbind();
UnityEngine.Object.Destroy(cutplane);
}