Interface là gì ?

Interface dịch theo wikipedia thì nghĩa là một ranh giới chung cho phép hai hay nhiều thành phần có thể trao đổi thông tin với nhau.

Nhưng trong Unreal, để dễ hiểu nhất, các bạn có thể hiểu Interface như là một cách để cung cấp hai hay nhiều chức năng chung, mà mỗi chức năng, có thể được tạo thành bằng nhiều cách hay logic khác nhau ở mỗi object dùng interface đó.

Ví dụ: ta có một Interface mang tên “chức năng động vật”, bao gồm các chức năng căn bản như kêu, ăn, đi,… Interface này đều có tồn tại trên tất các loài động vật, và mỗi loài, sẽ có một kiểu kêu, ăn hay đi khác nhau. Nhưng chúng đều có cùng dùng chung hai hay nhiều chức năng trong Interface “chức năng động vật đó”.

Lợi ích của dùng Interface:

  • Tạo sự đồng điệu trong chức năng nhưng đa dạng về cách thực hiện
  • Giúp logic xử lí đơn giản và nhanh hơn

Cách tạo Interface

Để tạo một interface, ta chuột phải vào Content Browser -> Blueprints -> Blueprint Interface

Ảnh 1. Tạo Blueprint Interface

Để minh chứng cho ví dụ đầu bài, ta sẽ tạo một Interface và đặt là BP_AnimalInterface

Và giao diện của Interface sẽ như sau

Ảnh 2. Giao diện Interface

Lưu ý: Interface chỉ cho phép ta tạo chức năng, chứ không cho phép ta tạo biến nhé!

Hãy bắt đầu tạo 2 hàm là Bark (sủa) và Eat (ăn).

Ảnh 3. Tạo chức năng cho Interface

Tuy nhiên khi ta thử chỉnh chức năng hàm, thì không được ?!

Ảnh 4. Chức năng bị mờ

Lí do đơn giản là vì Interface chỉ cung cấp cho ta định nghĩa của chức năng, còn cách thực hiện hay thao tác ra sao, ở các object dùng Interface phải thực hiện.

Tips: Các bạn có thể thêm tham biến và giá trị cho các hàm trên bằng cách:

Ảnh 5. Thêm tham biến và giá trị trả lại

Trong ví dụ này, mình sẽ cho tham biến của hàm Eat là lượng gram đồ ăn ta cung cấp, và giá trị trả lại là lượng gram đồ ăn con vật đó thực sự ăn.

Ảnh 6. Tham biến và giá trị trả lại của hàm Eat

Ok như vậy ta đã xong khâu setup của Interface. Qua phần tiếp theo ta sẽ chỉ định cho các con vật (Actor) dùng Interface mang tên “chức năng động vật” này!

Sử dụng Interface

Trước khi dùng Interface, hãy tạo ra 2 Actor động vật là BP_DogBP_Cat

Để hồi sau dễ phân biệt con nào với con nào, mình cho con chó là hình quả cầu và con mèo là hình cái hộp :v

Ảnh 7. Actor Chó và mèo

Sau đó, chúng ta cho cho và mèo cùng dùng Interface BP_AnimalInterface bằng cách sau:

Lưu ý: cách này áp dụng cho mọi Actor hay kể cả Object nhé!

Đầu tiên chọn Class Settings ở thanh Nav trên, Tab details của class sẽ xuất hiện như ảnh dưới

Ảnh 8. Thiết lập Interface cho Actor

Ở mục Interfaces, ấn nút Add để xổ xuống một danh sách các interface đang có, và chọn BP_AnimalInterface ta tạo trên. Kết quả như hình

Ảnh 9. Chọn BP_AnimalInterface

Tips: một actor hay object có thể có một hay nhiều Interface nhé!

Như vậy đã xong, làm tương tự với con vật còn lại và ấn compile phía trên!

Tiếp theo, ta hãy bắt đầu định nghĩa cách thực hiện các chức năng như Bark và Eat đã tạo trên. Trong Event Graph, chuột phải bất kì đâu, và gõ Event Bark để sự kiện Bark được tạo ra

Ảnh 10. Event Bark

Đối với hàm/chức năng Eat, bởi vì nó chứa tham biến và giá trị trả lại, nên ta có thể vào mục sau để tìm

Ảnh 11. Danh sách các chức năng của Interface

và sau đó đơn giản là double click vào tên Eat để chỉnh.

Tips: ngoài cách chuột phải Event Graph và kiếm Event Bark, các bạn cũng có thể chuột phải vào tên Bark như ảnh 10, và chọn Implement Function.

Cho đơn giản, ta sẽ cho BP_Dog in ra “gau gau” và BP_Cat in ra “meow meow” khi kêu.

Ảnh 12. Chỉnh hàm Bark cho mèo và chó

Với hàm Eat, ta sẽ cho mèo trả lại một nửa lượng thức ăn nó được nhận, và chó là ăn 90% thức ăn nó được cho.

Ảnh 13. Chỉnh hàm Eat cho mèo và chó

Như vậy là ta đã xong khâu tạo ra chó và mèo. Giờ ta hãy đặt chúng vào level để ta có thể bắt đầu nuôi (lol).

Bây giờ ta sẽ thử coi đặc tính của Interface như thế nào. Vào class BP_MyCharacter ta tạo ở bài trước hay một class nhân vật bất kì nào của bạn, ở mục BeginPlay, ta thêm vào như sau

Ảnh 14. Thử nghiệm Interface

Mình sẽ tóm gọn mục đích như sau:

  1. Khi vừa vào, ta cho dừng 3s (Delay)
  2. Sau đó ta sẽ lướt qua tất cả con vật, và bảo chúng kêu (gọi hàm Bark với lá thư)
  3. Sau khi kêu, ta sẽ dừng 1.5s tiếp
  4. Và cuối cùng là cho mỗi con 200gr thức ăn (gọi hàm Eat với giá trị Feed Gram là 200) và in ra lượng thức ăn chúng đã thực sự ăn

Kết quả sẽ như sau:

Ảnh 15. Kết quả

Như vậy ta có thể thấy, mọi thứ diễn ra đúng như những gì ta đã thực hiện trước đó, mèo sẽ kêu meow meow và chỉ ăn đúng 50% của 200gr (tức 100gr), chó sẽ kêu gau gau và ăn 90% của 200gr (tức 180gr).

Như vậy là ta đã hoàn thành một ví dụ đơn giản của sử dụng Interface trong Unreal!

Kết luận

Interface thực ra là một thứ khá hữu ích không chỉ trong Unreal nói riêng mà ở lập trình nói chung.

Một ví dụ cao hơn là, khi Unreal muốn ứng dụng chạy được đa nền tảng mà không phải lo mỗi nền tảng phải tạo lại cấu trúc, Unreal sẽ sử dụng Interface gọi là Subsystem. Subsystem Interface sẽ bao gồm rất nhiều hàm khác nhau mà Unreal sẽ dùng cho ứng dụng, và việc duy nhất để cho ứng dụng của Unreal chạy được (một phần) ở các nền tảng khác đó là thiết lập hàm và chức năng mà Unreal đã định sẵn.

Thôi lòng vòng cao xa quá =)) Nói chung căn bản của Interface là như trên nha! Hẹn gặp lại các bạn post sau.