UNITY
1. Nạp và hiển thị mô hình 3d
a) Đặt vấn đề
Game 3D đƣợc xây dựng từ nhiều mô hình 3D đƣợc đặt lên không gian 3 chiều sao cho hài hòa với nhau để tạo thành cảnh vật trong game. Do đó việc nạp và hiển thị đƣợc mô hình 3D trong game là vô cùng quan trọng.
Mô hình 3D đƣợc cấu tạo từ rất nhiều đa giác để tạo nên khối vật thể. Mô hình trong game Nhập vai có thể chia thành 2 loại: tĩnh và động. Mô hình loại tĩnh thƣờng là địa hình và các vật thể trang trí trên đó nhƣ đá, cây hoặc các bộ xƣơng động vật. Mô hình động thƣờng là mô hình nhân vật và các loại quái vật.
b) Cách giải quyết
Các mô hình 3D thông thƣờng đƣợc thiết kế sẵn bằng các phần mềm thiết kế 3D chuyên dụng nhƣ 3DS Max, Blender, Cinema 4D, ... Sau đó, mô hình sẽ đƣợc đƣa vào game engine để sử dụng.
Engine Unity hỗ trợ rất nhiều định dạng mô hình 3D khác nhau nhƣ: 3DS, OBJ, MAX, FBX, BLEND, MA, ... Tuy nhiên, khi import mô hình vào project thì Unity đều tự động chuyển mô hình đó sang định dạng FBX. Sau đó, mô hình sẽ đƣợc nạp sẵn các Component cần thiết và đƣợc chuyển thành một Prefab để có thể tái sử dụng nhiều lần.
Mô hình tĩnh có thể đƣợc nạp bằng cách kéo thả vào trong cửa sổ sau đó chỉnh sửa vị trí và kích thƣớc cho hợp lý. Đối với mô hình động một số vẫn có thể sử dụng kéo thả tuy nhiên đối với trƣờng hợp nhân vật di chuyển đến vị trí thích hợp quái vật mới xuất hiện thì ta phải sử lý bằng code.
Trƣớc tiên, ta tạo một file script và gắn nó vào một đối tƣợng game để đoạn script có thể thực thi. Trong đó ta sẽ dùng hàm Resources để tải mô hình và Instantiate để định vị trí.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 117
Hình V.1: Minh họa khởi tạo mô hình
Tuy nhiên để nạp một mô hình đúng vị trí đã chọn ta không sử dụng con số cụ thể mà dùng một số đối tƣợng đặt tên SpawnPoint để xác định vị trí trên bản đồ.
Mô hình nhân vật đƣa vào game đƣợc chia làm 3 loại: Generic, Humanoid, legacy. Trong đó, 2 loại Generic, Humanoid điều khiển chuyển động thông qua máy trạng thái gọi là Animator. Còn các chuyển động của Legacy đƣợc lƣu trong một thành phần gọi là Animation và đƣợc điều khiển thông qua các câu lệnh.
Mô hình Humanoid
Hệ thống chuyển động Mecanim đặc biệt rất thích hợp để làm việc với chuyển động cho các mô hình có khung xƣơng hình ngƣời. Một bƣớc cơ bản trong việc tạo ra chuyển động cho mô hình là thiết lập một ánh xạ giữa các cấu trúc xƣơng trong mô hình và cấu trúc xƣơng ngƣời đơn giản trong Mecanim; thuật ngữ này đƣợc gọi là Avatar.
Khi đƣa nhân vật có khung xƣơng giống con ngƣời thì đƣợc hỗ trợ thông qua Humanoid Animation. Hệ thống Mecanim sẽ cố gắn để làm phù hợp khung xƣơng hiện tại của mô hình với khung xƣơng Avatar.Trong nhiều trƣờng hợp, nó có thể làm điều này tự động bằng cách phân tích các kết nối giữa các xƣơng trong khung xƣơng.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 118
Hình V.2: Hình minh họa định dạng Animation
Khi đi vào cấu hình trình biên tập sẽ yêu cầu lƣu cảnh. Một khi bạn đã lƣu cảnh, bạn sẽ thấy một mới Avatar Cấu hình thanh tra, với một bản đồ xƣơng.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 119
Mô hình Legacy
Hệ thống chuyển động Legacy thích hợp để làm việc với chuyển động cho các mô hình có khung xƣơng đặc biệt mà việc điều khiển khung xƣơng không thông máy trạng thái. Unity sử dụng hệ thống chuyển động riêng của mô hình và cho khả năng tƣơng thích ngƣợc.Trƣớc tiên bạn cần phải chọn loại Legacy trong Animation Type nhƣ sau:
Hình V.4: Hình minh họa định dạng Legacy
Hình V.5: Hình minh họa cho nhãn Animation trong giao diện nạp mô hình
Mô hình Generic
Mô hình chuyển động không giống con ngƣời cũng đƣợc hỗ trợ mặc dù không có trong hệ thống Avatar và các tính năng khác. Trong hệ thống Mecanim,
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 120
hình ảnh động không giống con ngƣời đƣợc gọi là Generic Animations. Để bắt đầu làm việc với một khung xƣơng đặc biệt cần chọn Generic trong Animation Type.
Hình V.6: Hình minh họa định dạng Generic
c) Kết luận
Tùy vào trƣờng hợp cụ thể mà ta sử dụng cách nạp mô hình phù hợp với chức năng của nó.
2. Chuyển động m hình nhân vật 3D
a) Đặt vấn đề
Chúng ta đã load đƣợc mô hình 3D vào trong game, vậy làm sao để mô hình 3D này có thể chuyển động trong game.
b) Cách giải quyết
Trƣớc tiên mô hình 3D cần phải có sẵn animation bên trong. Khi import mô hình vào Unity, animation trong mô hình đƣợc tự động chuyển thành một AnimationClip. Điều này giúp animation này có thể dùng cho các mô hình khác trong project.
Trƣớc hết ta phải tạo AnimationClip từ animation có sẵn của mô hình. Có 2 loại mô hình 3D có sẵn animation:
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 121
Loại thứ nhất: mô hình 3D có chứa nhiều animation bên trong.
Hình V.7: Mô hình 3D bên trong chứa nhiều animation
Mô hình 3D trên sau khi import vào project game, bên trong đã có sẵn animation, mỗi animation sẽ đƣợc cắt ra thành một AnimationClip bên trong đối tƣợng game.
Loại thứ hai: mô hình 3D chỉ chứa một animation.
Hình V.8: Mô hình 3D chứa một animation
Trong mô hình trên, mỗi mô hình sau khi import có một AnimationClip duy nhất. Về bản chất hình dạng mô hình là nhƣ nhau, chỉ khác nhau animation. Vậy
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 122
làm sao chúng ta kết hợp các AnimationClip này vào một đối tƣợng game duy nhất. Unity quy định nhƣ sau:
Lấy một mô hình làm mô hình chính, có thể không cần animation kèm theo cũng đƣợc.
Các mô hình còn lại, tên phải có 2 phần cách nhau bởi „@‟, phần đầu phải trùng tên với mô hình chính đã chọn, phần thứ 2 sẽ là tên của animation.
Với cách đặt tên nhƣ vậy, khi đƣa các mô hình này vào project để sử dụng thì Unity sẽ tự động đổi tên animation mặc định trong mô hình thành tên trùng với phần tên mô hình nằm sau chữ „@‟. Lƣu ý là phải đổi tên cho mô hình từ bên ngoài project tức trên Windows vì nếu nhƣ chúng ta đổi tên trực tiếp trong project thì tên của animation của mô hình đó sẽ không bị thay đổi theo phần tên sau dấu „@‟.
Tiếp theo, để gọi thực hiện một AnimationClip trong một đối tƣợng ta dùng
hàm setAnimation() của thuộc tính animation trong GameObject. Đoạn code sau
đây đang đƣợc gắn vào đối tƣợng game cần chạy animation: setAnimation(“Idle”); AnimationClip có tốc độ mặc định là 1, có thể đặt speed bằng -1 để chạy ngƣợc animation.
c) Kết luận
Việc gọi thực hiện các animation của đối tƣợng là khá đơn giản. Thƣờng thì sẽ chọn loại mô hình có nhiều animation vì sẽ dễ dàng hơn cho ngƣời vẽ đồ họa. Tuy nhiên trong quá trình phát triển game cần thêm một số animation khác hoặc mô hình gồm những chuyển động có khung xƣơng và không có khung xƣơng thì sẽ thêm vào bằng cách 2. Ta vẫn có thể sử dụng song song 2 loại.
3. Tạo địa hình trong game
a) Đặt vấn đề
Trong game 3D, địa hình là thành phần không thể thiếu. Từ địa hình chúng ta có thể đặt các vật thể lên bề mặt tạo thành cảnh vật trong game. Thực chất, địa hình khi xây dựng xong là một mô hình 3D tĩnh có số lƣợng đa giác rất lớn cho nên ngƣời ta thƣờng chỉ load một phần của địa hình tùy theo góc nhìn của camera.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 123
b) Cách giải quyết
Unity cho ta 2 giải pháp lựa chọn là sử dụng Unity hoặc Modelling nhƣ các mô hình 3D khác.
Việc dựng hình cho địa hình nhƣ các mô hình khác là một công việc khá khó khăn và phức tạp bởi tính chất không đồng nhất về đơn vị kích thƣớc trong Unity với các phần mềm dựng hình 3D. Việc thiết kế các địa hình rộng lớn và phức tạp trong các phần mềm dựng hình 3D rất khó kiểm soát, đồng thời các thao tác nhập xuất và chỉnh sửa địa hình sau khi đã nhập vào Unity sẽ trải qua nhiều công đoạn phức tạp gây mất thời gian và tạo ra nhiều rủi ro. Lựa chọn này thƣờng đƣợc ƣu tiên với những địa hình có các tính chất nhƣ diện thích nhỏ và ít phức tạp với mục đích cuối cùng là nhằm tối ƣu hóa về mặt đồ họa của trò chơi.
Lựa chọn thứ 2 – sử dụng công cụ xây dựng địa hình đƣợc cung cấp sẵn của Unity là một lựa chọn cho hầu hết các dự án với lí do nhanh chóng, hiệu quả mà không phức tạp.
Terrains trong Unity cũng là một Game Object với Components cơ bản là Transform, Terrain và Terrain Collider. Trong đó Component Terrain là thành phần đặc biệt đáng chú ý. Đó thật ra là một script đã đƣợc xây dựng sẵn bởi Unity, script này hoạt động nhƣ một Editor có thể chạy trực tiếp trong quá trình thiết kế. Nó cung cấp cho chúng ta các công cụ:
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 124
Rise and lower the terrain height: Công cụ này cung cấp cho chúng ta tính năng thực hiện tạo độ cao hoặc sâu cho các khu vực trong địa hình.
Hình V.10: Set the terrain height.
Set the terrain height: Cho phép chúng ta xác định chính xác độ cao.
Hình V.11: Smooth the terrain height
Smooth the terrain height: Cho phép chúng ta làm cho địa hình đƣợc phẳng và liền mạch một cách tự nhiên hơn.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 125
Hình V.12: Paint the terrain texture
Paint the terrain texture: Với công cụ này, chúng ta có thể chọn nhiều texture sau đó vẽ phối hợp (sơn) lên bề mặt địa hình để tạo màu sắc, chất liệu cho địa hình.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 126
Hình V.13: Place trees
Place trees: Giúp chúng ta đặt hàng loạt các cây một cách ngẫu nhiên về số lƣợng, kích thƣớc và vị trí từ những mô hình cây mà chúng ta đã chuẩn bị.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 127
Hình V.14: Place plants, stones and other small foilage.
Place plants, stones and other small foilage: Tƣơng tự nhƣ Place trees, công cụ này cho chúng ta áp dụng đối với các thành phần nhỏ hơn trên địa hình nhƣ cỏ, những hòn đá nhỏ, …
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 128
Hình V.15: Setting for the terrain.
Setting for the terrain: Cho phép chúng ta tùy chỉnh các lựa chọn chung cho địa hình nhƣ độ chi tiết của cây và các đối tƣợng, các thông số của gió tác động đến địa hình, …
Các công cụ trên đều đƣợc sử dụng chủ yếu qua các thao tác tùy chọn số liệu và dùng chuột vẽ trực tiếp vào cửa sổ Scene. Sau khi phối hợp sử dụng các chức năng trên, chúng ta đã hoàn thành địa hình một cách đơn giản và nhanh chóng. Trong suốt quá trình phát triển trò chơi, chúng ta hoàn toàn có thể chỉnh sửa địa hình cũng bằng những công cụ này.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 129
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 130
Hình V.17: Địa hình dưới góc nhìn từ trên xuống
4. Chiếu sáng cảnh vật
a) Đặt vấn đề
Địa hình và cảnh vật trong game cũng nhƣ ngoài không gian thực cần phải có ánh sáng để mọi vật trong game rõ ràng và sáng sủa hơn cũng nhƣ tạo hiệu ứng bóng nhân vật và phản chiếu ánh sáng của vật thể.
b) Cách giải quyết
Để tạo ánh sáng mặt trời chiếu sáng toàn bộ cảnh vật ta sử dụng thành phần
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 131
hƣớng nhất định ảnh hƣởng lên toàn bộ cảnh vật trong game, giống nhƣ mặt trời ngoài đời thực.
Hình V.18: Cảnh vật được chiếu sáng và có bóng
c) Kết luận
Chiếu sáng làm cho địa hình nhìn thật hơn với nhiều mảng sáng tối khác nhau, mô hình nhân vật trông nổi và sâu hơn.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 132
5. Tạo hiệu ứng particle
a) Đặt vấn đề
Các hiệu ứng thƣờng gặp trong game nhƣ mƣa, tuyết rơi, khói, lửa, hiệu ứng phép,… sẽ làm cho game sinh động và ấn tƣợng hơn, nhất là với game 3D thì các hiệu ứng này càng cần thiết hơn. Các hiệu ứng này đƣợc gọi chung là hiệu ứng particle.
b) Cách giải quyết
Để làm đƣợc điều này, Unity hỗ trợ ngƣời dùng Particle Systems để tạo ra bất kỳ hiệu ứng particle nào mà ngƣời dùng mong muốn. Particle muốn hiển thị đƣợc phải có 3 thành phần chính quan trọng sau:
Particle Emitter: để sinh ra các hạt.
Particle Animator: để làm di chuyển các hạt theo thời gian.
Particle Renderer: để vẽ các hạt.
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 133
Hình V.20: Các thuộc tính của Particle System
Các thuộc tính của thành phần tạo hạt, Elipsoid Particle Emiter
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 134
Min Size / Max Size: Kích thƣớc nhỏ nhất/lớn nhất có thể của mỗi hạt tại
thời điểm sinh ra.
Min Energy / Max Energy: Thời gian sống nhỏ nhất/lớn nhất của hạt, tính bằng giây.
Min Emisson / Max Emisson: Số lƣợng tối thiểu/tối đa của hạt đƣợc phát ra, tính bằng giây.
World Velocity: Tốc độ bắt đầu của hạt theo các chiều x, y, z trong không gian.
Local Velocity: Tốc độ bắt đầu của các hạt trong cùng một vùng x, y, z.
Rnd Velocity: Vận tốc ngẫu nhiên của các hạt cùng chiều x, y, z.
Tangent Velocity: Vận tốc khởi đầu cho các hạt cùng chiều trên bề mặt
của Emitter.
Angular velocity: vận tốc góc của các hạt mỗi giây.
Rnd Angular velocity: vận tốc góc ngẫu nhiên của các hạt mới sinh ra.
Rnd rotation: bật/ tắt chế độ tạo góc quay ngẫu nhiên cho mỗi hạt.
Simulate in Worldspace: bật/tắt chế độ giữ cho hạt cố định ở không gian
toàn cục khi hiệu ứng di chuyển
OneShot: Nếu enable thì hiệu ứng hiện một lần rồi tắt, sau đó hiện lên lại. Nếu tắt thì
hiệu ứng hiện liên tục.
EllipsoidScale: Phép tỷ lệ của khối hiệu ứng.
Min Emitter Range: bán kính của các hạt theo hình cầu.
Các thuộc tính thành phần di chuyển các hạt Particle Animator:
Does Animate Color: bật/tắt chuyển màu của hạt.
Color Animation: Màu sắc của hạt, chu kỳ màu của hạt sẽ mất nhanh nếu hạt nào có
tốc độ nhanh hơn.
World Rotation Axis: Phép quay quanh các trục x, y, z không gian toàn
SVTH:
Nguyễn Đức Trung 1101707
Trần Minh Trung 1101708 135
Local Rotation Axis: Phép quay quanh các trục x, y, z không gian cục bộ.
Size Grow: làm cho các hạt thay đổi kích thƣớc theo thời gian.
Rnd Force: Sức gió ngẫu nhiên theo chiều x, y, z.
Force: Sức gió theo chiều x, y, z.
Damping: Sự tắt dần chuyển động của từng hạt.
Autodestruct: nếu kích hoạt, GameObject gắn liền với hiệu ứng sẽ bị hủy khi các hạt biến mất.
Các thuộc tính thành phần vẽ các hạt Particle Renderer
Cast Shadows: nếu kích hoạt các hạt sẽ có bóng.
Receive Shadows: nếu kích hoạt các hạt sẽ nhận bóng từ các vật thể khác.
Materials: Chất liệu của particle, có thuộc tính size và texture, texture để chứa các texture bên ngoài đƣa vào giúp hiệu ứng đẹp hơn.
Use Light Probes:
Light Probe Anchor: nếu đƣợc thiết lập, Renderer sẽ sử dụng
transform.position của nó để tìm ánh sáng thăm dò nội suy.
Camera Vlocity: lƣợng kéo dài đƣợc áp dụng cho các hạt dựa trên