IV. GIAO DIỆN CỦA UNITY
1. CỬA SỐ LÀM VIỆC CỦA UNITY
Giao diện của Unity có khả năng tùy chỉnh bố trí tƣơng tự nhƣ nhiều môi trƣờng làm việc khác. Dƣới đây là một kiểu bố trí điển hình trong Unity:
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 22
2. Cửa sổ Scene và Hierarchy
Cửa sổ Hierarchy bao gồm các GameObject (Các đối tƣợng làm nên một game hoàn chỉnh) trong Scene (một cảnh / một phân đoạn / một màn chơi riêng...) hiện hành. Nó bao gồm các tài nguyên nhƣ model 3D, prefabs (các gói tài nguyên), các đối tƣợng tự tạo góp phần tạo nên một game hoàn chỉnh. Bạn có thể lựa chọn các đối tƣợng trong thẻ Hierarchy và kéo nó vào một đối tƣợng khác để tạo mối liên hệ cha con cho đối tƣợng. Khi một đối tƣợng đƣợc thêm hay xóa trong scene, nó sẽ xuất hiện hoặc biến mất trong thẻ Hierarchy.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 23
Hình II.18: Cửa sổ game
Khung nhìn Scene là nơi để bạn chọn và bố trí các đối tƣợng nhƣ cảnh quan, ngƣời chơi, camera, kẻ địch và mọi đối tƣợng khác trong game. Sự bố trí hoạt cảnh với khung nhìn Scene là một chức năng quan trọng nhất của Unity, vì thế chúng ta có thể thực hiện việc này một cách nhanh chóng. Unity cung cấp các phím tắt cho hầu hết các chức năng thông dụng.
Khi kéo thả Asset vào cửa sổ Scene, Assets sẽ trở thành Game Object. Cửa sổ Scene đƣợc ràng buộc cùng với cửa sổ Hierarchy, cửa sổ Hierarchy liệt kê danh sách các Game Object có trong Scene và đƣợc sắp xếp theo thứ tự alphabe.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 24
Cửa sổ Scene còn đi kèm với 4 bốn nút chức năng hữu ích đƣợc hiển thị dƣới dạng hình ảnh nhƣ trên. Chúng có thể đƣợc lựa chọn thông qua các phím tắt Q, W, E và R. Những nút này có các chức năng nhƣ sau:
Công cụ bàn tay (Q): Công cụ này cho phép chúng ta di chuyển đến một
khu vực nào đó trong Scene bằng thao tác kéo thả chuột trái.
Công cụ di chuyển (W): Công cụ này cho phép chúng ta chọn một đối
tƣợng trong cảnh và thực hiện thao tác di chuyển, thay đổi vị trí của đối tƣợng đó. Khi chọn, tại vị trí của đối tƣợng sẽ hiển thị các trục và mặt phẳng gắn liền với đối tƣợng cho phép chúng ta di chuyển đối tƣợng trƣợt theo các trục, mặt phẳng hoặc di chuyển một cách tùy ý.
Công cụ xoay (E): Công cụ này có đặc điểm và cách sử dụng giống với
công cụ di chuyển, tuy nhiên thay vì để di chuyển vị trí của đối tƣợng thì công cụ này giúp chúng ta xoay đối tƣợng xoay quanh trục hay tâm của đối tƣợng.
Công cụ điều chỉnh tỉ lệ(R): Cũng tƣơng tự nhƣ công cụ di chuyển và xoay, công cụ này cho phép chúng ta tùy chỉnh kích thƣớc, tỉ lệ của đối tƣợng một cách tùy ý.
Hình II.20: Thanh điều khiển khung nhìn
Thanh điều khiển khung nhìn Scene giúp bạn xem dƣới nhiều chế độ hiển thị nhƣ Textured, Wireframe, RGB, Overdraw và nhiều loại khác. Nó còn có thể xem các ánh sáng, các tác động hay nghe các âm thanh trong game. Để rõ hơn các bạn hãy xem trong bài tìm hiểu về giao diện phần Góc nhìn trong game.
Hình II.21: Thanh công cụ
Toolbar (Thanh công cụ) bao gồm 5 phần điều khiển cơ bản. Mỗi phần đều liên quan đến các mục đích khác nhau của Unity Editor.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 25
: Bộ công cụ biến đổi -- sử dụng với Cửa sổ Scene.
: Biến đổi chốt Gizmo -- ảnh hƣởng đến hiển thị khung nhìn Scene.
: Các nút Chạy/Ngƣng/Chạy từng bƣớc -- sử dụng để chạy thử game.
: Thanh xổ Layer -- điều khiển các đối tƣợng đƣợc hiển thị trong khung nhìn Scene.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 26
3. Cửa sổ Inspector
Hình II.22: Cửa sổ Inspector
Games trong Unity đƣợc tạo ra bởi tập hợp rất nhiều GameObject, trong đó bao gồm meshes, scripts, âm thanh, hay những đối tƣợng graphic nhƣ nguồn sáng v..v... Inspector sẽ hiển thị mọi thông tin về đối tƣợng đang làm việc một cách chi tiết, kể cả những Components đƣợc đính kèm và những thuộc tính của nó. Tại đây bạn có thể điều chỉnh, thiết lập mọi thông số chức năng của những mối liên kết GameObject-Component.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 27
Mọi thuộc tính thể hiện trong Inspector đều có thể đƣợc tùy biến một cách trực tiếp. Ngay cả với những biến trong script cũng có thể đƣợc hiệu chỉnh mà không cần xem mã. Trong script, ngƣời viết game định nghĩa một giá trị là public cho một kiểu đối tƣợng (nhƣ GameObject hay Transform), họ có thể drag-drop một GameObject hay một Prefab vào trong Inspector để gán giá trị cho nó.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 28
4. Cửa sổ Project
Hình II.24: Cửa sổ Project
Phần bảng bên trái là nơi hiển thị các thƣ mục theo cấu trúc cây thƣ mục. Khi nhấp chọn một thƣ mục ở bên cây thƣ mục thì các dữ liệu sẽ đƣợc hiển thị ở phần bảng bên phải. Các tài nguyên khác nhau sẽ hiển thị các biểu tƣợng khác nhau tùy thuộc vào định dạng của chúng (script, vật liệu, thƣ mục cha,...). Các biểu tƣợng có thể thay đổi kích cở bằng cách sử dụng thanh trƣợt nằm ở góc dƣới bên phải. Nếu con trƣợt chạy về phía bên trái thì các biểu tƣởng sẽ đƣợc hiển thị dƣới dạng cây thƣ mục. Phần khoảng trống phía bên trái con trƣợt giúp hiển thị đƣờng dẫn đầy đủ của file đang đƣợc chọn.
Phía trên danh sách cây thƣ mục là mục Favorite, đây là nơi bạn có thể truy cập nhanh đến các dữ liệu bạn thƣờng xuyên sử dụng. Bạn có thể kéo thả dữ liệu từ trong danh sách cây thƣ mục vào mục Favourite và cũng có thể lƣu trữ các tệp đƣợc tìm kiếm ở đó.
Phía trên mục bảng chọn hiển thị các tệp chính là đƣờng dẫn hiển thị đƣờng dẫn đến thƣ mục chứa tệp đang xem. Các thƣ mục đƣợc phân chia rỏ rệt để dễ dàng truy cập. Khi tìm kiếm, thanh này sẽ đƣợc thay thế để hiển thị khu vực đang tìm kiếm (thƣ mục chủ của tài nguyên, thƣ mục đang đƣợc chọn hoặc Kho tài nguyên) tùy thuộc vào tài nguyên trả phí hay miễn phí trong kho tài nguyên. Ở mục General
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 29
trong Preferences của Unity có thể tắt hiển thị số lƣợt đếm của Kho tài nguyên nếu nó không cần thiết đối với bạn.
5. Cửa sổ Game
Hình II.25: Cửa sổ Game
Cửa sổ Game sẽ đƣợc gọi khi chúng ta nhấn vào nút Play (là một hành động thực hiện test trò chơi). Cửa sổ này cho phép chúng ta tùy chọn về thiết đặt tỉ lệ màn hình, nó phản ánh phạm vi trong Scene mà ngƣời chơi có thể thấy đƣợc với mỗi tỉ lệ màn hình tƣơng ứng, ví dụ nhƣ với mỗi tỉ lệ màn hình 4:3, 16:9 thì ngƣời chơi sẽ có một phạm vi nhìn thấy khác nhau. Sau khi nhấn vào nút Play, chúng ta sẽ ở chế độ Testing, lúc này mọi thay đổi về các thuộc tính, Components, … của đối tƣợng sẽ chỉ là tạm thời. Tức là chúng sẽ trở về nhƣ ban đầu (trƣớc khi nhấn nút Play) sau khi kết thúc chế độ Testing.
V. TỔNG QU N IẾN TRÖC GAME ENGINE UNITY
1. Kiến trúc tổng quan
Engine Unity hỗ trợ cho chúng ta UnityAPI để viết script game. UnityAPI là API lập trình game trong Unity rất mạnh. UnityAPI chứa các đối tƣợng và phƣơng thức hỗ trợ hầu hết các đối tƣợng và các loại thành phần trong Unity.
Trong một scene thƣờng có nhiều đối tƣợng game. Mỗi đối tƣợng này có thể có hoặc không có đoạn script nào gắn lên đó. Nếu muốn gắn script vào đối tƣợng, ta bắt buộc phải kế thừa class đó từ lớp MonoBehaviour của UnityAPI và tên class
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 30
phải trùng với tên file script. Mỗi script khi gắn lên đối tƣợng game đều đƣợc đối tƣợng game xem nhƣ một thành phần bên trong và đƣợc cấp phát vùng nhớ khi chạy game.
Bên trong UnityAPI chứa rất nhiều lớp hỗ trợ lập trình game, trong đó có một số lớp quan trọng nhƣ :
MonoBehaviour: tất cả các script muốn gắn vào một đối tƣợng game bắt
buộc phải kế thừa từ lớp này.
GameObject: lớp cha của tất cả các thực thể trong scene.
Component: lớp cha của tất cả các thành phần có thể gắn vào đối tƣợng.
Transform: giúp thay đổi vị trí, xoay, biến đổi tỉ lệ mô hình.
Input: hỗ trợ lập trình với chuột, cảm ứng đa điểm, cảm biến gia tốc.
Camera: giúp lập trình camera.
Light: giúp tạo ánh sáng trong game.
Projector: giúp chiếu texture lên bề mặt vật thể.
ParticleEmitter: hỗ trợ tạo các hiệu ứng particle đẹp mắt.
Audio: hỗ trợ lập trình với âm thanh.
Animation: chạy chuyển động của mô hình nhân vật.
Rigidbody: giúp tạo hiệu ứng vật lý liên quan đến trọng lực nhƣ bóng nẩy, lăn, ..
CharacterController: giúp điều khiển nhân vật di chuyển theo độ cao địa hình.
Collider: hỗ trợ lập trình va chạm giữa các vật thể.
GUI: giúp lập trình giao diện ngƣời dùng trên Unity.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 31
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 32
Trong script Unity, có một số chức năng sự kiện đƣợc thực hiện theo một thứ tự xác định trƣớc nhƣ một script thực thi. Tùy theo trạng thái của scene mà sự kiện tƣơng ứng sẽ đƣợc gọi:
Chƣơng trình biên soạn (Editor)
Reset(): hàm này đƣợc gọi để khởi tạo các thuộc tính của script khi nó
lần đầu đƣợc gắn vào đối tƣợng.
Khi Scene đầu đƣợc tải (First Scene Load), các chức năng này đƣợc gọi sau khi một scene bắt đầu (một lần cho mỗi đối tƣợng trong scene):
Awake(): hàm này luôn đƣợc gọi trƣớc bất kỳ hàm Start() và cũng chỉ sau một prefab đƣợc khởi tạo.
OnEnable(): (chỉ đƣợc gọi nếu các đối tƣợng đang hoạt động) Chức năng
này đƣợc gọi chỉ sau khi đối tƣợng đƣợc kích hoạt. Điều này xảy ra trong trƣờng hợp MonoBehaviour đƣợc tạo, chẳng hạn nhƣ khi một mức độ đƣợc nạp hoặc một GameObject với các thành phần script đƣợc khởi tạo.
Trƣớc khi cập nhật khung hình đầu tiên(Before the first frame update)
Start() : hàm đƣợc gọi trƣớc khi cập nhật khung hình (frame) đầu tiên
nếu script đƣợc kích hoạt. Cho đối tƣợng đƣợc thêm vào scene, hàm Start() sẽ đƣợc gọi trên tất cả script trƣớc khi đƣợc cập nhật.
Ở giữa khung hình (In between frame)
OnApplicationPause(): hàm này đƣợc gọi ở cuối khung hình nơi tạm dừng đƣợc phát hiện, có hiệu quả giữa các bản cập nhật khung bình thƣờng. Một khung phụ sẽ đƣợc phát hành sau sự kiện OnApplicationPause đƣợc gọi để cho phép game hiển thị đồ họa cho thấy trạng thái tạm dừng.
Thứ tự cập nhật
FixedUpdate(): đƣợc gọi thƣờng xuyên hơn Update(). Nó có thể đƣợc gọi nhiều lần mỗi khung hình, nếu tỉ lệ khung hình thấp và nó có thể không đƣợc gọi giữa khung hình nếu tỉ lệ khung hình cao.Tất cả những tính toán vật lý và cập nhật xảy ra ngay lập tức sau FixedUpdate. FixedUpdate đƣợc gọi trên một bộ đếm đáng tinh cậy và không phụ thuộc vào tỉ lệ khung hình.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 33
LastUpdate(): đƣợc gọi một lần cho mỗi khung hình, sau khi Update() kết thúc. Bất kỳ những tính toán đƣợc thực hiện trong Update() sẽ đƣợc hoàn thành khi LastUpdate() bắt đầu. Một sử dụng phổ biến cho
LastUpdate() là cho camera góc nhìn thứ ba.
Kết xuất hình ảnh (Rendering)
OnPreCull() : đƣợc gọi trƣớc khi camera chọn cảnh. Việc lựa chọn quyết
định đối tƣợng có thể nhìn thấy trong camera.
OnBecameVisible()/OnBecameInvisible(): đƣợc gọi khi một đối tƣợng
trở nên hiển thi/ ẩn đối với bất kỳ camera nào.
OnWillRenderObject(): đƣợc gọi một lần cho mỗi camera nếu đối
tƣợng có thể nhìn thấy.
OnPreRender(): đƣợc gọi trƣớc khi camera bắt đầu vẽ các scene.
OnRenderObject(): đƣợc gọi sau khi tất cả kết xuất hình ảnh scene đƣợc
thực hiện.
OnPostRender(): đƣợc gọi sau khi một camera kết thúc kết xuất hình ảnh scene.
OnRenderImage(): đƣợc gọi sau khi kết xuất scene đƣợc hoàn thành cho
phép chỉnh sửa hình ảnh scene.
OnGUI(): đƣợc gọi nhiều lần mỗi khung hình để đáp ứng với sự kiện GUI. Những sự kiện giao diện (Layout) và tô màu lại (repaint) đƣợc xử lý đầu tiên, theo sau là một sự kiện giao diện và sự kiện bàn phím / chuột cho mỗi sự kiện đầu vào.
OnDrawGizmos(): đƣợc sử dụng để vẽ Gizmos trong khung nhìn scene
cho các mục đích trực quan.
Coroutines: là những thành phần chƣơng trình máy tính khái quát chƣơng trình con cho đa nhiệm, bằng cách cho phép nhiều điểm kiểm soát đình chỉ và hồi phục việc thực thi tại các điểm nhất định. Coroutines phù hợp cho việc cài đặt nhiều thành phần chƣơng trình giống nhau nhƣ nhiệm vụ hợp tác (cooperative tasks), ngoại lệ (exceptions), vòng lập sự kiện (event loop) , vòng lặp (iterators) , danh sách vô hạng (infinite lists) và ống dẫn (pipes).
Yield(): coroutine sẽ tiếp tục sau khi tất cả hàm Update() đƣợc gọi trong
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 34
Yield WaitForSeconds(): coroutine tiếp tục sau một khoảng thời gian chờ, sau khi tất cả hàm Update() đƣợc gọi cho khung hình.
Yield WaitForFixedUpdate(): coroutine tiếp tục sau khi tất cả hàm
FixedUpdate() đƣợc gọi trên tất cả các script
Yield WWW(): coroutine tiếp tục sau khi tải về WWW đã hoàn thành.
Yield StartCoroutine(): nối kết các coroutine và chờ đợi cho coroutine hoàn thành lần đầu tiên.
Khi đối tƣợng bị hủy (When the Object is Destroyed)
OnDestroy(): hàm đƣợc gọi sau khi cập nhật tất cả khung hình cho đến
khung hình cuối thể hiện sự tồn tại của đối tƣợng(đối tƣợng có thể bị phá hủy để đáp ứng với sự kiện Object.Destroy hoặc khi đóng một scene).
Khi thoát ứng dụng (When Quitting)
OnApplicationQuit(): chức năng đƣợc gọi trên tất cả đối tƣợng game trƣớc khi ứng dụng đƣợc hủy. Trong trình soạn thảo, chức năng đƣợc gọi khi ngƣời dùng dừng chế độ playmode. Trong phần chơi web, chức năng đƣợc gọi khi khung nhìn web đƣợc đóng.
OnDisable(): chức năng đƣợc gọi khi hành vi trở nên vô hiệu hóa hoặc
không hoạt động.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 35
CHƢƠNG III: NGHIÊN CỨU THỂ LOẠI GAME MOBA
I. GIỚI THIỆU VỀ THỂ LOẠI GAME MOBA
MOBA là cụm từ viết tắt của Multiplayer Online Battle Arena (Đấu trƣờng trực tuyến nhiều ngƣời chơi ). Các trò chơi thuộc thể loại game MOBA còn đƣợc gọi là game hành động chiến lƣợc thời gian thực (Action Real Time Strategy – ARTS) vì nó có nguồn gốc từ thể loại game chiến lƣợc thời gian thực (Real Time Strategy RTS), trong đó thì ngƣời chơi điều khiển một nhân vật duy nhất (còn đƣợc gọi là Hero hay Anh hùng).
MOBA là một dạng game online mới đƣợc kết hợp từ thể loại hành động và thể loại chiến lƣợc thời gian thực vì ngƣời chơi không cần xây dựng bất kỳ công trình hay đơn vị quân nào khác. Quân lính của 2 phe trong game đƣợc máy tính tự “sinh ra” và điều khiển. Xuyên suốt trò chơi, bạn chỉ phải điều khiển nhân vật Hero của mình và thực hiện một đích duy nhất là phá húy căn cứ của đối phƣơng. Mỗi một Hero sẽ có khả năng và ƣu/nhƣợc điểm riêng biệt để tạo thành chiến lƣợc tổng thể của một đội chơi gồm 5 ngƣời.
II. LỐI CHƠI CỦA GAME MOBA
Có hai phe đối lập và nhiệm vụ chung cho hai bên là phải phá hủy đƣợc căn cứ đối phƣơng để giành chiến thắng. Bên nào phá đƣợc xong trƣớc thì bên đó giành phần thắng (một số game MOBA lại quy định điều kiện chiến thắng theo kiểu khác). Thƣờng thì bạn phải phá hủy đƣợc nhà chính của đối phƣơng để giành chiến thắng. Việc phá hủy các công trình phụ khác trong “nhà” của đối phƣơng sẽ đƣa trò chơi diễn biến theo những “kịch bản” khác nhau. Ví dụ: phá tháp canh hay phá nhà quân của địch…
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 36
Hình III.1: Các Hero làm nên linh hồn cho thể loại game MOBA.
Những Hero hay Tƣớng mà bạn điều khiển sẽ tích lũy điểm kinh nghiệm (Experience) để lên cấp độ. Điểm kinh nghiệm này có đƣợc khi bạn đi đánh quân và