Nếu bạn đã từng chơi game Half life 1/2, hẳn sẽ có những lúc khung hình game sẽ đứng và dòng chữ Loading sẽ xuất hiện như sau:

Ảnh 1. Khung đoạn loading của game Half life 2

Đó là lúc game đang load một level con khác để người chơi có thể tiếp tục di chuyển. Hành động như này được gọi là Level Streaming.

Tại sao phải cần Level Streaming thay vì dùng một level cực đại để chạy ?!

Level streaming là gì ?

Level streaming là hành động load một level từ bộ nhớ lên để hiển thị hay sử dụng.

Lợi ích của nó là:

  • Giảm thiểu dung lượng của level ở bộ nhớ
  • Tối ưu game bằng cách, không render những vùng không thấy hay không/chưa đi tới
  • Linh hoạt trong quản lí màn chơi

Nếu bạn gộp tất cả màn chơi vào một file level lớn, hẳn là sẽ tới một lúc nào đó bộ nhớ sẽ đầy, và thậm chí, việc đưa toàn level đó vào bộ nhớ sẽ không còn khả thi.

Cách sử dụng level streaming

Có 2 cách để dùng level streaming:

  • Load bằng tay
  • Load tự động

Load bằng tay có thể hiểu nôm na là bạn ra lệnh cho nó load, còn load tự động là khi bạn tới một vùng nhất định, nó sẽ tự load level tương ứng.

Mình sẽ đi qua 2 cách luôn nhé!

Trước tiên, hãy tạo ra level con để sử dụng. Mình sẽ tạo một level là Sub_Level1. Sau đó ta sẽ add vào level chính của ta. Ở ví dụ này mình sẽ dùng level chính là SampleLevel ở các bài trước

Để add, các bạn vào tab Levels ở góc phải editor, chọn Add Existing -> chọn Sub_Level1:

Ảnh 2. Thêm Sub_Level1 thành level con của SampleLevel

Lưu ý: Nếu bạn không có cái tab này, hãy vào Windows->Levels

Ảnh 3. Thêm tab Levels vào editor

Trước khi ta bắt đầu vào công cuộc stream level, ta hãy thêm một số thứ vào Sub_Level1 để dễ nhận biết. Mình sẽ thêm 1 cái bậc thang, đi kèm với một cái nền nhà. Lưu ý là nhớ ấn 2 lần vào level để chọn nó. Nếu chọn đúng thì tên level sẽ xuất hiện ở góc viewport:

Ảnh 4. Chọn Sub_Level1 để chỉnh sửa

Và bắt đầu thêm object vào

Ảnh 5. Thêm object vào Sub_Level1

Cách 1 : Load level thủ công bằng blueprint

Để minh họa cho cách này, mình sẽ dùng một trigger box để kích hoạt việc stream Sub_Level1. Hãy đặt một Trigger Box vào level chính như sau

Ảnh 6. Đặt trigger box vào level chính (Persistent)

Lưu ý: Bạn nhớ phải chọn lại Persistent Level nhé, nếu không Trigger Box sẽ nằm ở Sub_Level1.

Sau đó, ta click vào Trigger Box trong level và vào Level Blueprint của Level chính và xử lí streaming

Chuột phải bất kì đâu và tìm đến như sau:

Ảnh 7. Sự kiện Begin Overlap của Trigger Box

Sau đó ta sẽ gọi hàm Load Stream Level:

Ảnh 8. Xử lí streaming
  • Level Name : tên level ta muốn stream
  • Make Visible After Load : ta có muốn level hiện ra ngay khi được stream không ?
  • Should Block on Load : ta có muốn dừng game lại để stream không (tương tự như Half life)

Tips: thông thường, cách tốt nhất để gameplay mượt đó là ta sẽ đặt TriggerVolume ở xa ranh giới giữa 2 levels, sau đó, ta tắt Make Visible After Load và Should Block on Load đi để streaming diễn ra ngầm. Và khi player tới gần ranh giới, ta chỉ cần set cho level hiển lên thôi. Như vậy sẽ không có tình trạng level đột nhiên hiện ra, hay là đứng khung hình.

Trong ví dụ này mình sẽ cho load thẳng cứng nhé :v

Kết quả ta sẽ được như dưới

Ảnh 9. Thành quả streaming Sub_Level1

Để gỡ bỏ level ra khỏi bộ nhớ, ta chỉ cần gọi hàm Unload Stream Level

Các thông số cũng như khi gọi Load Stream Level nhé!

Bài viết này hơi dài nên mình sẽ kết thúc ở đây và sẽ làm một bài khác cho cách stream tự động nhé =))

Kết luận

Mình không biết viết gì ở đây nên thôi nhé ahihi. Hẹn gặp lại các bạn ở kết luận của phần 2!