Lập trình game với Unity #3
Lập trình game casual thể loại subway surfers.
Thành viên nhóm: 1.Nguyễn Mai Phương 21000200 2.Lò Thị Trang 21001592 (Leader) 3.Bùi Minh Vũ 21001600 4.Lê Minh Vũ 21001601
Mô tả cô đọng trong 5-10 dòng
Các khu vực nhân vật chạy và khám phá:
Các usecase chính, nhân vật có thể chơi như nào. Cần có hình ảnh đi kèm..
Các usecase của game Subway Surfers bao gồm: Chế độ chơi đơn: người chơi sẽ đóng vai một nghệ sĩ graffiti trẻ tuổi, chạy trốn qua các đường ray tàu điện ngầm, tránh các chướng ngại vật và cố gắng nhặt vàng và các vật phẩm giúp ích để đạt điểm cao. Bảng xếp hạng người chơi điểm cao. Cửa hàng để mua vật phẩm (key, coin, …) và mua các nhân vật khác. Chế độ nhiều người chơi (online). Kẻ thù : 1 ông cảnh sát truy đuổi. Nhiệm vụ : nhặt các item; thử thách : nhặt các chữ cái. Kết nối với Facebook để mời bạn bè chơi cùng, đua top điểm cùng bạn bè,… Đổi ngôn ngữ. Bật/tắt nhạc nền, âm thanh; điều chỉnh độ nhạy, mức độ các hiệu ứng; thoát game.
Mục tiêu của game là kiếm nhiều vàng để mở khóa tất cả nhân vật, mua các vật phẩm hỗ trợ để đạt được điểm càng cao càng tốt. Trong game, người chơi có thể tự tạo cho mình mục tiêu chiến thắng như mở khóa hết nhân vật, đạt điểm cao nhất thế giới, hoặc các mục tiêu khác. Các nhiệm vụ, thử thách, các dấu mốc nhỏ trong trò chơi là các mục tiêu tiến trình. Người chơi có thể ăn vàng hoặc hoàn thành nhiệm vụ, thử thách để có các vật phẩm giúp ích cho quá trình chơi. Những thứ khó hoàn thành trong trò chơi là các mục tiêu thử thách.
Game có hai scene chính: LoadData và Gameplay. Khi vào game, sẽ hiển thị một màn hình chờ để khởi tạo tài nguyên game. Màn hình chờ được thiết kế bằng đồ hoạ 2D nằm trong canvas. Các tài nguyên, script được load trong scene ListResource, Poolterrain, Poolother. Poolterrain gồm các đối tượng khung cảnh, môi trường trong game như cây cối, toà nhà, đường phố,… mà nhân vật chạy. Poolother gồm các coin mà nhân vật nhặt được. ListResource gồm nhân vật, audio,kẻ thù. Các lớp trên thực chất là khởi tạo các đối tượng cần sử dụng nên rất tốn thời gian và tài nguyên. Chúng đều có Dontdestroyonload(mội phương thức của class Objects trong unity giúp các đối tượng không bị loại bỏ khi tải scene) để tiếp tục sử dụng trong scene gameplay.
Scene LoadData: Khi vào game sẽ hiển thị một màn hình chờ để khởi tạo tài nguyên game. Màn hình chờ được thiết kế bằng đồ hoạ 2D nằm trong canvas. Các tài nguyên, script được load trong scene ListResource, Poolterrain, Poolother.
Ui trong unity được thiết kế bằng canvas. Mọi unity thì đều nằm trong lớp canvas và unity hỗ trợ rất tốt Ui bằng nhiều chức năng, lựa chọn thiết kế cho người dùng. Trong game có một vài Ui quan trọng như màn hình loadgame(đã nói ở trên), màn hình menu trong scene maingame(FormGameMenu), FormGameplay, FormGameMenu, ContainAchievement, ContainShopItem, ...
Ui FormGameMenu: Menu hiện thị tất cả các feature của game. Người chơi có thể lựa chọn nhân vật, mua item trong shop, kiểm tra nhiệm vụ, chỉnh sửa một số cài đặt game,...
Ui FormGamePlay: Một Ui hiển thị trong màn hình chơi game. Ui này hiển thị vật phẩm có thể dùng, số vàng kiểm được, số điểm hiện tại, phím dừng game, ...
Ui ContainAchievement: Hiển thị bảng điểm sau khi thua bao gổm điểm số chơi được, vàng kiếm được,... và một hoạt ảnh nhân vật thua game. Tuy nhiên do đã bỏ phần facebook và chplay cùng một số tính năng thưởng khác liên quan đến quảng cáo nên phần này chỉ đơn giản là xử lí điểm số và nhân vật.
Nhân vật có thể trườn, nhảy, tránh né bằng cách di chuyển sang bên trái và phải. Nhân vật chỉ được di chuyển trong 3 lane như hình. Lúc xuất phát, nhân vật luôn xuất phát ở lane giữa Một số chướng ngại vật mà người chơi sẽ gặp phải: Từ đầu game, người chơi sẽ bị một security rượt đuổi. Nếu người chơi đâm vào đầu tàu, barie hay bị bảo vệ bắt được sẽ ngay lập tức dừng màn chơi lại. Một hộp lựa chọn sẽ hiện ra Người chơi có quyền sử dụng chìa khóa để hồi sinh, hoặc share video quá trình mình chơi lên các nền tảng mạng xã hội. Hết thời gian chờ, bảng Top Run hiện lên show số điểm, số coin thu được và số hạng trong bảng xếp hạng Người chơi có thể gặp các vật phẩm đặc biệt nằm trên đường chạy, như chùm bong bóng, ván trượt, thanh nam châm,… Có 6 vật phẩm nhặt giữa đường chạy mà chúng ta có thể nâng cấp:
Nếu nhân vật chết hay trạng thái showScorePlay thì tạo một clone nhân vật. Clone này không có rigid body với model là arrested để hiện thị trạng thái thua game. Nếu được mở ở màn hình menu thì chuyển animation nhân vật sang idleMenu và hiển thị điểm số cao nhất của người chơi. Nếu ấn play thì tạo trận chơi mới.
Kẻ thù trong game được thiết kế trong file EnemyCOntrollers.cs.
Mua vật phẩm và nâng cấp item trong ShopItem: class PageShopItems.cs
Mua vật phẩm:
Mua Coin:
Mua Keys:
Mua vật phẩm sử dụng 1 lần:
Class BuyItemController.cs: để lấy ra số lượng item đang có rồi gán số lượng ra Text Total để hiển thị cho người dùng số lượng item đang có bằng các ngôn ngữ khác nhau. Code item là: 0 coin, 1 key, 2 skis, 3 mysteryBox, 4 headStart, 5 scoreBooster
Class ButtonBuyItem.cs: Xử lý mua vật phẩm khi click mua. Code item là: 0 coin, 1 key, 2 skis, 3 mysteryBox, 4 headStart, 5 scoreBooster. Biến textCost: lấy giá tiền của vật phẩm được tạo ở giao diện để thực hiện mua item, biến textNote: để trả lại số lượng vật phẩm sau khi mua, biến textCoin: để trả lại số lượng coin còn lại sau khi mua. Nếu Code item là: 0 coin, 1 key thì xử lý trong app purchase
Nếu Code item là: 2 skis, 4 headStart, 5 scoreBooster:
Nếu số tiền hiện tại > giá tiền vật phẩm
Nếu số lượng item hiện tại < số lượng item tối đa(Trong Modules.cs: maxHoverboard = 9999; maxHeadstart = 10; maxScorebooster = 7;)
Số lượng item hiện có + 1
Trừ số coin hiện tại bằng textCost và trả lại giá trị coin hiện tại là textCoin
Trả lại số lượng item hiện có textNote
Nếu số lượng item hiện tại = số lượng item tối đa
textNote in ra thông báo lỗi maximumNumber
Nếu không đủ tiền
textNote in ra thông báo lỗi không đủ tiền
Nếu Code item là: 3 mysteryBox
Nếu số tiền hiện tại > giá tiền vật phẩm
Trừ số coin hiện tại bằng textCost và trả lại giá trị coin hiện tại là textCoin
Di chuyển đến PageOpenBox hoạt ảnh mở hộp
Nếu không đủ tiền
textNote in ra thông báo lỗi không đủ tiền
Nâng cấp item (Tăng thời gian sử dụng item): Class UpgradesController.cs: để tính giá tiền để nâng cấp item của mỗi level rồi in ra textCost. Code item là: 0 rocket, 1 power, 2 magnet, 3 2x, 4 cable, 5 skis.
Giá tiền được tính bằng: money = 250 * Mathf.Pow(2, (level item + 1))
Nếu giá tiền hiện tại > 256000 thì giá tiền = 256000
Class ButtonUpgradesItem.cs: Xử lý mua vật phẩm khi click mua. Code item là: 0 rocket, 1 power, 2 magnet, 3 2x, 4 cable, 5 skis
Biến progressBox: để hiển thị hình ảnh thanh level của item, biến textCost: lấy giá tiền của vật phẩm được tạo ở giao diện để thực hiện mua nâng cấp,
biến textNote: in ra thông báo nếu lỗi,
biến textCoin: để trả lại số lượng coin còn lại sau khi mua.
Nếu số tiền hiện tại > giá tiền nâng cấp
Nếu level item hiện tại < level item item tối đa(Trong Modules.cs: maxLevelItem = 10)
Tăng level item lên 1
Trừ số coin hiện tại bằng textCost và trả lại giá trị coin hiện tại là textCoin
Update lại giá tiền nâng cấp item trong UpgradesController.cs
Nếu level item hiện tại = level item item tối đa
textNote in ra thông báo lỗi shopMaxLevel
Nếu không đủ tiền
textNote in ra thông báo lỗi không đủ tiền
Mua Hero và Skis:
Class ListCharacterUse.cs: danh sách các nhân vật và ván trượt trước khi load game
Class ChangeImageClick.cs: Hiệu ứng chiễu đền và tạo ra các clone khi click vào nhân vật trong List nhân vật
Class HeroConstruct.cs: Tạo thanh cuộn danh sách các nhân vật và ván trượt tuần tự để người chơi chọn.
Phương thức ButtonCoinHeroClick() để mua nhân vật:
Nếu nhân vật được chọn chưa unlock:
Nếu số tiền hiện tại > giá tiền mua nhân vật
Trừ số coin hiện tại bằng giá tiền nhân vật và trả lại giá trị coin hiện tại là textCoin
Text giá tiền chuyển thành SELECTED
Thêm nhân vật vào danh sách nhan vật đã unlock
Nhân vật sử dụng hiện tại chuyển thành nhân vật đã chọn
Nếu không đủ tiền
In ra thông báo lỗi không đủ tiền
Nếu nhân vật được chọn đã unlock:
Text giá tiền chuyển thành SELECTED
Nhân vật sử dụng hiện tại chuyển thành nhân vật đã chọn
Phương thức ButtonCoinSkisClick() để mua ván trượt:
Nếu ván trượt được chọn chưa unlock:
Nếu số tiền hiện tại > giá tiền mua ván trượt
Trừ số coin hiện tại bằng giá tiền ván trượt và trả lại giá trị coin hiện tại là textCoin
Text giá tiền chuyển thành SELECTED
Thêm ván trượt vào danh sách ván trượt đã unlock
Ván trượt sử dụng hiện tại chuyển thành ván trượt đã chọn
Nếu không đủ tiền
In ra thông báo lỗi không đủ tiền
Nếu ván trượt được chọn đã unlock:
Text giá tiền chuyển thành SELECTED
Ván trượt sử dụng hiện tại chuyển thành ván trượt đã chọn
Xử lý nếu va chạm items
Nếu là đồng xu
Nếu là key
Nếu là skis
Nếu là giày
Nếu là headStart
Nếu là mysteryBox
Nếu là nam châm
Nếu chưa sử dụng nam châm thêm model sử dụng nam châm trên nhân vật
Thêm bảng hiển thị thời gian sử dụng item
Sử dụng nam châm thành true
SetAniAddMagnet(): Set các loại di chuyển khi ăn nam châm : Nếu đang chạy thường: chuyển kiểu chạy thành runMagnet; Nếu đang trượt ván: chuyển kiểu chạy thành runSkisMagnet; Nếu đang bay tên lửa: chuyển kiểu chạy thành runRocketMagnet; Nếu đang bay cable: chuyển kiểu chạy thành runCableMagnet;
Nếu là rocket
Nếu chưa sử dụng rocket
thêm model sử dụng rocket trên nhân vật
Nếu là jumper
Khoảng cách với Enemy = 2
Sử dụng jumper thành true
Kích hoạt hiệu ứng của item bay trên không;
SetAniAddJumper(): Remove Progress sử dụng jetpack Remove Progress sử dụng hoverbike Ẩn đối tượng Skis khi sử dụng item jumper Nếu đang sử dụng cable RemoveCableItem(false) Nếu đang sử dụng cable RemoveJumperItem(false);
Nếu là cable
Nếu chưa sử dụng cable: thêm model sử dụng cable trên Hero
Khoảng cách với Enemy = 2 Sử dụng Cable = true;
Kích hoạt hiệu ứng của item bay trên không;
SetAniAddCable()
Remove Progress của item jetpack
Ẩn đối tượng Skis khi sử dụng item cable
Nếu đang sử dụng rocket
Sử dụng Rocket = false;
Nếu đang sử dụng jumper
Sử dụng Jumper = false;
Nếu đang sử dụng nam châm: chuyển kiểu chạy thành runCableMagnet;
Những trường hợp còn lại: chuyển kiểu chạy thành runCable;
Nếu là balloon
Remove hiệu ứng item bay
Thiết lập lại trang thái:không thể di chuyển sang trái phải
Khoảng cách với Enemy = 2
SetAniAddBalloon(): Remove Progress của item jetpack Remove Progress của item hoverbike Ẩn đối tượng Skis khi sử dụng item Skis Nếu đang sử dụng cable Sử dụng Cable = false; Nếu đang sử dụng rocket Sử dụng Rocket = false; Nếu đang sử dụng jumper Sử dụng Jumper = false;
SetAniAfterFall(): sau khi tiếp đất
Nếu đang sử dụng skis Nếu đang sử dụng nam châm chuyển kiểu chạy thành runSkisMagnet;
Nếu không sử dụng nam châm
chuyển kiểu chạy thành runSkis;
Những trường hợp còn lại: Nếu đang sử dụng nam châm chuyển kiểu chạy thành runMagnet;
Nếu không sử dụng nam châm
chuyển kiểu chạy thành runNormal;
Reset lại toàn bộ item trên map
Nếu là scoreBooster
Bật/tắt nhạc nền, âm thanh; điều chỉnh độ nhạy, mức độ các hiệu ứng; thoát game:
Đổi ngôn ngữ :
Xử lý va chạm
Nếu đang sử dụng Jumper, Rocket, Cable: thì không bị va chạm
Va chạm với vật cản đằng trước
Xử lý nếu có ván trượt thì không chết Nếu đang sử dụng skis: Thực hiện xóa tất cả vật cản xung quanh khu vực này này
Nếu không sử dụng skis: Bị chết do va chạm với vật cản typeFalling
Va chạm trái phải
Va chạm không bật lại Nếu đang sử dụng skis: Thực hiện xóa tất cả vật cản xung quanh khu vực này này Nếu không sử dụng skis: Bị chết do backScene
Xử lý va chạm với vật cản đẩy lại:(Nếu đang ở bên trái rồi đi sang trái, Nếu đang ở bên phải rồi đi sang phải)
ColliderObjectSlowSpeed(): Khoảng cách enemy -1
Nếu khoảng cách enemy = 0 -> bị tóm
Nếu đang sử dụng skis
Khoảng cách enemy = 2;
Trạng thái hero chuyển thành run;
Nếu không sử dụng skis
Bị chết do cảnh sát tóm
Nếu khoảng cách enemy > 0
Nếu đang không sử dụng Jumper, Rocket, Cable
tốc độ nhân vật chậm lại
Xử lý va chạm vật cản (typeCollider == TypeCollider.slower)
Mô tả chi tiết các sửa đổi trong game, bao gồm hình ảnh, thuyết minh, thuật toán hoặc các Class hay method thêm/sửa/xóa
Trong game, box tìm đối thủ được quản lý bởi một đối tượng gọi là AutoFindOpponentsBox. Trong AutoFindOpponentsBox, có một script được gọi là DeactiveMessageBox.cs, đây chịu trách nhiệm điều khiển hiển thị và ẩn đi box thông báo trạng thái.
Để tắt box thông qua việc nhấn nút ButtonClose, ta cần thêm một hàm mới, chẳng hạn như ButtonCloseMessage(). Hàm này được liên kết với nút ButtonClose và khi được gọi, nó sẽ thực hiện hành động tắt box hiển thị trạng thái bằng cách tương tác với DeactiveMessageBox.cs. Điều này giúp người chơi đóng box một cách dễ dàng khi cần thiết.
Hàm này được kích hoạt khi người dùng nhấn vào nút đóng (ButtonClose) trên hộp thoại. Đầu tiên, nó chạy một âm thanh thông báo việc nhấn nút (Module.PlayAudioClipFree). Sau đó, nó sử dụng một Animator để chơi một trigger animation ("TriClose") trên đối tượng này. Điều này thường được sử dụng để kích hoạt một hoạt ảnh đóng hộp thoại.
Sau đó vào Assets\Scenes\GameMain.unity
Trong phần Hierarchy, Vào GameMain\ContainGameMain\Canvas\FormGameMenu\MessageBox\AutoFindOpponentBox\AllContents\ButtonClose
Tại Component Button, Thêm Script AutoFindOpponentBox vào hàm On Click () và chọn function ButtonCloseMessage()
Download 1 model vật phẩm mới
Click chọn file trong unity, trong phần Inspector chọn vào Materials, phần Textures chọn Extract Textures để trích xuất màu của model
Kéo file vật phẩm mới vào trong scene, Kéo object vật phẩm vào từ Hierachy vào phần project để chuyển thành file prefab
Dạng ăn item được trên đường: vào các file và thêm các thuộc tính TypeItems mới
ItemInfomation.cs: thêm 1 enum mới (tên là ball) mới ở TypeItems
Module.cs: Thêm 1 game GameObject mới (tên là itemBall)
PageMainGame.cs: Thêm 1 GameObject mới (tên là itemBall), ở hàm Awake() thêm : Modules.itemBall = itemBall ;
Thêm component BoxCollider
Thêm component ItemInfomation.cs
TypeItem :chọn Type item vừa thêm ở ItemInfomation.cs : Ball
MeshShow: kéo Object model của item vào
Thêm hình ảnh trên nhân vật thêm vào sau khi ăn item: ItemAddHero.cs
HeroController.cs: Có hàm xử ý va chạm item RunFunctionItem() thêm câu lệnh để set nhân vật sử dụng vật phẩm:
else if (codeItem == TypeItems.ball)
{
Modules.SetModelUseItem(transform, codeBody, Modules.itemBall, "");
Vào Asset Strore tải thư viện Record mà bạn mong muốn sau đó download và import thư viện này vào project của mình.
Tìm mainCamera và add component như sau:
public class TipRandom : MonoBehaviour
IEnumerator tipTracker(){ while(true){ randNum = Random.Range(1,4); if(randNum ==1){ tipDisplay.GetComponentInChildren<Text>().text = " Remember to upgrade your items !"; } if(randNum ==2){ tipDisplay.GetComponentInChildren<Text>().text = " Daily rewards resets every 24 hours !"; } if(randNum ==3){ tipDisplay.GetComponentInChildren<Text>().text = " There are secret areas filled with treasures !"; } if(randNum ==4){ tipDisplay.GetComponentInChildren<Text>().text = " If you trip twice , the officer will catch up to you !"; } tipDisplay.GetComponent<Animator>().Play("Tips"); yield return new WaitForSeconds(6); genhint = false; }
Import model vào folder Characters, mở model trong unity, trong phần Inspector chọn vào Materials -> Textures -> Extract Textures để trích xuất màu model
Chọn Rig -> Animation Type -> Legacy
Chọn Model -> thiết lập như ảnh
Kéo model vào trong tab Scene, rồi từ tab Hierarchy kéo model vào folder Prefab ở tab Project để chuyển thành file prefab
Copy các component Animation, Rigidbody, HeroController(Script), ShadowFixed(Script) của nhân vật có sẵn vào nhân vật mới
Copy các objects: PointRaycast, Collider, PointShow, Right Sneakers Control, Left Sneakers Control, Hover Bike control, Hover Board Control, Bip001 Neck, Bip001 R Hand
Trong class Alllanguages.cs: List heroInfoHero là text miêu tả thông tin nhân vật. Tạo List() mới với thông tin miêu tả 11 ngôn ngữ của nhân vật
Trong HeroController(Script):
IdHero: 008 (chọn Id không trùng với Id của những nhân vật có sẵn)
CostHero: 100000 (Giá tiền để unlock ván trượt)
NoteHero: 7 (tương ứng với List heroInfoHero vừa tạo)
AniHero: Kéo file nhân vật prefab vào
PointShowHero: Object PointShow
MyCollider: Object Collider
ShadowFixed(Script): Point Raycast: Mở file Prefab nhân vật kéo phần body gốc của file vào
Trong ListResources, trong component ListCharacterUse(Script): có ListHeroUse là danh sách các nhân vật đang được sử dụng, thêm nhân vật mới vào danh sách các nhân vật
Thiết lập tương tự với các file animation model tải được trên mixamo, sau đó lấy các animation clip của các model đó áp vào model gốc, ta được 1 nhân vật có thể chuyển động
Hình ảnh trong game:
\Assets\ResourcesGame\Prefabs\MessageUI\ListItemBuy là giao diện của cửa hàng
Vào ListItemBuy\Content\ParentSingle: Thêm Object mới tên là Key, lấy thuộc tính của 1 vật phẩm đã có sẵn khác
Trong Key thêm component BuyItemController.cs đặt CodeItem = 1 (Key)
AllElements\BGAvatar\Avatar, trong Image SourceImage lấy hình ảnh IconKey
AllElements\Name Trong Text đặt tên vật phẩm là Key
AllElements\Cost\Value Trong phần Text nhập giá vật phẩm mong muốn
AllElements\Note nhập miêu tả vật phẩm
AllElements\ButBuy trong ButtonBuyItem.cs sửa CodeItem thành 1
Thêm chức năng mua trong file script ButtonBuyItem.cs
Tìm ButtonClick() sau đó thêm đoạn code sau vào vòng lặp codeItem == 1
Hình ảnh trong game:
Download model .fbx hình ván trượt
Mở model trong unity, trong phần Inspector setting như hình để trích xuất màu model
Copy các component ItemAddHero(Script), SkisController(Script), MagnetController(Script), PlaySparksSkis(Script) của ván trượt có sẵn vào ván mới, setting như hình
Kéo model vào trong tab Scene, rồi từ tab Hierarchy kéo model vào folder Prefab ở tab Project để chuyển thành file prefab
Trong class AllLanguages.cs: List heroInfoHoverboard là text miêu tả thông tin nhân vật. Tạo List() mới với thông tin miêu tả 11 ngôn ngữ của ván trượt
Trong ListResources, trong componrnt ListCharacterUse(Script): có ListSkisUse là danh sách các ván trượt đang được sử dụng, thêm ván trượt mới vào danh sách các nhân vật
Chỉnh lại kích thước trong Transform cho phù hợp
Hình ảnh trong game
Nhân vật rơi khỏi thế giới khi đi lên đường hầm Vào Assets\ResourcesGame\Prefabs\Terrains tìm những terrains có đường đi lên hầm (B005, B007, C005, C008, D013, D016) có những object là RoadCM Thêm component BarrielInfomation.cs vào RoadCM với các settings:
SuportSkis : true
TypeBarriel : NevelFall
TypeFalling : Back
NeverDestroy : true
- Import Package Facebook SDK chính thức của Meta (https://developers.facebook.com/docs/unity?locale=vi_VN) vào Unity
- Tạo một app trên Meta for Developers và thiết lập các cài đặt cơ bản, lấy App ID và Client Token điền vào tab Edit settings của Facebook SDK
- Thêm Script FacebookController.cs vào Assets\Scripts\General với các hàm:
1. *Awake()*
- Hàm này được gọi khi script được khởi tạo.
- Khởi tạo và kích hoạt ứng dụng Facebook, cũng như đảm bảo rằng đối tượng này sẽ không bị hủy khi chuyển giữa các scene trong Unity.
2. *OnApplicationPause(bool pauseStatus)*
- Hàm được gọi khi ứng dụng tạm dừng hoặc quay lại chạy.
- Kích hoạt lại ứng dụng Facebook khi ứng dụng của chúng ta quay lại chạy.
3. *SetInit()*
- Gọi sau khi khởi tạo Facebook, đối phó với menu Facebook dựa trên việc người dùng đã đăng nhập hay chưa.
4. *FBlogin()*
- Bắt đầu quá trình đăng nhập Facebook với các quyền đọc cụ thể.
5. *AuthCallback(IResult result)*
- Hàm gọi lại sau mỗi lần đăng nhập.
- Nếu đăng nhập thành công, cập nhật thông tin người chơi và xử lý nhiệm vụ bổ sung như thưởng xu.
6. *DealWithFBMenus(bool isLoggedIn)*
- Xử lý menu Facebook dựa trên việc người chơi đã đăng nhập hay chưa.
7. *DisplayUsername(IResult result)*
- Hàm gọi lại sau khi lấy tên người chơi từ Facebook.
- Cập nhật Modules.fbName với tên đầu tiên của người chơi.
8. *DisplayProfilePic(IGraphResult result)*
- Hàm gọi lại sau khi lấy hình đại diện của người chơi từ Facebook.
- Tạo một Sprite từ texture hình đại diện và đặt nó vào Modules.fbMyAvatar.
9. *ShareWithFriends()*
- Gọi API Facebook để chia sẻ nội dung (feed) với bạn bè.
10. *InviteFriends()*
- Mời bạn bè tham gia trò chơi sử dụng API AppRequest của Facebook.
11. *TakeScreenshot()*
- Coroutine để chụp ảnh màn hình và đăng lên Facebook.
12. *OnPostScreenShot(IGraphResult result)*
- Hàm gọi lại sau khi đăng ảnh lên Facebook.
13. *PostScore(bool check)*
- Đăng điểm của người chơi lên Facebook nếu check là false, ngược lại lấy điểm từ Facebook sử dụng GetScores().
14. *OnPostScore(IGraphResult result)*
- Hàm gọi lại sau khi đăng điểm của người chơi lên Facebook.
15. *GetScores()*
- Lấy điểm từ Facebook sử dụng Graph API.
16. *OnGetScore(IGraphResult result)*
- Hàm gọi lại sau khi thành công lấy thông tin điểm từ Facebook.
- Tạo một panel hiển thị điểm bạn bè.
17. *DeserializeScores(string response)*
- Giải mã phản hồi từ cuộc gọi API Facebook để lấy điểm.
18. *GetPictureURL(string facebookID, int? width, int? height, string type)*
- Tạo URL để lấy ảnh đại diện của người chơi từ Facebook với các tham số như chiều rộng, chiều cao và loại ảnh.
Đăng ký tài khoản Unity bằng account sinh viên để có thể tham gia chương trình Education License của Unity
Vào menu File-> Open Scene, chọn vào file Assets/Scene/LoadData.unity Bấm nút Play của Unity để chạy thử