Đề tài Tìm hiểu về Game và cách xây dựng game đa nền tảng với Unity Engine

MỤC LỤC Lời mở đầu 2 Chương 1. Giới thiệu chung 3 1.1. Giới thiệu về Unity 3 1.2. Tính năng của Unity 3 1.3. Các khái niệm cơ bản trong Unity 4-6 Chương 2. Làm quen với môi trường Unity 7 2.1. Tìm hiểu và khởi tạo các đối tượng cơ bản trong Unit 7-29 2.2. Thành phần vật lý và xử lý va chạm 29-31 2.3. Xử lý Text, hiệu ứng trong game và chuyển màn chơi 32-35 2.4. Một số cơ sở dữ liệu trong game Unity 36-40 Chương 3. Làm game với Unity Engine 41 3.1. Giới thiệu game đang thực

docx52 trang | Chia sẻ: huong20 | Ngày: 08/01/2022 | Lượt xem: 447 | Lượt tải: 0download
Tóm tắt tài liệu Đề tài Tìm hiểu về Game và cách xây dựng game đa nền tảng với Unity Engine, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hiện 41-43 3.2. Mục tiêu đề tài 44 3.3. Tài liệu tham khảo 44 Kết Luận 45 Lời mở đầu Ngày nay, Công nghệ thông tin đang là nghành được đầu tư phát triển rộng rãi nhất, ta có thể thấy máy tính, laptop xuất hiện ở khắp nơi như tại doanh nghiệp, công ty, nhà trường. Công nghệ thông tin không chỉ giúp ta hoàn thành công việc 1 cách nhanh chóng, chính xác mà còn là thứ có thể đáp ứng nhu cầu giải trí cho mọi người sau một ngày làm việc mệt mỏi. Chỉ với một cái laptop hay 1 cái máy tính để bàn ta có thể sử dụng để xem phim, nghe nhạc và chơi game. Hơn nữa sự bùng nổ của CNTT cũng kéo theo những chiếc PC, laptop, điện thoại có cấu hình khủng giúp chúng ta có thể làm mọi việc trên 1 chiếc máy tính. Đặc biệt Chính vì vậy, nội dung luận văn mà em sẽ thực hiện là tìm hiểu về Game và cách xây dựng game đa nền tảng với Unity Engine. Chương 1. Giới thiệu chung 1.1. Giới thiệu về Unity. - Unity3D là một môi trường phát triển tích hợp, mạnh mẽ, hỗ trợ thao tác kéo thả, tuỳ biến giao diện nhanh chóng, trực quan. - Cung cấp các công cụ xử lý đồ hoạ, tích hợp sẵn thư viện vật lý, tính toán va chạm... - Hỗ trợ phát triển cả game 2D và 3D. - Hỗ trợ nhiều nền tảng thông dụng như OSX, Linux, Window, Web, iOS, Window Phone 8, Android, PS3, BB - Cộng đồng người dùng, hỗ trợ rộng lớn. - Có phiên bản miễn phí có thể chạy được trên Window và Mac OSX 1.2. Tính năng của Unity. Unity3D hướng tới người sử dụng chuyên nghiệp và cả nghiệp dư, nên khá dễ để sử dụng. Với ngôn ngữ lập trình bằng C#, JavaScript hoặc BOO. Ngày nay rất nhiều nhà phát triển game lựa chọn Unity3D để phát triển bởi khả năng hỗ trợ đa nền tảng và sự mạnh mẽ tiện dụng của Unity3D. Đến với Unity, các bạn sẽ không cần phải băng khoăn về các vấn đề xử lý, các khái niệm đồ hoạ phức tạp... tất cả đều trở nên dễ dàng và nhanh chóng với Unity. 1.3. Các khái niệm cơ bản trong Unity 1.3.1. GameObject - Một đối tượng cụ thể trong game gọi là một game object, có thể là nhân vật, đồ vật nào đó. Ví dụ: cây cối, xe cộ, nhà cửa, người... 1.3.2. Component - Một GameObject sẽ có nhiều thành phần cấu tạo nên nó như là hình ảnh (sprite render), tập hợp các hành động (animator), thành phần xử lý va chạm (collision), tính toán vật lý (physical), mã điều khiển (script), các thành phần khác... mỗi thứ như vậy gọi là một component của GameObject. 1.3.3. Sprite - Là một hình ảnh 2D của một game object có thể là hình ảnh đầy đủ, hoặc có thể là một bộ phận nào đó.  1.3.4. Animation - Là tập một hình ảnh động dựa trên sự thay đổi liên tục của nhiều sprite khác nhau. 1.3.5. Key Frame - Key Frame hay Frame là một trạng thái của một animation. Có thể được tạo nên từ 1 sprite hay nhiều sprite khác nhau. 1.3.6. Prefabs - Là một khái niệm trong Unity, dùng để sử dụng lại các đối tượng giống nhau có trong game mà chỉ cần khởi tạo lại các giá trị vị trí, tỉ lệ biến dạng và góc quay từ môt đối tượng ban đầu. Ví dụ: Các đối tượng là đồng tiên trong game Mario đều có xử lý giống nhau, nên ta chỉ việc tạo ra một đối tượng ban đầu, các đồng tiền còn lại sẽ sử dụng prefabs. Hoặc khi ta lát gạch cho một cái nền nhà, các viên gạch cũng được sử dụng là prefabs. 1.3.7. Sounds -Âm thanh trong game. 1.3.8. Script - Script là tập tin chứa các đoạn mã nguồn, dùng để khởi tạo và xử lý các đối tượng trong game.  - Trong Unity có thể dung ngôn ngữ lập trình C#, Java Script, BOO để lập trình Script. - Unity có hỗ trợ sẵn phần mềm MonoDeveloper dùng để lập trình. 1.3.9. Scenes - Quản lý tất cả các đối tượng trong một màn chơi của game.  Ảnh minh họa scene game 1.3.10. Assets - Bao gồm tất cả những gì phục vụ cho dự án game như sprite, animation, sound, script, scenes 1.3.11. Camera - Là một game object đặc biệt trong scene, dùng để xác định tầm nhìn, quan sát các đối tượng khác trong game. 1.3.12. Transform - Là 3 phép biến đổi tịnh tiến, quay theo các trục, và phóng to thu nhỏ một đối tượng  Chương 2. Làm quen với môi trường Unity 2.1. Tìm hiểu và khởi tạo các đối tượng cơ bản trong Unity Ảnh minh họa bố trí của Unity 2.1.1. Các thành phần và bố trí a. Scene - Phần màu đỏ số 1. - Phần này phần hiển thị các đối tượng trong scenes một cách trực quan, có thể lựa chọn các đối tượng, kéo thả, phóng to, thu nhỏ, xoay các đối tượng ... - Phần này có để thiết lập một số thông số như hiển thị ánh sáng, âm anh, cách nhìn 2D hay 3D . b. Game - Phần màu đỏ số 1 - Phần này cho phép ta xem trước hiển thị từ scene ra game, bên cạnh tab scene. c. Inspector - Phần số 2 màu vàng - Phần này hiển thị các component của một Game Object và các thông số của các component. d. Project - Phần số 3 màu xanh lá cây - Phần này hiển thị thư mục Assets, chứa tất cả các tài nguyên của dự án game. - Ở phần này, bên cạnh tab khác, có phần Console để hiển thị các log trong quá trình debug. e. Hierarchy - Phần đóng khung màu tím - Phần này quản lý tất cả các đối tượng trong scenes, có thể chọn lựa, đổi tên, xoá các đối tượng ra khỏi game. f. Top bar - Phần đóng khung màu đà  - Phần này chứa các nút chuyên dụng: + Bốn nút bên trái: (1) tuỳ chọn cho phép dùng chuột kéo toàn bộ scenes, phóng to, thu nhỏ, lựa chọn các đối tượng trong scenes... (2) cho phép dùng chuột di chuyển các đối tượng trong scenes, (3) cho phép dùng chuột quay các đối tượng (4) cho phép dùng chuột phóng to, thu nhỏ các đối tượng  + Ba nút ở giữa: (1) cho phép chạy demo game, (2) cho phép dừng game tại một frame nào đó, (3) cho phép chạy từng frame. + Hai drop list bên phải: (1) cho phép tuỳ chọn hiển thị các layer, (2) cho phép chọn và lưu các bố trí do người dùng thiết lập. Ngoài ra còn có các cửa sổ khác của Unity, như Sprite Editor, Animation, Animator, Console... và các bạn có thể tự tuỳ biến cho mình một bố cục sao cho thuận tiện với mình nhất... 2.1.2. Tạo và cấu hình với dự án 2D - Bật Unity lên, vào menu File/New Project Ảnh minh họa Chọn loại project là 2D sau đó gõ tên project xong nhấn Create Project. Kết quả như sau: ảnh minh họa Sau khi tạo dự án xong, ở Hierarchy sẽ có một đối tượng là Main Camera. Chúng ta cần điều chỉnh kiểu hiển thị Scene là 2D  Ở cửa sổ Hierarchy chọn Main Camera. Ở cửa sổ Inspector sẽ hiển thị các thông số của camera, ta sẽ chọn lại giá trị Projection hay phép chiếu là phép chiếu vuông góc thay cho phép chiếu phối cảnh Chọn phép chiếu vuông góc Tiếp theo, ở cửa sổ Project, ta sẽ tạo sẵn các thư mục để chứa tất cả các tài nguyên có sử dụng trong game sau này lần lượt là: Animations, Prefabs, Scripts, Sprites, Sounds, Scenes. Right-Click vào thư mục Assets ở cửa sổ Project, ta chọn Create, chọn Folder.  Kết quả như hình sau: 2.1.3. Khởi tạo các đối tượng cơ bản a. GameObject a1. Empty Object - Ở menu ta chọn GameObject, chọn Create Empty.  - Hoặc click chuột phải ở phần Hierarchy => Create Empty Ta có thể đổi tên, sao chép hay xoá các đối tượng thông qua cửa sổ này. - Empty game object là một đối tượng đơn giản nhất, khi mới tạo ra, chỉ chứa các thông số biến đổi (transform) ngoài ra nó sẽ không chứa bất kỳ một component nào cả.  Chúng ta có thể thêm các component hoặc để nhóm các đối tượng khác lại với nhau thành một nhóm, hoặc sử dụng các empty object cho các mục đích khác ... a2. Parent object và Child object Parent object : là một đối tượng chứa các đối tượng con khác, gắn liền với nhau. Child object: là một đối tượng nằm trong một đối tượng khác, gắn liền với nhau. - Để tạo các đối tượng parent và child, ta chỉ việc kéo thả một đối tượng có sẵn vào trong đối tượng đã có trong cửa sổ Hierarchy. Khi thay đổi các đối tượng con thì chỉ có tác động trên đối tượng con đó. - Khi thay đổi đối tượng cha thì các đối tượng con sẽ thay đổi theo. Đối tượng Girl có các đối tượng con là Bag, Hat a3. Tag - Tag là một thuộc tính của của một game object. Ta sử dụng thuộc tính này mục đích xác định và phân biệt các đối tượng với nhau, khi xử lý sự kiện hay bất kể vấn đề gì cần. Tag Thêm tag mới Danh sách tag b. Sprite - Có 2 loại sprite là Single sprite và Multiple sprite. Single sprite Multiple sprite b1. Single sprite Ở cửa sổ Project, chọn thư mục Assets, Right-Click vào thư mục Sprites, chọn Import New Assets, sau đó tìm đến một hình ảnh nào đó.  Ở cửa sổ Inspector, chọn Texture Type là Sprite, Sprite Model là single, sau đó nhấn Apply. b2. Multiple sprite - Tiến hành tương tự, Import New Assets, chọn đến một tập tin ảnh chứa nhiều Sprite như ở ví dụ trên, sau đó ở cửa sổ Inspector chọn Texture Type là Sprite, Sprite Model là Multiple. Xong nhấn Apply. Tiếp theo ta cần xác định các vùng bao, để xác định các sprite con thuộc Multiple sprite vừa import vào đó bằng cách ở bảng Inspector chọn Sprite Editor. Ở cửa sổ Sprite Editor, ta chọn Slice, sau đó để mặc định các thông số, chọn nút Slice, Unity sẽ tự động xác định vùng bao nhỏ nhất cho các sprite cho chúng ta. Hoặc chúng ta có thể tự dùng chuột để xác định các vùng bao này. Sau đó nhấn nút Apply ở cửa sổ Sprite Editor để áp dụng. Vậy là ta đã tạo xong hai loại sprite bằng Unity. b3. Thêm Sprite render cho Empty GameObject  - Tạo một Empty GameObject, đặt tên là Ground. Sau đó chọn đối tượng này, ở cửa sổ Inspector ta chọn Add Component sau đó chọn Rendering, chọn Sprite Render. Tiếp theo, ở mục Sprite Render ở cửa sổ Inspector, ta chọn Sprite để hiển thị (Nút khoan tròn đỏ) c. Animation Một animation là một hình ảnh động mô tả một đối tượng nào đó trong game.  Ví dụ: có thể là một chiếc xe đang chạy, hay một nhân vật đang đi.... Một animation trong Unity có thể bao gồm nhiều hành động, một hành động như vậy gọi là một clip. Ví dụ: một nhân vật có thể có các hành động đi, đứng, nhảy.... Có hai kỹ thuật để tạo animation (cả 2D và 3D): đó là kỹ thuật key frame và kỹ thuật skeletal hay spine. c1. Kỹ thuật tạo animation *Kỹ thuật tạo key frame Đối với kỹ thuật key frame, người ta sử dụng một sprite cho một key frame của hành động. Mỗi sprite là 1 key frame Để tạo ra chuyển động, ta sẽ vẽ một key frame tại thời điểm đầu và thay đổi tuần tự các key frame sau, chúng ta sẽ có được một animation. Đây là phương pháp đơn giản nhất để tạo chuyển động, nhưng lại tốn kém về bộ nhớ, vì ta phải tốn nhiều sprite cho nhiều chuyển động khác nhau. *Kỹ thuật skeletal hay spine hay bộ xương Đối với kỹ thuật này, người ta chia đối tượng ra thành nhiều sprite, mỗi sprite là một bộ phận của đối tượng (giống như 1 khúc xương của bộ xương). Để tạo ra một key frame mới, ta sẽ thay đổi các sprite về vị trí, độ lớn, xoay của các sprite thành phần có liên quan đến chuyển động. Sau đó kết hợp các key frame lại với nhau như kỹ thuật key frame để tạo thành các animation. Chúng ta có thể xem các sprite cấu tạo nên một key frame ở ảnh dưới. Cách này có vẻ tốn thời gian hơn, nhưng lại rất là hiệu quả, đặc biệt là tiết kiệm được nhiều bộ nhớ. c3. Điều khiển các hành động nhân vật – Animator Ở phần trên chúng ta đã tìm hiểu cách tạo các clip hay các hành động của một animation. Với một animation như vậy ta sẽ có một Controller. Phần này sẽ biểu diễn cách chuyển qua lại giữa các hành động bằng máy trạng thái. Ở cửa sổ Hierarchy chọn đối tượng MainCharacter, chọn Menu, chọn Window, chọn Animator, cửa sổ Animator sẽ xuất hiện như sau: Danh sách các state, mỗi state tương ứng với một clip Click chuột phải vào state Idle, chọn Set Default để thiết lập state mặc định cho đối tượng. Chọn Make Transition, sau đó đưa chuột đến trạng thái đích. Với mỗi transition vừa tạo, có nghĩa rằng nhân vật từ trạng thái hiện tại có thể chuyển đổi trực tiếp qua trạng thái đích. Kết quả thu được ta gọi là máy trạng thái hay sơ đồ chuyển đổi trạng thái. Khi đối tượng được load lên, trạng thái mặc định sẽ được thiết lập, vậy lúc nào thì sẽ chuyển qua trạng thái khác ?? Chúng ta sẽ tạo thêm các tham số, và dựa vào giá trị các tham số này để chuyển đổi các trạng thái. Ta sẽ tạo ra 3 tham số kiểu bool là isJump, isIdle, isRunning để điều khiển. Để thiết lập điều kiện cho một transition, ta click chọn transition đó (transition được chọn chuyển qua màu xanh), ở cửa sổ Inspector, mục thuộc tính Conditions (điều kiện) ta sẽ thiết lập giá trị của các tham số, để xác định lúc nào thì chuyển trạng thái. Ở đây, chúng ta chọn isRunning = true. Ta có thể thêm các điều kiện khác (trường hợp chuyển đổi phụ thuộc nhiều điều kiện) bằng cách nhấn dấu cộng hoặc dấu trừ để bỏ bớt một điều kiện. Vậy mỗi khi ta set giá trị tham số isRunning = true, trạng thái nhân vật sẽ chuyển sang Running. Tương tự ta thiết lập isIdle, isJump cho các transition khác. Cuối cùng, ở cửa sổ Hierarchy, ta chọn MainCharacter, ở cửa sổ Inspector, mục Animator, ta bỏ chọn Apply Root Motion. Đến đây, chúng ta đã biết cách xây dựng một animation cho các đối tượng trong game và điều khiển qua lại các đối tượng đó. d. Prefab - Prefab cho ta tạo ra các bản sao nhanh của một đối tượng mà không cần thiết lập lại các giá trị khởi tạo của một đối tượngnào đó ngoài trừ các giá trị transform (vị trí, tỉ lệ, quay). - Để tạo một Prefab cho một đối tượng nàođó, ta chỉ cần kéo thả đối tượng đó ở cửa sổ Hierarchy xuống thư mục Prefab (nếu chưa có thì tạo mới) trong cửa sổ Project của chúng ta. Sau này muốn sử dụng ta chỉ việc kéo các Prefab này trở lại cửa sổ Scene. Prefab cho đối tượng Ground Bây giờ ta sẽ kéo thả Prefabs này tạo thành một đường thẳng, và đặt lại vị trí đối tượng MainCharacter ở vị trí nằm trên đường thẳng này như hình vẽ. e. Script và điều khiển máy trạng thái e1. Script Script là một tập tin (cũng là Game Component) chứa các mã điều khiển cho một đối tượng nào đó trong game, được viết bằng C# hay Javascript hoặc BOO. Để tạo script ta click chuột phải ở thư mục Scripts/Create/C# Script. Với mỗi script tạo ra, ta cần chỉ định script này thuộc về đối tượng nào. Ta thực hiện bằng cách: Chọn đối tượng MainCharacter ở cửa sổ Hierarchy, ở cửa sổ Inspector chọn Add Component/Scripts/Main Character Behaviour.cs ở danh sách. Sau khi add: Kích đúp để mở file script ta sẽ thấy như sau: + Start(): Được gọi 1 lần đầu tiên sau khi khởi tạo đối tượng, trước khi vào Update. + Update(): Được gọi liên tục sau mỗi frame, sau Start. + OnWillRenderObject():  Được gọi liên tục sau một frame sau Update. Thường thì ta sẽ ít đụng đến hàm này. + OnDestroy(): Được gọi khi đối tượng bị huỷ. Biểu đồ: - Ta có thể khai báo các thuộc tính trong file script, các thuộc tính này sẽ được hiển thị ở cửa sổ Inspector  Đối với thuộc tính là GameObject chúng ta có thể nhấn vào nút đỏ, sau đó chọn prefabs cho đối tượng ở bảng mới hiện ra. e2. Một số xử lý cơ bản - Truy cập vào đối tượng game hiện tại thông qua this.gameObject - Thay đổi vị trí, tỉ lệ, quay đối tượng thông qua gameObject.transform(.position, .scale, .rotate) - Để huỷ một đối tượng game Destroy(GameObject) (*) - Để tạo một prefab trong quá trình thực thi game: Instantiate(gameObject, Vector3, Quaternion) - Input.GetKeyDown(keyCode), GetKey(keyCode), GetKeyUp(keyCode) kiểm tra xem một key được bấm, được giữ, được thả ra hay không ? - Input.GetAxis ("Horizontal") trả về giá trị số thực trong khoảng -1..1 nếu có sự kiện các key right hoặc left được bấm (key ngang).  - Input.GetAxis ("Vertical") trả về giá trị số thực trong khoảng -1..1 nếu có sự kiện các key up hoặc down được bấm (key dọc).  - OnMouseDown, OnMouseUp, OnMouseDrag các hàm xử lý chuột. - gameObject.GetComponent() get Game Component được đính kèm trong gameObject hiện tại có thể là: Animator, Transform ... 2.2. Thành phần vật lý và xử lý va chạm 2.2.1. Thêm thành phần vật lý - Thành phần vật lý hỗ trợ các thao tác về vật lý như: tác dụng lực, trọng lực trái đất, ma sát... Để thêm thành phần vật lý ta làm như sau: ở Hierarchy, chọn đối tượng MainCharacter (đối tượng cần thêm) / Menu /Component / Physics 2D / Rigidbody 2D. Ta sẽ thấy ở cửa sổ Inspector khi chọn đối tượng MainCharacter sẽ thêm một Component nữa là Rigidbody 2D như sau: Một số giá trị cần lưu ý sau: Mass: là khối lượng của đối tượng  Linear Drag: Hệ số ma sát của vật đối với chuyển động kéo. Angular Drag: Hệ số ma sát của vật đối với chuyển động quay Gravity scale: giống như hệ số G trong vật lý (~ 9.81), chỉ sự ảnh hưởng của lực hút trái đất. Ta có thể đặt = 0, tức là không ảnh hưởng bởi lực hút trái đất. Is Kinematic: loại bỏ tác dụng vật lý ra khỏi đối tượng, thường sử dụng với các đối tượng như tường, nền ... Fixed Angle: Đối tượng luôn nằm một góc cố định. Không thay đổi khi tương tác vật lý. rigidbody2D.AddForce(Vector2 force, ForceMode2D mode): phương thức tác dụng một lực vào đối tượng. Sau khi thêm thành phần vật lý vào, nhấn nút play để xem demo, ta sẽ thấy đối tượng sẽ từ từ rơi xuống (do Gravity scale > 0).  Tương tự, ta sẽ thêm thành phần vật lý cho đối tượng Ground, và đặt thuộc tính cho nó là Is Kinematic để làm nền. 2.2.2. Thành phần xử lý va chạm  *Ở Hierarchy, chọn đối tượng MainCharacter (đối tượng cần thêm) / Menu /Component / Physics 2D / Circle Collider 2D ( ta cũng có thể chon Collider khác ). Thuộc tính: Is Trigger: nếu chọn thì đối tượng chỉ dùng để xác định va chạm mà không ảnh hưởng bởi tác động vật lý. *3 phương thức thường xử dụng trong trường hợp này:     void FixedUpdate():--> Các tính toán, tương tác vật lý, chúng ta sẽ đặt trong hàm này, ví dụ như AddForce, etc.     void OnCollisionEnter2D(Collision2D other): --> Hàm này được gọi khi có hai đối tượng va chạm nhau.     void OnTriggerEnter2D(Collider2D other)  --> Hàm này được gọi khi có hai đối tượng va chạm nhau, trong đó có 1 hoặc cả hai đối tượng là Trigger. 2.3. Xử lý Text, hiệu ứng trong game và chuyển màn chơi 2.3.1. Sử dụng Text Trên thanh Menu chọn GameObject/ UI / Text. Thuộc tính của Text như hình sau: 2.3.2. Sử dụng Particle System - Particle System là một trong những kỹ thuật tạo ra các hiệu ứng cháy nổ hay sương, khói... được sử dụng rất thường xuyên trong game. Các bạn có thể google để tìm hiểu thêm về Particle system và cách tạo Particle System. - Tạo Particle System ta chọn GameObject/ Particle System. -Hiệu ứng mặc định có sẵn trong Unity: -Một số thuộc tính của Particle System: 2.3.3. Chuyển đổi màn chơi Trong một game sẽ có nhiều màn chơi, hoặc nhiều cảnh game, lấy một ví dụ đơn giản khi đối tượng rơi xuống (hoặc hết máu hay gì đó) thì game sẽ kết thúc và hiện ra màn hình thông báo là Game Over chẳng hạn. -Đầu tiên ta lưu scene hiện tại : Để quản lý các scene ta vào File/ Build Settings Một cửa sổ mới hiện ra, ta chọn Add Current. Tắt cửa sổ mới hiện ra, tiếp theo các bạn tạo mới một Scenes, lưu lại với tên là GameOver Save lại và vào File/ Build Setting add Currenst scene mới tạo là GameOver vào. Code xử lý chuyển đổi màn chơi: Ta có thể sử dụng 2 phương thức sau để chuyển scene sau : public static void LoadLevel(int index); public static void LoadLevel(string name); Ví dụ : Application.LoadLevel(1); Application.LoadLevel(“GameOver”). *Với phiên bản Unity hiện tại ta có thể sử dụng SceneManager.LoadScene thay thế cho Application.LoadLevel. 2.4. Một số cơ sở dữ liệu trong game Unity 2.4.1. PlayerPrefs - PlayerPrefs là một lớp tĩnh (static class) được Unity hỗ trợ để lập trình viên có thể lưu trữ và truy xuất thông tin ở những lần chơi khác nhau ở dạng key/value. Ví dụ: Lưu trữ thông tin: PlayerPrefs.SetString("username", "PhamNgocPhuoc"); PlayerPrefs.SetString("password", "stdio1235"); PlayerPrefs.SetInt("level", 10); Để truy xuất các dữ liệu trên ta sử dụng: String _userName = PlayerPrefs.GetString("username"); String _password = PlayerPrefs.GetString ("password"); Int _level = PlayerPrefs.GetInt("level"); Một số phương thức hỗ trợ DeleteAll Xóa tất cả các key và giá trị đã được lưu trữ. DeleteKey Xóa một key cụ thể. GetFloat Trả về giá trị float tương ứng với key nếu key tồn tại. GetInt Trả về giá trị int tương ứng với key nếu key tồn tại. GetString Trả về giá trị string tương ứng với key nếu key tồn tại. HasKey Trả về true nếu key tồn tại. Save Lưu trữ tất cả dữ liệu được chỉnh sữa xuống đĩa. SetFloat  Lưu giá trị float theo key vào bộ nhớ chính. SetInt Lưu giá trị int theo key vào bộ nhớ chính. SetString Lưu giá trị string theo key vào bộ nhớ chính. Mức độ bảo mật : Thấp. 2.4.2. SimpleJSON - Đối với những dữ liệu có tính phức tạp cao thì SimpleJSON chính là sự cần thiết để thay thế PlayerPrefs. - SimpleJSON làm cho việc parse và build JSON trở nên thuận tiện và dễ dàng hơn, hỗ trợ nhiều JSONTypes khác nhau và nhiều loại giá trị khác nhau(boolean, int, float, string). - Parse dữ liệu từ JSON có sẵn: 1 2 3 4 5 6 var jsonNode = JSONNode.Parse("{\"achievements\": [1, 2, 3]}"); List achievements = new List(); for (int j = 0; j < jsonNode["achievements"].Count; ++j) {     achievements.Add(jsonNode["achievements"][j].AsInt); } - Parse dữ liệu từ JSON string đã được base64: 2 3 4 5 6 var jsonNode = JSONNode.LoadFromBase64("{\"achievements\": [1, 2, 3]}"); List achievements = new List(); for (int j = 0; j < jsonNode["achievements"].Count; ++j) {     achievements.Add(jsonNode["achievements"][j].AsInt); } - Build JSON từ string data: 1 2 3 4 5 6 7 8 9 var jsonObj = new JSONClass(); for (int i = 0; i < achievements.Count; ++i) {     jsonObj["achievements"][i].AsInt = (int)achievements[i]; } string ret = jsonObj.SaveToBase64(); - Mức độ bảo mật : khá cao. 2.4.3. Lưu trữ dưới dạng file - Chúng ta xài C# để, sử dụng các kỹ năng về thao tác file là có thể làm được điều này. - Một cách tổ chức file ngày nay hay dùng là dạng XML, nó làm tăng khả năng định dạng dữ liệu, rất phù hợp cho game. Cách này ko thể thiếu trong bất kỳ trò game nào. - Nhược điểm của nó là khó nhằn về tổ thức dữ liệu, truy xuất và bảo trì data khối lượng lớn. 2.4.4. Sử dụng SQLite Việc tích hợp SQLite vô cùng dễ dàng, ta có thể đặt database này đi kèm với project game hay đặt nó trên server để truy xuất dữ liệu và lưu trữ dữ liệu. -Ưu điểm: Xử lý với các dữ liệu với game có độ lớn trung bình, vài chục M data. Thích hợp với các game trên iOS và Android yêu cầu tiết kiệm độ lớn vì nó không đồ sộ. Truy xuất dữ liệu sử dụng ngông ngữ SQL của Microsoft nên dễ dàng vọc. -Nhược điểm: Tính năng đang được phát triền và cần mở rộng thêm, bảo mật chưa được cao như SQL server. 2.4.5. Lưu trữ bằng MySQL Đây là hệ quản trị CSDL quan hệ, được được ứng dụng khá nhiều trong ứng dụng đi kèm với nó là PHP và Java. - Ưu điểm của nó là tốc độ nhanh và linh động trong xử lý dữ liệu. Phù hợp với các game server - client, nó là server chứa dữ liệu để các client truy cập đến xử lý. Thông thường xài webservice bằng PHP để thao tác với CSDL loại này. Phù hợp với game online dạng webgame, hay các game cần dữ liệu lớn. - Nhược điểm: Không thể tích hợp trong client như SQLite, vậy nên ko thể xài game offline với loại này. 2.4.6. Lưu trữ dữ liệu với SQLserver Đây là hệ quản trị CSDL quan hệ và đối tượng. Nó có sức mạnh ngôn ngữ SQL và đảm bảo tốc độ xử lý dữ liệu cao, an toàn và bảo mật cao. - Ưu điểm: Dữ liệu lớn và an toàn, dễ bảo trì và nâng cấp database (giống MySQL). Phù hợp với các game cần dữ liệu lớn và an toàn cao. Thông thường do server truy cập và xử lý dữ liệu. Hệ thống server này nhận các yêu cầu từ phía client và truyền lại client kết quả xử lý. Việc thao tác với SQLserver khá dễ dàng về công nghệ, thông thường ta dùng .Net đề làm việc này. - Nhược điểm: Chỉ thích hợp các game online, không xài được cho game offline. Chương 3. Làm game với Unity Engine 3.1. Giới thiệu game đang thực hiện 3.1.1. Nội dung Game: - Điều khiển máy bay chiến đấu với vật thể lạ ( UFO ) 3.1.2. Cách chơi: - Sử dụng các phím A,D,W,S tương ứng để di chuyển sang trái, phải, lên trên, xuống dưới. - Phím Space để bắn đạn. - Với mỗi địch bị tiêu diệt bạn sẽ nhận được 100 điểm, game có tính thời gian chơi sau khi kết thúc trò chơi thời gian chiến đấu sẽ được tính như điểm thưởng với 1s = 1 điểm. - Khi đạt được số điểm nhất định bạn sẽ được chuyển sang màn đánh với Boss, sau khi tiêu diệt boss điểm thưởng ( thời gian ) sẽ được nhân đôi cùng với số điểm tiêu diệt mặc định là 1000 điểm. 3.1.3. Một số hình ảnh về game: *Màn khởi động + Gồm 4 nút: New game : chuyển đến màn chơi 1. LeaderBoard: click vào nút này ta có thể xem bảng xếp hạng điểm số người chơi. Game Info: Thông tin về game, hướng dẫn cách chơi. Exit: Thoát khỏi trò chơi. + Code xử lý khi click button: Chuyển màn chơi: Ví dụ: Application.LoadLevel(“ingame01”) hay Application.LoadLevel(1); => Với phiên bản hiện tại của Unity (5.4) khuyến khích dùng SceneManager.LoadScene(string name) or SceneManager.LoadScene (int index), và để sử dụng ta phải khai báo thư viện : using UnityEngine.SceneManagement; - Thoát game: Application.Quit(); *Màn 1: + Code xử lý điều khiển game: Di chuyển Player với 4 phím A, D, W, S ( trái, phải, trên, dưới ) và bắn đạn với phím space ( phím cách ): *Chú thích: Như đã nói ở phần trên các phương thức áp dụng: Input.GetKey: Nhấn và giữ để thực thi. Input.GetKeyDown: Chỉ cần nhấn nút. Input.GetKeyUp: Nhấn rồi thả. Điều khiển AI tự động được khởi tạo, bay và bắn: Khởi tạo: InvokeRepeating( string name, float timebegin, float timedelay): Thực thi nhiều lần 1 hàm với thời gian bắt đầu ( timebegin ) và thời gian trì hoãn để thực thi tiếp ( timedelay ), tham số name là tên hàm cần thực thi. Instantiate( GameObject object, Vector3 position, Quaternion rotation): Hàm tạo bản sao 1 đối tượng với vị trí và xoay chỉ định theo tham số. Object: đối tượng cần tạo clone ( bản sao). Position: vị trí cần khởi tạo. Rotation: góc xoay. AI di chuyển và tạo đạn: Transform.Translate( Vector3 transition): di chuyển 1 đối tượng theo hướng nào đó, biến speed * Time.deltaTime chính là tốc độ di chuyển trên thời gian thực tính bằng giây. Destroy(this.gameObject) hoặc Destroy(gameObject): hủy đối tượng gắn script này với 1 điều kiện nào đó . Hàm Instantiate ở trên để tạo bản sao của đạn tại vị trí và góc xoay của địch (AI). Chú ý: Những đối tượng cần tạo bản sao phải tạo Prefabs cho đối tượng đó, thường là những đối tượng xuất hiện nhiều lần trong game. Để AI bắn đạn về phía người chơi cần xử lý tốc độ và hướng đạn: GameObject player = GameObjec.Find(“Player”): tìm kiếm đối tượng với tên Player và gán nó cho biến player để thao tác. Direction = player.transform.position – transform.position: biến direction kiểu Vector3 sẽ nhận giá trị là 1 vector hướng từ vị trí AI đến người chơi. Ở trên hàm Update() sẽ thực thi việc bắn đạn theo hướng vector direction với speed*Time.deltaTime ( tốc độ nhân với thời gian thực). Time.deltaTime : trả về thời gian game bắt đầu đến khi kết thúc frame cuối cùng, trả về đơn vị là giây theo thời gian thực. Định dạng hiển thị thời gian: SceneManager.GetActiveScene().buildIndex: trả về giá trị index kiểu int của scene hiện tại. *Màn Boss: Khi chuyển từ 1 scene sang một scene khác đối tượng sẽ bị hủy, vì thế để chuyển các đối tượng cần thiết sang màn boss này ta dùng hàm: DontDestroyOnLoad(gameObject); Ở màn boss này có 1 xử lý khá khó nữa mà em cần tham khảo đó là việc boss di chuyển lên xuống tuần hoàn: void Update () { Vector3 currentposition = Vector3.Lerp(upposition.position, downposition.position,Mathf.Cos(Time.time/Traveltime*Mathf.PI*2) * -.5f+.5f); GetComponent().MovePosition(currentposition); } Vector3.Lerp(): hàm cho phép ta di chuyển giữa 2 điểm. Đoạn code trên ta cần khởi tạo 2 đối tượng là Upposition và downposition làm điểm giới hạn di chuyển trên dưới của đối tượng. Ta có thể tăng hoặc giảm tốc độ di chuyển qua tham số Traveltime, traveltime càng lớn đối tượng di chuyển càng chậm. *Màn thua: Sau khi chỉ số thanh HP của người chơi = 0 thì sau vài giây sẽ chuyển qua màn này. Điểm chính trong scene này là việc lưu tên, tính tổng điểm của người chơi với nút Save scores. Vì PlayerPrefs có hạn chế trong việc lưu trữ và load dữ liệu giữa các màn nên ta sẽ lưu trữ dưới dạng File. Tạo 1 class tĩnh SaveLoadinfo với 2 hàm Save() và Load() , 1 List tĩnh chứa thông tin người chơi ( tên, điểm số ). Với việc thêm từ khóa static( tĩnh) giúp cho lập trình viên có thể truy xuất các biến và hàm của class này từ 1 class khác. Hàm Save(): Khởi tạo và ghi dữ liệu vào file. Hàm Load(): Kiểm tra xem file có tồn tại ko, nếu có thì load dữ liệu ra và gán cho 1 biến nào đó, đoạn code trên ta lưu vào1 list lên khi load cần gán giá trị cho list đó. Lớp scoreinfo là 1 đối tượng của list chứa thông tin người chơi như: tên, điểm số. *Màn khi chiến thắng: Cách xử lý tương tự như màn thua chỉ thêm hiệu ứng như pháo hoa với việc sử dụng Particle system. *Bảng xếp hạng: Những xử lý quan trọng trong phần này là về cơ sở dữ liệu, cách load dữ liệu từ file ra bảng, xếp hạng người chơi theo điểm số. Để show dữ liệu ra bảng thì trước hết cần có dữ liệu, ta gọi hàm Load() của class SaveLoadinfo: SaveLoadinfo.Load(). Xếp hạng người chơi theo điểm số: Vì dữ liệu lưu vào là 1 list nên ta có hàm Sort() dễ dàng sắp xếp thứ tự các đối tượng trong list theo 1 điều kiện nào đó. Hàm Sort() chỉ được thực hiện khi đối tượng là class scoreinfo thêm IComparable, hàm này sẽ so sánh giá trị đầu tiên với giá trị thứ 2 được thêm vào và giá trị nào lớn hơn sẽ được xếp lên trước. 3.2. Mục tiêu đề tài. - Đã nắm bắt được một số xử lý cơ bản trong Unity và sử dụng được 2 loại lưu trữ database trong bài là: PlayerPrefs và dạng file. - Mục tiêu : + Biết sử dụng nhiều loại database hơn để làm game trên Unity, nâng cao xử lý các hiệu ứng trong game : âm thanh, hình ảnh + Có thể làm nhiều thể loại game 2D, 3D trên Unity. 3.3. Tài liệu tham khảo * Một số link tham khảo : Kết Luận Cùng với sự phát triển kinh tế, xã hội của thế giới đó là nhu cầu giải trí ngày càng cao của con người. Một trong những nhu cầu giải trí đó là chơi game, một hình thức giải trí dành cho mọi lứa tuổi những lúc rảnh rỗi hay căng thẳng vì công việc. Là 1 lập trình viên hay những người có hứng thú với game nên tìm hiểu và làm ra 1 game mà mình mong muốn, điều này sẽ giúp cho đất nước ngày càng phát triển về kinh tế và tư duy của con người.

Các file đính kèm theo tài liệu này:

  • docxde_tai_tim_hieu_ve_game_va_cach_xay_dung_game_da_nen_tang_vo.docx
Tài liệu liên quan