Unity Video Player: چگونه بفهمیم پخش ویدیو به پایان رسیده است یا خیر

مقدمه
Unity Engine دارای کامپوننت ویژه ای برای پخش یک فایل ویدئویی در زمان اجرا است. نام دارد پخش کننده ویدیو. با پیوست کردن فایل ویدیویی به GameObjects و پخش آنها در GameObject کار می کند بافت در زمان اجرا
نحوه استفاده از Video Player
برای دستیابی به آنچه در تصویر بالا نشان داده شده است؛
-
با کلیک راست روی آن یک GameObject در سلسله مراتب ایجاد کنید و شی مورد نظر خود را انتخاب کنید (من صفحه را انتخاب کردم)،
-
سپس در ستون بازرس (در سمت راست، اگر طرح ویرایشگر پیشفرض را تغییر ندادهاید) کلیک کنید اضافه کردن جزء و Video Player را جستجو کنید.
-
به یاد داشته باشید: طبق تعریف ما، GameObjectی که انتخاب میکنید باید دارای یک بافت باشد.
-
اکنون فایل ویدیوی خود را به ویژگی Video clip در مؤلفه Video player بکشید.
-
روی پخش کلیک کنید تا ویدیوی خود را تماشا کنید، آسان است!
-
توجه: مثال بالا از بافت پیش فرض gameobject استفاده می کند، روش های بیشتری برای تعیین بافت بسته به سناریوی شما وجود دارد، اما من امروز آنها را پوشش نمی دهم!
چرا می خواهید بدانید پخش ویدیو به پایان رسیده است
در یک یا چند سناریو، ممکن است بخواهید بخشی از برنامه شما از پایان پخش یک ویدیوی خاص آگاه شود. فقط به ذکر چند مورد؛
-
انتقال به صحنه یا رویداد دیگری: ممکن است بخواهید پس از اتمام ویدیو به یک صحنه جدید انتقال دهید، یک انیمیشن را فعال کنید یا محتوای جدیدی را بارگیری کنید. به عنوان مثال، پس از پخش یک ویدیوی مقدماتی، می توانید به منوی اصلی بروید.
-
نمایش رابط کاربری (UI): هنگامی که یک ویدیو به پایان می رسد، می توانید دکمه ها یا منوها مانند دکمه “بازپخش” یا گزینه هایی را برای پخش کننده برای رفتن به سطح بعدی یا راه اندازی مجدد بیاورید.
-
آموزش یا راهنما: پس از اتمام یک ویدیوی آموزشی، ممکن است بخواهید قفل یک ویژگی جدید را باز کنید، دستورالعمل بعدی را از کاربران بخواهید، یا مرحله بعدی را در یک دنباله یادگیری فعال کنید.
-
و بسیاری دیگر..
در لحظه نوشتن، هیچ نشانگر مستقیمی در Inspector وجود ندارد که بداند چه زمانی یک ویدیو به پایان رسیده است، باید یک اسکریپت سفارشی برای آن ایجاد کنید.
چگونه آن را انجام دهیم.
چند راه سریع برای انجام آن وجود دارد.
1.با استفاده از پخش کننده ویدئو رویداد فراخوانی شده است loopPointReached
. یک رویداد زمانی فراخوانی می شود که پخش کننده ویدیو به انتهای محتوا برای پخش برسد. (روش پیشنهادی)
-
قطعه کد
using UnityEngine; using UnityEngine.Video; public class VideoEndCheck : MonoBehaviour { public VideoPlayer videoPlayer; void Start() { videoPlayer.loopPointReached += OnVideoEnd; } void OnVideoEnd(VideoPlayer vp) { Debug.Log("Video has finished playing!"); // You can add any action you want to take here. } }
خرابی اسکریپت
-
ما یک متغیر عمومی از نوع ایجاد کردیم
VideoPlayer
به ما اجازه می دهد که a را اختصاص دهیمVideoPlayer
جزء از ویرایشگر Unity به اسکریپت. -
در روش Start، ما متد ما را ثبت کردیم
OnVideoEnd
به عنوان یک کنترل کننده رویداد برایloopPointReached
رویداد ازVideoPlayer
. اساساً یعنی
“Hey unity هنگامی که رویداد loopPointReached را برای این پخش کننده ویدیو فعال می کنید، لطفاً روش ما را OnVideoEnd() فراخوانی کنید”
-
سپس روش خود را تعریف می کنیم که در آن می توانید کاری را که می خواهید پس از پایان ویدیو انجام دهید.
آیا باید پارامترها را در متد وارد کنم؟
کاملاً بله، چرا؟
-
ساختار رویداد:
loopPointReached
رویداد می گذرد a
VideoPlayer
پارامتر، بنابراین کنترل کننده رویداد (OnVideoEnd
) باید با امضای مورد انتظار مطابقت داشته باشد، به این معنی که باید aVideoPlayer
پارامتر -
دسترسی به VideoPlayer: در داخل کنترل کننده رویداد، ممکن است لازم باشد با موارد خاص تعامل داشته باشید
VideoPlayer
نمونهای که پخش را تمام کرده است، مانند توقف، راهاندازی مجدد، یا پرس و جو در وضعیت آن. راvp
استدلال راهی برای انجام آن ارائه می دهد. -
مقیاس پذیری: اگر چندتایی را مدیریت می کنید
VideoPlayer
نمونههایی در یک صحنه، میتوانید با ارجاع دادن مشخص کنید که کدام یک رویداد را آغاز کرده استvp
. بدون این پارامتر، رویداد برای سناریوهای پیچیده تر انعطاف پذیری کمتری خواهد داشت.
-
ساختار رویداد:
2. با مقایسه بین videoPlayer.frameCount
و videoPlayer.frame
خواص
-
قطعه کد
using UnityEngine; using UnityEngine.Video; public class VideoFrameCheck : MonoBehaviour { public VideoPlayer videoPlayer; void Update() { // Check if the current frame is the last frame of the video if (videoPlayer.frame >= (long)(videoPlayer.frameCount - 1)) { Debug.Log("Video has finished playing!"); // Add any other action you want to take here. } } }
چگونه کار می کند:
-
videoPlayer.frameCount
تعداد کل فریم های ویدیو را نشان می دهد. -
videoPlayer.frame
فریم فعلی را ارائه می دهد که پخش کننده ویدیو در آن است. -
چه زمانی
videoPlayer.frame
می رسدvideoPlayer.frameCount - 1
، ویدیو به پایان رسید. -
1 را از آن کم می کنیم
videoPlayer.frameCount
زیرا فریم ها هستند با شاخص صفر.
3. استفاده از isPlaying
ویژگی برای بررسی اینکه آیا پخش ویدیو متوقف شده است.
-
این بدان معنی است که ما باید پخش کننده ویدیو را بررسی کنیم که آیا همچنان ویدیو را پخش می کند یا نه هر بار (هر فریم).
using UnityEngine; using UnityEngine.Video; public class VideoCheckIsPlaying : MonoBehaviour { public VideoPlayer videoPlayer; void Update() { if (!videoPlayer.isPlaying) { Debug.Log("Video has finished playing!"); // You can add any action you want to take here. } } }
- ما بلوک کد خود را برای بررسی وضعیت در متد Update() قرار می دهیم زیرا هر فریمی فراخوانی می شود.
نتیجه گیری
آن وقت کدام یک بهترین راه است!؟
-
توصیه شده ترین روش استفاده از رویداد (
loopPointReached
). این به این دلیل است که رویداد محور است، به این معنی که تنها زمانی فعال می شود که ویدیو به پایان می رسد، آن را کارآمد می کند و از بررسی های غیر ضروری هر فریم جلوگیری می کند. -
دومین گزینه بهترین است بررسی تعداد فریم ها، که با امکان مقایسه مستقیم فریم فعلی با تعداد کل فریم ویدیو، کنترل دقیقی را فراهم می کند. با این حال، این نیاز به محاسبات اضافی و بررسی فریم در هر یک دارد
Update()
چرخه، که از نظر عملکرد می تواند بسیار گران باشد -
در نهایت، با استفاده از
isPlaying
کمترین توصیه می شود زیرا فقط بررسی می کند که آیا ویدیو در حال پخش است یا خیر. تمایزی بین پایان یا مکث ویدیو قائل نیست، بنابراین ممکن است برای تشخیص دقیق کامل شدن ویدیو به شرایط اضافی نیاز داشته باشد.
💡
من از هرگونه بازخوردی در نظرات استقبال می کنم، بیایید در لینکدین پیوند دهیم. کد نویسی مبارک!