آشنایی با سرویس photon
فهرست مطالب
در این مقاله با شما هستیم تا توضیحات کاملی را در رابطه با سرویس فوتون ارائه دهیم.
ما قبلا در مقاله ی سرویس های آنلاین سازی بازی به صورت مقدماتی در رابطه با فوتون توضیحاتی را ارائه داده و در این مقاله قصد تکمیل آن توضیحات را داریم.
به طور کلی این سرویس برای آنلاین سازی و چند نفره کردن بازی ها در یونیتی مورد استفاده قرار می گیرد که در این مقاله شرح کامل آن را خواهیم داد.
با ما همراه باشید.
فوتون چیست
به طور کلی فوتون یک فریمورک networking (شبکه) برای Unity است.
از نظر ساختار بسیار شبیه به UNet (اکنون منسوخ شده) است.
فوتون یک پکیج عالی است که انواع کدهایی را که برای برنامه نویسی مولتی پلیر نیاز داریم در اختیار شما قرار می دهد.
نحوه ی کارکر آن به اینصورت است که پلیر ها به یک سرور متصل می شوند و پیام ارسال یا دریافت می کنند.
اینها میتوانند بهروزرسانی موقعیتهای بازیکنان دیگر ، زمانی که بازیکنی شلیک میکند، زمانی که شما ضربه میخورید و … را نیز دریافت کنند.
در نهایت اگر چیزهایی وجود دارد که میخواهید بازیکنان دیگر روی سرور بدانند که مستقیماً روی رایانه آنها انجام نمیشود ، از طریق شبکه ارسال میشود.
به عنوان مثال ، اگر بازیکن ۱ اسلحه خود را شلیک کند ، آن پیام به سرور ارسال می شود و سپس توسط بازیکن ۲ در رایانه خود دریافت می شود.
سپس توسعه دهندگان به بازیکن ۱ نشان می دهند که با تفنگ خود شلیک می کند و یک گلوله می ریزد.
بهطور پیشفرض در فوتون ، پیامها میتوانند تا 20 بار در ثانیه ارسال شوند.
سرور اصلی در فوتون
سرور اصلی یک سرور در فوتون برای هر بازی یا حتی نسخه های منحصر به فرد یک بازی است.
این جایی است که تمام بازیکنان و room های آن بازی قرار دارند.
پلیر ها می توانند تمام room های موجود را مشاهده کنند ، به آنها بپیوندند یا اتاق جدیدی ایجاد کنند.
فقط میتوانید اتاقها را از سرور اصلی که در آن هستید ببینید.
نمیتوانید به اتاق بازی دیگری بپیوندید.
به طور پیش فرض ، فوتون می تواند اجازه دهد تا حداکثر 20 بازیکن به طور همزمان به سرور متصل شوند.
صد در صد این مقدار را می توان در سایت آنها و از طریق سرویس هایی که ارائه می دهند ارتقا داد.
آنها همچنین دارای سرورهایی در سراسر جهان هستند.
اتاق ها و پلیر ها در فوتون
اتاقی مانند یک لابی را در نظر بگیرید.
این جایی است که گروهی از بازیکنان می توانند برای یکدیگر پیام ارسال کنند.
همگام سازی مقادیر ، موقعیت ها ، چرخش ها ، انیمیشن ها و …
پلیر ها افرادی هستند که اتاق ها را پر می کنند.
هر اتاق یک میزبان (host) دارد.
این به طور پیش فرض یک پلیر است که اتاق را ایجاد می کند و برای بررسی و اجرای موارد سمت سرور مفید است.
راه اندازی و استفاده از فوتون
قبل از اینکه بتوانیم از Photon استفاده کنیم ، باید یک App ID دریافت کنیم.
برای این کار به سایت www.photonengine.com رفته و روی دکمه Sign In کلیک کنید.
یا وارد شوید یا یک حساب کاربری جدید ایجاد کنید.
پس از ورود به سیستم ، به صفحه برنامه ها هدایت می شوید.
در اینجا، میخواهیم روی دکمه CREATE A NEW APP کلیک کنیم.
در اینجا، ما می توانیم اطلاعات برنامه جدید خود را پر کنیم.
- Photon Type را روی Photon PUN قرار دهید.
- یک نام برای برنامه خود وارد کنید.
- سپس بر روی دکمه CREATE کلیک کنید.
این شما را به صفحه برنامه ها باز می گرداند.
در اینجا، می خواهید برنامه خود را پیدا کنید و شناسه برنامه را کپی کنید.
به این ترتیب فوتون میداند بازی یا اپلیکیشن شما چیست و تجزیه و تحلیلها را پیگیری میکند.
import کردن فوتون در یونیتی
در Unity ، یک پروژه جدید ایجاد کنید و پنجره Asset Store را باز کنید (Window > Asset Store). “photon 2” را جستجو کنید و PUN 2 ، یک asset رایگان را دانلود کنید.
هنگامی که پنجره import package باز می شود ، برخی از قسمت های asset را غیرفعال می کنیم زیرا به آنها نیاز نداریم.
- Photon > PhotonChat
- Photon > PhotonRealtime > Demos
- Photon > PhotonUnityNetwork > Demos
روی Import کلیک کنید ، سپس پس از انجام این کار ، پنجره PUN Wizard باید باز شود.
در اینجا ، ما فقط میخواهیم شناسه برنامه خود را درج کنیم و روی Setup Project کلیک کنیم.
اکنون فوتون نصب شده و آماده به کار است.
PhotonView
بد نیست حالاکه وارد فوتون و یونیتی شدیم کمی کدنویسی کنیم و با جزئیات فنی و کدینگ این سرویس نیز آشنایی اجمالی ای را داشته باشیم.
پکیج Photon به ما امکان دسترسی به یک کامپوننت MonoBehaviour به نام PhotonView را میدهد.
وقتی یک PhotonView را به یک آبجکت بازی متصل می کنید ، می گویید که آبجکت بازی در همه کلاینت ها یکسان است.
این بدان معناست که اگر یک آبجکت photonViewID = 1 داشته باشد، هر کاری که در نمونه بازی ما با آن آبجکت انجام دهیم می تواند با همان آبجکت در نمونه بازی شما همگام شود.
به عنوان مثال اگر آبجکت ما منفجر شود ، می تواند به تمام نسخه های دیگر خود در سایر کلاینت ها بگوید که منفجر می شود.
PhotonViews با استفاده از توابعی به نام RPC ارتباط برقرار می کند.
اگر تابعی به عنوان یک RPC تعیین شود ، می توان آن را توسط نسخه های دیگر خود در سایر کلاینت ها فراخوانی کرد.
در اینجا یک RPC به نظر می رسد :
public class LaserShot: MonoBehaviourPun
{
public GameObject laserBeam;
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
ShootLaser();
}
}
public void ShootLaser()
{
laserBeam.SetActive(true);
this.photonView.RPC("ShootLaser_RPC", RpcTarget.Others);
}
[PunRPC]
private void ShootLaser_RPC()
{
laserBeam.SetActive(true);
}
}
MonoBehaviourPun همان MonoBehaviour است ، فقط به شما امکان می دهد بدون نیاز به استفاده از تماس GetComponent به یک کامپوننت PhotonView در همان آبجکت بازی به طور خودکار دسترسی داشته باشید.
در این مثال ، هر کلاینت یک آبجکت بازی Character با این کامپوننت LaserShot و یک کامپوننت PhotonView دارد.
Character در نمونه بازی ما از تابع ShootLaser خود را صدا می کند ، که laserBeam خود را در بازی ما فعال می کند.
سپس ، this.photonView.RPC یک پیام به تمام نسخه های دیگر این آبجکت بازی Character (به موجب پارامتر RpcTarget.Others) می فرستد تا به آنها بگوید تابع ShootLaser_RPC خود را فراخوانی کنند.
بنابراین آنچه در اینجا اتفاق میافتد این است که نسخه ما از آبجکت بازی پرتولیزر خود را فعال میکند ، سپس همه نسخههای دیگر همان آبجکت بازی ، تماسی دریافت میکنند تا پرتولیزرهای خود را نیز فعال کنند.
ShootLaser_RPC، می توانست هر چیزی نامیده شود ، تنها چیزی که مهم است این است که تابع قبل از آن [PunRPC] باشد.
در مثال بالا مشکل بزرگی وجود دارد.
به یاد داشته باشید که هر کلاینت نسخه مخصوص به خود را از همان بازی اجرا می کند.
این بدان معناست که اگر من و شما در یک مسابقه مرگ قرار داشته باشیم ، هر کدام یک بازی خواهیم داشت که دارای دو کارکتر است.
از آنجایی که نسخه من از بازی دارای دو کاراکتر است که هر کدام دارای یک کامپوننت LaserShot هستند ، با زدن کلید A عملکرد ShootLaser روی هر کاراکتر فراخوانی می شود.
هیچ کدی وجود ندارد که تعیین کند کدام کارکتر را می توانم کنترل کنم.
نگران نباشید ، زیرا photonView مفهومی از مالکیت دارد و شما می توانید از آن مالکیت برای تعیین اینکه آیا دستورات کلیدی شما باید روی یک آبجکت بازی خاص کار کنند یا نه استفاده کنید.
هر کلاینت در یک بازی شبکه فوتون ، Player نامیده می شود و مالک photonView را می توان روی یک Player معین تنظیم کرد.
در طول بازی ، میتوانید با isMine پرس و جو کنید که آیا photonView متعلق به local client است :
private void Update() {
if (this.photonView.isMine && Input.GetKeyDown(KeyCode.A))
{
ShootLaser();
}
}
یا یک الگوی حتی بهتر :
private void Update() {
if (!this.photonView.isMine)
{
return;
}
if (Input.GetKeyDown(KeyCode.A)
{
ShootLaser();
}
}
در حال حاضر ، حتی اگر هر دو پلیر در حال اجرای توابع Update خود هستند ، تنها پلیر با photonView متعلق به شما در واقع به ورودی پاسخ می دهد.
PhotonTransformView
اگر کامپوننت PhotonTransformView را نیز اضافه کنید ، position ، روتیشن و scale آبجکت بازی را می توان به طور خودکار در بین کلاینت ها همگام نگه داشت.
این بدان معنی است که شما می توانید بر روی letting هر بازیکن برای کنترل حرکت کارکتر خود تمرکز کنید و این propertie ها در نسخه های دیگر بازی به روز می شوند.
کامپوننت PhotonAnimatorView به طور مشابه animator parameters را همگام نگه می دارد.
تا زمانی که هر پلیر animator parameters خود را کنترل کند، در تمام نسخه های بازی به طور خودکار به روز می شود.
تفاوت های بین Unity Networking و Photon Unity Networking
نمودار بالا نحوه انتقال پیام ها بین گره ها در شبکه در Unity و PUN را نشان می دهد.
Unity Networking از معماری سرور/کلینت پشتیبانی می کند.
همه پیام ها باید از طریق سرویس Host client عبور کنند و نمی توانند مستقیماً بین گره ها ارسال شوند.
به عنوان مثال ، بر اساس نمودار بالا ، پیام ها از مشتری B به مشتری C با استفاده از مسیر زیر ارسال می شود :
Client B ▸ Relay Server ▸ Host A ▸ Relay Server ▸ Client C.
همانطور که می بینید ، در مجموع 4 پرش از مبدا تا مقصد انجام می شود.
علاوه بر این، اگر Host از شبکه جدا شود، بازی متوقف می شود.
PUN معماری سرور/کلاینت مشابهی دارد، اما از ارسال پیامها به صورت همتا نیز پشتیبانی میکند.
به عنوان مثال ، بر اساس نمودار بالا ، پیام ها با استفاده از مسیر زیر از Client B به Client C منتقل می شوند :
Client B ▸ Relay Server ▸ Client C.
این در مجموع 2 پرش در مقایسه با 4 برش در Unity برای همان انتقال پیام بین دو گره است.
علاوه بر این ، PUN به طور بالقوه می تواند Relay Server را به طور کامل دور بزند و کلاینت B می تواند مستقیماً با کلاینت C ارتباط برقرار کند، بنابراین پرش ها (hops ) به 1 کاهش می یابد.
به همین دلیل، PUN سریعتر از Unity است.
قیمت :
یکی دیگر از تفاوت های اصلی بین Unity و PUN مدل Pricing است.
یونیتی تعداد کاربر همزمان (CCU) رایگان را برای هر مجوز ارائه می دهد.
- Personal :
20 کاربر همزمان - Plus :
50 کاربر همزمان - Professional :
200 کاربر همزمان
اگر نیاز به افزایش تعداد CCU (کاربر همزمان) هایی دارید که بازی شما پشتیبانی می کند، باید برای پهنای باند اضافی که استفاده می کنید هزینه کنید.
از شما 0.49 دلار به ازای ترافیکی که از طریق زیرساخت Unity (Matchmaker و Relay Server) عبور می کند، دریافت خواهید کرد.
PUN همچنین حداکثر 20 CCU ، و ۸۰۰۰ کاربر فعال در ماه و 500 پیام در هر room را به صورت رایگان ارائه می دهد.
علاوه بر طرح رایگان ، گزینه پرداخت یکباره 95 دلاری بسیار خوبی برای 60 ماه ارائه می دهد که شامل 100 CCU، و ۴۰ هزار کاربر فعال ماهانه و 500 پیام در هر room است.
این گزینه برای توسعه دهندگان مستقل کوچکی که بودجه کمی دارند عالی است.
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
کمتر حرف بزن - بیشتر گوش بده ، کمتر واکنش نشون بده و بیشتر مشاهده کن (۴ راز موفقیت)
سلام ، چرا فوتون کار نمیکنه ، از هر صد بار شاید یه بار درست وصل شه ، رووم میسازه ولی بقیه نمیتونن کانکت شن
سلام وقتتون بخیر باشه
این به احتمال زیاد مربوط به برنامه نویسی و کانفیگ سمت سرور هست که ممکنه درست پیاده سازی نشده باشه.