كيفية الانتقال الفوري بين المشاهد في Unity
يعد الانتقال الآني بين المشاهد في Unity ميزة مفيدة لانتقال اللاعبين بين مستويات أو مناطق مختلفة. يغطي هذا البرنامج التعليمي كيفية تنفيذ الانتقال الآني للمشهد باستخدام تحميل المشهد الإضافي، وضمان ثبات بيانات اللاعب، وتفريغ المشهد القديم بعد الانتقال الآني. يضمن هذا النهج انتقالًا سلسًا دون فقدان بيانات اللاعب أو الأشياء.
إعداد المشاهد ونقاط النقل الآني
أولاً، سنقوم بإعداد المشاهد وتحديد نقاط النقل الآني داخلها.
إنشاء المشاهد
- في Unity، انتقل إلى
File > New Scene
لإنشاء مشهد جديد. احفظه في مجلدAssets
، وأطلق عليه اسمScene1
. - كرر العملية لإنشاء مشهد آخر باسم
Scene2
. - قم بإضافة كلا المشهدين إلى إعدادات البناء بالانتقال إلى
ملف > إعدادات البناء
والنقر فوقإضافة مشاهد مفتوحة
.
تحديد نقاط النقل الآني
يحتاج كل مشهد إلى نقطة محددة يظهر فيها اللاعب بعد النقل الآني.
- في
Scene1
، أنشئ كائن لعبة فارغًا وأطلق عليه اسمTeleportPoint1
. ضع علامة مناسبة عليه، على سبيل المثال، باسمSpawnPoint
. - في
Scene2
، قم بإنشاء GameObject فارغ آخر باسمTeleportPoint2
وقم بوضع علامة عليه بشكل مشابه. - ستكون عناصر اللعبة هذه بمثابة مواقع ظهور عند الانتقال بين المشاهد.
إنشاء نص النقل الآني
يتولى برنامج النقل الآني إدارة انتقال المشهد، مما يضمن انتقال اللاعب إلى الموقع الصحيح في المشهد الجديد، ثم يقوم بتفريغ المشهد السابق.
نص النقل الآني
using UnityEngine;
using UnityEngine.SceneManagement;
public class Teleportation : MonoBehaviour
{
public string sceneToLoad; // Name of the scene to load
public string spawnPointTag = "SpawnPoint"; // Tag for identifying the spawn point
private string currentSceneName; // To track the current scene
void Start()
{
currentSceneName = SceneManager.GetActiveScene().name;
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
DontDestroyOnLoad(other.gameObject); // Prevent player object from being destroyed
SceneManager.LoadScene(sceneToLoad, LoadSceneMode.Additive); // Load new scene additively
SceneManager.sceneLoaded += OnSceneLoaded; // Register callback for scene load completion
}
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == sceneToLoad)
{
// Find the spawn point in the newly loaded scene
GameObject spawnPoint = GameObject.FindWithTag(spawnPointTag);
if (spawnPoint != null)
{
GameObject player = GameObject.FindWithTag("Player");
if (player != null)
{
// Teleport the player to the spawn point
player.transform.position = spawnPoint.transform.position;
}
}
// Unload the previous scene
SceneManager.UnloadSceneAsync(currentSceneName);
// Update the current scene name and unregister the event handler
currentSceneName = sceneToLoad;
SceneManager.sceneLoaded -= OnSceneLoaded;
}
}
}
- قم بإنشاء برنامج نصي C# جديد باسم
Teleportation.cs
في المجلدScripts
. - قم بإرفاق هذا البرنامج النصي إلى كائن سيعمل كمحفز انتقال فوري، مثل باب أو بوابة.
- اضبط
sceneToLoad
على اسم المشهد الذي تريد الانتقال إليه، وتأكد من وضع علامة صحيحة على نقطة النقل الآني في المشهد الجديد.
التعامل مع بيانات اللاعب عبر المشاهد
إذا كانت لعبتك تتطلب الاحتفاظ ببيانات اللاعب (مثل المخزون والصحة وما إلى ذلك) عبر المشاهد، فقم بتنفيذ استراتيجية الحفاظ على البيانات.
بيانات اللاعب المستمرة
using UnityEngine;
public class PlayerData : MonoBehaviour
{
public static PlayerData instance;
public int health = 100;
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
- قم بإنشاء نص برمجي جديد بلغة C# باسم
PlayerData.cs
وقم بربطه بكائن المشغل أو كائن GameObject منفصل. - تأكد من عدم تدمير GameObject هذا أثناء انتقالات المشهد باستخدام
DontDestroyOnLoad(gameObject)
.
خاتمة
يوفر الانتقال الآني بين المشاهد في Unity، وخاصةً مع تحميل وتفريغ المشهد الإضافي، تجربة سلسة. تحتفظ هذه الطريقة بأشياء اللعبة المهمة مثل اللاعب وتدير الموارد بكفاءة من خلال تفريغ المشهد السابق. يعد هذا النهج مفيدًا بشكل خاص في الألعاب ذات البيئات الكبيرة أو المستمرة. قم بتخصيص هذا الإعداد بشكل أكبر ليناسب متطلبات اللعب المحددة، مثل الحفاظ على بيانات الحالة أو إضافة تأثيرات بصرية أثناء الانتقالات.