Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 32 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
32
Dung lượng
3 MB
Nội dung
Chương Lập trình Game 101 Bây bạn biết cách sử dụng Trình soạn thảo Unity sẵn sàng làm quen với Trình soạn thảo script MonoDevelop Đây hai công cụ phát triển game Trình soạn thảo Unity nơi bạn xây dựng game cách trực quan, nơi ghép nối bố cục cảnh bạn cách đặt đối tượng Còn MonoDevelop trình soạn thảo script nơi bạn viết mã nguồn Mã nguồn cho đối tượng game biết cách hành xử, ví dụ cách phản hồi thao tác đầu vào người chơi phản hồi lẫn Script mã nguồn bạn đưa vào game bạn liên kết với đối tượng game Trong chương bạn học cách tạo script, viết số mã nguồn đơn giản, sau liên kết script với đối tượng game Bạn cài đặt MonoDevelop với Unity Chương Có lẽ bạn thấy trình soạn thảo thư mục Applications Unity (Hình 2-1), bạn truy cập MonoDevelop trực tiếp từ Trình soạn thảo Unity Đây lựa chọn mặc định nằm mục External Script Editor mục Unity Preferences External Tools (Hình 2-2) Hình 2-1 Biểu tượng MonoDevelop.app menu Finder gói Unity tải 25 26 CHƯƠNG 2: Lập trình Game 101 Hình 2-2 Menu Unity Preferences Với dự án AngryBots mở sẵn, Bảng Project mở thư mục Assets Scripts Animation nhấn vào biểu tượng PlayerAnimation (Hình 2-3) Hình 2-3. Biểu tượng script PlayerAnimation Bảng Project Trong bảng Inspector bạn thấy thông tin bổ sung nội dung script PlayerAnimation (Hình 2-4) Bạn mở script MonoDevelop cách nhấn đúp vào file script nhấn nút Open… (Hình 2-5) CHƯƠNG 2: Lập trình Game 101 27 Hình 2-4. Biểu tượng script PlayerAnimation Bảng Inspector3 28 CHƯƠNG 2: Lập trình Game 101 Hình 2-5. Script PlayerAnimation sẵn sàng cho việc chỉnh sửa MonoDevelop AngryBots trò chơi thú vị dùng làm công cụ hữu ích để giới thiệu Unity MonoDevelop, đến lúc để bắt đầu học cách phát triển game riêng bạn Bạn đầu, tiếp tục đóng cửa sổ MonoDevelop lại Nếu có thông báo nhắc nhở, đừng lưu thay đổi Từ menu Trình soạn thảo Unity chọn mục File New Project để mở Project Wizard (Hình 2-6) Hình 2-6. Menu Unity File New Project Project Wizard Đừng lưu thay đổi AngryBots bạn nhắc nhở Hãy đặt tên cho dự án bạn nhấn Create Project Unity đưa vị trí tên dự án mặc định cho bạn Nút Set… mở cửa sổ Create New Project để bạn sử dụng làm phương tiện tùy chọn đặt tên đặt lại vị trí dự án bạn thấy tiện lợi Hãy đặt tên mang tính mô tả cho dự án bạn thích; bạn đặt lại tên sau Bạn thấy gói tài nguyên riêng thư mục Standard Packages tải với Unity, đừng CHƯƠNG 2: Lập trình Game 101 29 chọn gói thời điểm Hãy chắn tab Create new Project chọn, để thiết lập mặc định 3D, tạo dự án Dự án xuất mô tả Hình 2-7 Hình 2-7. Sự xuất dự án giao diện Trình soạn thảo Unity Chương cung cấp phần giới thiệu lập trình Nếu bạn có số kinh nghiệm lập trình đừng nên bỏ qua phần – ví dụ chứa số biến hàm dành riêng thường dùng Unity mà bạn sử dụng chương MonoDevelop Khi Unity tạo dự án mới, trình soạn thảo cung cấp cho bạn khung xương (skeleton) game Bộ khung xương có yếu tố cần thiết game nào, bạn nhấn vào nút Play game trống rỗng khởi động sau dừng lại bạn bỏ chọn nút Play Việc phát triển game “đắp thịt” vào khung xương với nội dung kỹ thuật số tương tác với đối tượng game, môi trường, script Ở menu cùng, chọn mục GameObject Create Empty (Hình 2-8) Hình 2-8 Menu Unity GameObject Create Empty 30 CHƯƠNG 2: Lập trình Game 101 Bạn thấy đối tượng GameObject liệt kê khung nhìn Hierarchy, gizmo chuyển đổi đối tượng khung nhìn Scene, chi tiết sâu mục Inspector (Hình 2-9) Hình 2-9. Đối tượng GameObject Trình soạn thảo Unity Trong mục Inspector, nhấn vào nút Add Component, sau chọn mục New Script từ menu Hãy đặt tên cho script HelloWorld, đảm bảo ngôn ngữ chọn Java Script, sau nhấn vào Create and Add để liên kết script với đối tượng game rỗng (Hình 2-10) Theo quy tắc tên nên mang tính chất mô tả, nên viết hoa chữ đầu không chứa ký tự đặc biệt hay khoảng trắng, dấu gạch cho phép sử dụng Hình 2-10. Cửa sổ xổ Add Component để thêm vào script Script liệt kê Inspector dạng thành phần đối tượng GameObject, bạn thấy biểu tượng script xuất thư mục Assets (Hình 2-11) CHƯƠNG 2: Lập trình Game 101 31 Hình 2-11 Script bảng Inspector dạng thành phần mục Assets Bảng Project dạng biểu tượng Nhấn lần lên biểu tượng để chọn xem nội dung script Inspector (Hình 2-12) Hình 2-12 Nội dung script bảng Inspector Bạn mở script MonoBehavior cách chọn mục Open Inspector nhấn đúp lên biểu tượng script thư mục Assets (Hình 2-13) 32 CHƯƠNG 2: Lập trình Game 101 Hình 2-13 Script HelloWorld sẵn sàng chỉnh sửa MonoDevelop Tương tự Unity, MonoDevelop có phím tắt bạn xem phím mục MonoDevelop Unity Preferences KeyBindings (Hình 2-13) Hình 2-14 Menu MonoDevelop Unity Preferences Key Bindings phím tắt CHƯƠNG 2: Lập trình Game 101 33 Khi bạn tạo script mới, Unity tự động thêm vào số thành phần #pragma strict thêm vào đầu tất script bạn Dòng báo cho trình biên dịch biết biến phải có khai báo kiểu, bạn học chi tiết khai báo kiểu chương Unity tạo hàm Start() Update() rỗng Bây giờ, tiếp tục xóa hàm Update() đi, nhớ xóa dấu đóng mở ngoặc kèm: function Update () { } Khi script liên kết với đối tượng game, hàm Start() gọi đối tượng game tham gia vào cảnh Trong dự án mẫu này, đối tượng game xuất cảnh, hàm Start() đối tượng gọi việc chơi game bắt đầu Hãy gõ dòng mã nguồn bạn hai dấu ngoặc hàm Start() để xem cách đối tượng hoạt động function Start () { print(“Hello World!”); } Nhấn ⌘+S để lưu lại, sau trở Trình soạn thảo Unity Trong bảng Project, chọn tab Console Đây nơi bạn thấy đầu xuất kết đoạn mã mà bạn vừa viết Trong khung nhìn Game chắn tùy chọn Maximize on Play bỏ chọn khung nhìn không che khuất bảng Console Bây tiếp tục nhấn vào nút Play Trong khung nhìn Console, bạn thấy dòng chữ “Hello World!” xuất hiện! (xem Hình 2-15.) Hình 2-15 Đầu “Hello World!” lệnh print bảng Console Một cách để in thông báo bảng Console sử dụng Debug.Log “Gỡ lỗi” (debugging) trình tìm sửa lỗi gọi với tên “lỗi” (bug) mã nguồn bạn Bạn học chi tiết cách sử dụng lớp Debug hàm (function) lớp Chương 10 Hãy thay đổi dòng mã bạn giống sau: function Start () { Debug.Log(“Hello World!”); } Lưu lại, chạy đoạn mã Trình soạn thảo Unity cách nhấn vào nút Play, nhìn vào bảng Console, bạn nhìn thầy dòng chữ “Hello World!” cũ kèm theo đoạn thích nhỏ khác (Hình 2-16) Hình 2-16. Đầu Hello World! Debug.Log bảng Console 34 CHƯƠNG 2: Lập trình Game 101 Phát triển Game trình học hỏi liên tục Các bậc tiền bối Unity tiếp tục bổ sung nhiều lực tảng để bạn cài đặt game Thậm chí nhà phát triển dày dạn phải cập nhật thay đổi bổ sung cách thường xuyên cách tham khảo tài liệu hỗ trợ cung cấp Mỗi dự án game có thứ mà bạn không quen dùng bạn muốn kiểm tra cẩn thận thay đổi Như cách tốt với bạn để học UnityScript tự tạo ví dụ sách Unity MonoDevelop, bạn làm quen với việc tham khảo tài liệu hỗ trợ cách nhanh thông qua việc sử dụng chúng Hãy dừng game lại trở đoạn script MonoDevelop (⌘+Tab phím tắt hữu ích bạn làm việc hai cửa sổ.) Nhấn vào đâu mục Debug, nhấn ⌘+‘ để mở phần tham khảo viết script Debug.Log trình duyệt web bạn (Hình 2-17) Hình 2-17. Mô tả Debug.Log phần Scripting Reference Unity Bạn thấy mô tả Debug.Log ghi thông báo tới bảng Console, theo sau dòng mã tương tự dòng mã bạn viết Có mô tả thứ hai với mã nguồn mẫu cung cấp cho bạn nhiều thông tin tình có lỗi Thay đổi dòng mã bạn cách thêm vào tham chiếu tới đối tượng gameObject: Debug.Log("HelloWorld!", gameObject); nhấn ⌘+S để lưu lại, nhấn vào Play Trình soạn thảo Unity Bây thông báo “Hello World!” xuất với số thông tin bổ sung khác Debug.Log tạo (Hình 2-18) 42 CHƯƠNG 2: Lập trình Game 101 Toán học cần thiết việc phát triển game, hứng thú đặc biệt việc giải toán để giải trí có tin tuyệt vời: Unity cung cấp hàng tá hàm toán học có sẵn cho bạn Nhưng hết việc thực siêu tốc phép tính máy tính làm tốt nhất, mục đích giúp cho việc phát triển game tổng thể bạn trở nên dễ dàng Mathf số chứa biến hàm toán học tiện ích Unity cung cấp Trong MonoDevelop, cập nhật mã nguồn bạn giống sau: #pragma strict function Start () { Debug.Log(Mathf.PI); } Nhấn vào Mathf.PI, sau nhấn ⌘+‘ để mở phần Unity Scripting Reference hàm (Hình 2-24): Hình 2-24. Mô tả hàm Mathf.PI từ mục Unity Scripting Reference Tại bạn thấy Mathf.PI biến tĩnh kiểu liệu float Giá trị pi số, biến tĩnh (static) tức biến không cho phép mã nguồn bạn thay đổi giá trị mà Mathf.PI chứa Nhớ bạn tạo hàm, kiểu đối số phải khớp với kiểu liệu mà hàm chấp nhận Phần tham khảo cung cấp cho bạn thông tin hữu ích kiểu liệu Mathf.PI float, kèm theo đoạn ngắn mã nguồn mẫu để minh họa cách thức sử dụng biến Khi chạy script bạn thấy kết hiển thị bảng console nhiều số thập phân mô tả phần tham khảo Điều bình thường – bạn không cần đến độ xác sử dụng game thông thường Nhấn vào chữ “Mathf” màu xanh da trời tiêu đề mục Scripting Reference để xem danh sách biến hàm Mathf đầy đủ (Hình 2-25) CHƯƠNG 2: Lập trình Game 101 43 Hình 2-25 Mô tả Mathf từ mục Unity Scripting Reference Làm tròn số hàm mà bạn chắn phải dùng phát triển game Đi tiếp cuộn xuống tới hàm Round chọn (Hình 2-26) Hình 2-26 Mô tả Mathf.Round từ mục Unity Scripting Reference Tại bạn thấy Mathf.Round hàm tĩnh chấp nhận kiểu liệu float dạng tham số, kèm theo sau số ví dụ Tiếp tục chép dán ví dụ vào trình soạn thảo MonoDevelop thử chạy xem Lưu ý thích cuối phần mô tả cho biết hàm Mathf.Round không làm tròn lên tất số kết thúc 5, mà tùy chọn làm tròn lên xuống, tùy theo cách cho kết cuối số chẵn Trong ví dụ thứ tư nêu, bạn thấy 10.5 làm tròn xuống thành 10 11 bạn 44 CHƯƠNG 2: Lập trình Game 101 nghĩ Khi bạn tra cứu thông tin mục Scripting Reference, dành thời gian đọc toàn phần mô tả - việc giúp bạn tránh tình tiết khó chịu sau thông qua hành vi mà Unity cố gắng muốn báo cho bạn trước Tuyệt vời! Bây bạn làm quen với kiến thức biến hàm Bạn dần quen với việc tham khảo mục Unity Scripting Reference sử dụng hàm có sẵn mà Unity cung cấp Đừng lo phần lý thuyết có chút mơ hồ; từ phần sau bạn có nhiều tập thực hành Hãy tiếp tục làm việc với ví dụ thực hành chúng, bạn sớm biết cách vận dụng ví dụ Biểu Thức Điều Kiện Ngoài hàm toán học, script bạn sử dụng hàm logic để định nghĩa luật game, chẳng hạn lần bắn trúng tiêu diệt quân địch, hay hành vi nhân vật dựa sức mạnh khả tích lũy được, dĩ nhiên điều kiện phải đáp ứng để có chiến thắng lớn Boolean Biểu Thức Điều Kiện Biến kiểu boolean có hai giá trị: true false Trong trình soạn thảo MonoDevelop, sửa script bạn sau: var skyIsClear : boolean = true; function Start () { Debug.Log(skyIsClear); } Chạy script bảng console hiển thị true Biến kiểu boolean thường dùng để quản lý “báo hiệu” (flag) trạng thái hay điều kiện Ví dụ, nói “Nếu trời quang chơi” Như cần kiểm tra xem mặt trời lên chưa, sau định dựa điều kiện Cập nhật lại đoạn mã hàm Start() thành: if (skyIsClear == true) { Debug.Log("I will go out and play"); } Đoạn mã dễ đọc Điều kiện mà bạn muốn kiểm tra đặt cặp dấu ngoặc đơn sau từ khóa if Nếu điều kiện đáp ứng, khối lệnh dấu ngoặc nhọn thực thi Lưu ý toán tử so sánh “bằng” ==, khác với toán tử gán = mà bạn dùng để thiết lập giá trị biến Tiếp tục chạy đoạn mã Tuyệt vời – Tôi phải chơi chút đây! Lưu ý Một lỗi phổ biến lập trình viên bắt đầu sử dụng dấu = thay dấu == biểu thức điều kiện CHƯƠNG 2: Lập trình Game 101 45 Chờ đã—nhưng điều xảy trời quang thời gian lúc buổi tối? Vậy không nên chơi trời tối Bên khai báo biến đầu tiên, thêm vào dòng thứ hai: var sunIsUp: boolean = true; Bây muốn nói, “Nếu trời quang mặt trời lên chơi” Sửa lại biểu thức điều kiện if bạn sau: if (skyIsClear == true && sunIsUp == true) { && toán tử logic AND (VÀ) Bây hai điều kiện phải đáp ứng để đoạn mã bên khối lệnh thực thi Toán tử logic OR (HOẶC) biểu diễn dấu ||, cách nhấn tổ hợp Shift+\ hai lần máy Mac OR có ý nghĩa từ mô tả: điều kiện điều kiện khác đáp ứng, mà không thiết phải đáp ứng hai, khối lệnh thực thi Nếu bạn muốn khối mã khác thực thi điều kiện định, bạn sử dụng nhiều lệnh if: function Start () { if (sunIsUp) { Debug.Log(“I will get out of bed”); } if (skyIsClear) { Debug.Log(“I not need an umbrella”); } } Vì hai biến thiết lập true, nên chạy script bạn thấy hai lệnh xuất bảng console Trong ví dụ này, mặt trời không lên trời không quang xảy Khi bạn muốn thực thi khối mã khác điều kiện số điều kiện trước đáp ứng bạn sử dụng lệnh else: function Start () { if (sunIsUp) { Debug.Log(“I will get out of bed”); } if (skyIsClear) { Debug.Log(“I not need an umbrella”); } else { Debug.Log(“I am staying in bed”); } } Các biến thiết lập true, script bạn chạy không làm khác, bạn thấy có nhiều cách để thử nghiệm loạt điều kiện để điều khiển trực tiếp gameplay Lệnh if so sánh giá trị số học Các toán tử so sánh khác (Bảng 2-2) mà bạn dùng gồm có toán tử , =, != ! biểu thị “không,” != toán tử so sánh có nghĩa “không bằng” 46 CHƯƠNG 2: Lập trình Game 101 Bảng 2-2. Định nghĩa toán tử so sánh Các toán tử so sánh Ý nghĩa == Bằng != Không < Nhỏ > Lớn = Lớn Biểu thức điều kiện switch-case làm việc thay cho chuỗi lệnh if-else bạn cần so sánh biến với nhiều giá trị khác Sửa script bạn sau: #pragma strict var diceRoll : float; function Start () { diceRoll = Random.Range(1, 6); switch (diceRoll) { case 1: print break; case 2: print break; case 3: print break; case 4: print break; case 5: print break; case 6: print break; default: print break; } } (“You rolled a 1!”); (“You rolled a 2!”); (“You rolled a 3!”); (“You rolled a 4!”); (“You rolled a 5!”); (“You rolled a 6!”); (“It’s your turn - roll!”); Đây tình bạn khai báo biến không gán giá trị Thay vào đó, gọi hàm Start(), biến diceRoll gán số sinh ngẫu nhiên Sinh số ngẫu nhiên hàm phổ biến khác game để xác định thứ vị trí đối tượng game xuất cảnh số lượng quân địch đợt công Từ dòng mã diceRoll = Random.Range(1, 6);, bạn đoán chuyện xảy ra, tiếp tục nhấn ⌘+‘ dòng Random.Range để xem mục Scripting Reference (Hình 2-27): CHƯƠNG 2: Lập trình Game 101 47 Hình 2-27. Mô tả hàm Random.Range từ mục Unity Scripting Reference Đúng bạn nghĩ, gọi tới hàm Start(), biến diceRoll gán số sinh ngẫu nhiên dựa hai đối số dấu ngoặc đơn, max Lưu ý tham số “inclusive” (tính giá trị hai tham số), không bạn phải sử dụng đối số khác để sinh số từ đến Tiếp theo, lệnh switch lấy giá trị gán cho biến diceRoll so sánh giá trị với giá trị số trường hợp, ví dụ từ tới Khi so khớp với giá trị mệnh đề case đó, khối lệnh theo sau thực thi Lệnh break kết thúc việc thực thi lệnh switch Sau mệnh đề case cuối cùng, bạn thấy lệnh default hoạt động tương tự lệnh else—lệnh thực giá trị giá trị case khớp với đối số truyền tới lệnh switch lúc đầu Vòng lặp Vòng lặp có tác dụng lặp lại dòng mã Bạn kiểm tra trạng thái nhóm đối tượng game, tạo đối tượng mà sử dụng dòng mã giống phần tử nhóm 48 CHƯƠNG 2: Lập trình Game 101 Vòng lặp for Để dẫn chứng vòng lặp for, trình soạn thảo MonoDevelop sửa mã nguồn sau: #pragma strict var targets : int = 4; function Start () { for(var i: int = 0; i < targets; i++) { Debug.Log("This is target #" + i); } } Hãy phân tích vòng lặp for này: (1) (2) (3) (4) for(var i: int = 0; i < targets; i++) (7) { (5) (6) (8) Debug.Log(“ This is target #” + i); (9) } Từ khóa for Khai báo biến số có kiểu integer gán giá trị khởi tạo Máy tính bắt đầu đếm từ thay 1, việc khiến chút thời gian để làm quen thường gây lỗi quên Dấu chấm phẩy tách thành phần thành phần thứ hai lệnh for Lệnh điều kiện Chỉ cần điều kiện đáp ứng, khối lệnh lặp thực thi Nếu điều kiện không đáp ứng, vòng lặp kết thúc thực thi chương trình nhảy đến lệnh theo sau vòng lặp, trường hợp dấu đóng ngoặc nhọn hàm Start() Dấu chấm phẩy tách thành phần thứ hai thành phần thứ ba lệnh for Bước tăng vòng lặp Bước tăng viết dạng i = i + 1, hay chí i += 1, nhiên toán tử tăng ++ có nghĩa cộng thêm dạng ký pháp viết tắt đẹp mắt Ở cộng vào biến số trước số ước lượng lệnh điều kiện lần lặp vòng lặp for Tương tự, biến số giảm sử dụng toán tử giảm (hoặc -=) Dấu mở ngoặc nhọn thân vòng lặp for Khối lệnh chứa dòng mã thực thi lần lặp vòng lặp for Dấu đóng ngoặc nhọn thân vòng lặp for Tương tự hàm, vòng lặp for kết thúc dấu đóng ngoặc nhọn dấu chấm phẩy Chạy script bạn, bạn thấy bạn có bốn lệnh mục tiêu phản ánh hiệu ứng “đếm từ giá trị 0“ (Hình 2-28) CHƯƠNG 2: Lập trình Game 101 49 Hình 2-28. Kết vòng lặp for qua bảng Console Vòng lặp while Vòng lặp while cho phép bạn viết mã linh hoạt vòng lặp có số lần lặp miễn kết biểu thức điều kiện true Thay đổi đoạn mã bạn sau: #pragma strict var numberOfTires : int = 0; function Start () { while(numberOfTires < 4) { Debug.Log(“I replaced an old tire on my car!”); numberOfTires++; } } Hãy phân tích đoạn mã này: (1) (2) while(numberOfTires < 4) (3) { (4) Debug.Log(“I replaced an old tire on my car!”); numberOfTires++; (5) } Từ khóa while Lệnh điều kiện Dấu mở ngoặc nhọn thân vòng lặp while Khối lệnh chứa đoạn mã thực thi lần lặp vòng lặp while Dấu đóng ngoặc nhọn thân vòng lặp while Giống vòng lặp for, vòng lặp while kết thúc dấu đóng ngoặc nhọn dấu chấm phẩy 50 CHƯƠNG 2: Lập trình Game 101 Một điểm khác lớn đây, nguyên nhân vấn đề, biểu thức điều kiện không đạt giá trị false, vòng lặp while tiếp tục chạy Đây lỗi biết đến với tên gọi vòng lặp vô hạn (infinite loop)—thực bạn không muốn game bị mắc phải lỗi đâu! Chạy đoạn script bạn thấy bạn đặt lên ô tô bốn lốp Bạn viết lại ví dụ đơn giản cách sử dụng vòng lặp for vòng lặp while thay cho Làm bạn cảm giác điểm khác tinh tế hai vòng lặp việc chọn sử dụng hay bạn tiếp tục áp dụng chúng kịch phát triển game thực Giống luật ngón tay cái, vòng lặp for dùng phổ biến tình xác định xác hơn, số vòng lặp thực xác định trước biến dùng cho giá trị khởi tạo, lệnh điều kiện biểu thức gia tăng biến Vòng lặp do-while Giống vòng lặp for, biểu thức điều kiện vòng lặp while không đạt giá trị true, khối lệnh không thực thi Tuy nhiên, có lúc bạn muốn khối lệnh chạy lần trước kiểm tra biểu thức điều kiện Vòng lặp do-while mở rộng dựa vòng lặp while cho phép bạn làm điều Sửa đoạn mã bạn sau: #pragma strict function Start () { var someCondition : boolean = false; { Debug.Log("Print something anyway"); } while(someCondition == true); } Ở điều bạn làm thiết lập biến someCondition giá trị false Sau từ khóa do, thân lệnh thực thi lần trước thực lệnh while, lệnh sau kiểm tra điều kiện Dựa khai báo biến, biểu thức điều kiện tính giá trị false chương trình thoát khỏi vòng lặp Chạy đoạn script bạn, dòng “Print something anyway” xuất lần bảng console mong đợi Sự khác vòng lặp for vòng lặp while có lẽ không rõ ràng lắm, bạn thực hành sử dụng vòng lặp ví dụ minh họa tới Sau bạn có cảm nhận tốt nhiều vòng lặp biết cần sử dụng kiểu vòng lặp ngữ cảnh phát triển game CHƯƠNG 2: Lập trình Game 101 51 Hình Học Tọa Độ Vector Bây lúc ngẫm lại chút Cuốn sách viết dành cho người bắt đầu, cụ thể người muốn hướng tới việc lấy toán cao cấp, mà người bình thường có hứng thú việc phát triển game dĩ nhiên việc bị coi người bình thường không khiến bạn dễ chịu Ngay bạn muốn hướng tới việc lấy toán học bạn cảm ơn thiên tài khiến công cụ phát triển phức tạp Unity trở nên thân thiện với người dùng hết Bạn không cần phải hiểu lý thuyết động đốt (combustion-engine) để lái ô tô, chẳng cần hiểu thiết kế mạch thể rắn (solid-state circuit) để sử dụng máy tính, hay điều mô tơ điện để sử dụng máy khoan Trên hết, bạn không cần phải thiên tài toán học để học phát triển game Bạn chắn thu nhiều nghĩ việc không làm bạn tổn hại đâu Tôi hứa Những nhà sáng tạo Unity hướng tới trực quan, tức dễ dùng dễ hiểu, họ thực thành công “Trực quan” có nghĩa có cảm giác hay trực giác cách thức hoạt động thứ đó, thứ mà bạn học nhanh cách thực chúng Việc thử nghiệm để xem điều xảy game bạn cách bạn phát triển trực giác Ngay không nhằm mục đích muốn đùa giỡn, không làm cách nói cho bạn biết lần sai khác điều muốn Unity làm cách Unity dịch đoạn script đem lại kết không mong muốn Nhưng máy tính chưa bốc cháy hay tan chảy cả, thường lần chạy hỏng buồn cười lỗi mắc phải phim Việc học phát triển game việc giải trí – tiêu khiển với đi! Hầu hết game, đặc biệt game 3D, chuyển động Vector Transform Unity tương ứng với cấu trúc lớp thường sử dụng, bạn tìm hiểu chúng sau Chúng mô tả vị trí đối tượng game cách chúng di chuyển Phần tóm lược ngắn gọn kiến thức hình học tọa độ toán học vector, với biến hàm mà Unity hỗ trợ, bạn tham khảo lại cần Khi bạn làm việc qua phần này, đừng phí thời gian dừng lại xem xét vấn đề toán học Tôi lại nhớ khoảng thời gian khó quên CalTech phải xử lý phần tính toán vector tắc nghẽn, bạn không cần làm – Unity xử lý giúp bạn Còn bạn nên tập trung vào việc học từ vựng việc biểu diễn vector hay hàm chúng không gian 3D thay tìm hiểu chất toán học chúng Unity sử dụng hệ trục tọa độ Đề (Cartesian coordinate system) để mô tả điểm không gian sử dụng trục x trục y vuông góc với (Hình 2-29) Gốc tọa độ điểm giao nhau, định nghĩa giá trị x y không hay (0, 0) Mỗi điểm không gian 2D mô tả qua giá trị x y theo cú pháp (x, y) 52 CHƯƠNG 2: Lập trình Game 101 y (-3.5, 3) (3, 2) (0, 0) x (1, -3) Hình 2-29. Hệ tọa độ Đề Các biến bạn dùng thời điểm gồm kiểu - int, float, boolean, string (chuỗi)—được phân loại kiểu liệu giá trị (value) chúng chứa giá trị cụ thể 8, hello, hay false Phiên biến kiểu giá trị phức tạp biết đến với tên cấu trúc (structure hay struct) Cấu trúc biến chứa tập hợp giá trị Vector2 cấu trúc chứa giá trị x y để mô tả vị trí vector không gian hai chiều (x, y) cho biết vị trí điểm không gian 2D Thông thường để mô tả đường thẳng hay vector bạn cần phải biết tọa độ điểm hai đầu đường thẳng, vector Unity mô tả dạng đường thẳng tương đối so với gốc tọa độ (0, 0), (x, y) thông tin đủ để mô tả vector (Hình 2-30) y (5, 4) (0, 0) x Hình 2-30. Hệ tọa độ Đề CHƯƠNG 2: Lập trình Game 101 53 Tìm thông tin Vector2 mục Unity Scripting Reference (Hình 2-31) Hình 2-31. Mô tả Vector2 mục Unity Scripting Reference Trong trình soạn thảo MonoDevelop, cập nhật lại mã nguồn giống sau: #pragma strict var myVector : Vector2 = Vector2(2, 3); function Start () { Debug.Log(myVector); } Nhấn Play để kiểm tra bạn nhìn thấy tọa độ (x, y) (2, 3) mà bạn gán cho biến myVector hiển thị bảng Console (Hình 2-32) Hình 2-32. Các giá trị tọa độ Vector2 (x, y) hiển thị bảng Console Unity cung cấp số biến tĩnh thường dùng mục Scripting Reference (Hình 2-33) Hình 2-33 Các biến tĩnh Vector2 mô tả mục Unity Scripting Reference Thay biến myVector Vector2.up lệnh Debug.Log để xác nhận bạn thu kết (0, 1) bảng Console Nếu bạn băn khoăn phần down hay left, bạn dùng -.up -.right để hiển thị phía ngược lại Độ dài vector gọi kích thước (magnitude) Bạn có lẽ nhớ không nhớ cách sử dụng Định lý Pitago (Pythagorean Theorem) hình học để tính khoảng cách hai điểm, Unity giúp bạn bạn cần tính khoảng cách đối tượng game với Vector2.magnitude Nhấn lên “magnitude” để xem qua phần mô tả Vector2.magnitude (Hình 2-34) 54 CHƯƠNG 2: Lập trình Game 101 Hình 2-34. Mô tả Vector2.magnitude từ mục Unity Scripting Reference Unity thực phép tính theo tọa độ x y vector, bạn thấy Unity áp dụng theo công thức với a, b c lớp hình học (Hình 2-35): x,y kích thước c b a x c == a2 + b2 kích thước == x2 + y2 Định lý Pitago Vector2.magnitude y Hình 2-35. Kích thước Vector2 bắt nguồn từ việc sử dụng Định lý Pitago Ví dụ, tìm c a = b = Đầu tiên, a2 = b2 = 16 Cộng vào để thu 25, sau lấy bậc hai 25 để thu độ dài c = Bây để Unity thực phép toán tương tự với Vector2(3, 4) Sửa đoạn script bạn sau: #pragma strict function Start () { var myVector : Vector2 = Vector2(3, 4); Debug.Log(myVector.magnitude); } Play để kiểm tra thấy bảng Console hiển thị kích thước Nhìn lại mô tả Vector2.magnitude lần Unity đưa cho bạn gợi ý nhỏ: muốn so sánh kích thước hai vector, bạn sử dụng sqrMagnitude Cả hai cách giúp bạn xác định xem kích thước vector nhỏ hay lớn vector khác, cách sử dụng sqrMagnitude hoạt động nhanh Bất kể mục Scripting Reference (tham khảo viết script) hay Diễn đàn Unity, bạn thường xuyên thấy góp ý tốc độ Game cần nhiều tài nguyên tính toán, khối tính toán riêng mà nhanh hiệu chức game bạn hoạt động trơn tru Ở cuối mục tham khảo viết script cho Vector2, bạn thấy số toán tử so sánh toán học hữu ích sử dụng (Hình 2-36) CHƯƠNG 2: Lập trình Game 101 55 Hình 2-36. Các toán tử Vector2 mô tả mục Unity Scripting Reference Không gian ba chiều điều khiển theo cách giống, có thêm giá trị biểu diễn chiều thứ ba Trục z vuông góc với trục x y Trong Unity, trục định hướng theo dạng: x đặt theo trục ngang từ phía trái phải hình máy tính, y đặt dọc theo chiều lên xuống hình, z độ sâu có chiều “đi vào” “đi ra” khỏi hình Theo hướng nhìn khác, mặt xz “sàn” y độ cao Gốc tọa độ (0, 0, 0), biểu diễn giá trị x, y, z Trong Unity điểm coi điểm mốc giới (world zero)—tức trung tâm giới game Giống bạn thấy không gian 2D, vector không gian 3D mô tả tương đối so với gốc tọa độ (Hình 2-37): y (4, 5, 3) (0, 0, 0) x Hình 2-37 Vector không gian 3D Vector3 cấu trúc lưu trữ giá trị x, y, z Hãy tìm Vector3 mục Unity Scripting Reference, bạn thấy vector gần tương tự Vector2 với biến tĩnh tiện ích thường dùng, thành phần x, y, z giá trị kích thước vector, nhiều hàm toán tử khác tương tự Để so sánh, xem qua Vector3.magnitude mục Unity Scripting Reference (Hình 2-38): 56 CHƯƠNG 2: Lập trình Game 101 Hình 2-38. Mô tả Vector3.magnitude mục Unity Scripting Reference Bây phép tính tính đến giá trị thành phần z Hãy cập nhật mã nguồn bạn để xem kích thước vector ba chiều sau: #pragma strict function Start () { var myVector : Vector3 = Vector3(3, 4, 12); Debug.Log(myVector.magnitude); } Chơi thử để kiểm tra, thấy bảng Console hiển thị kích thước 13 Lưu ý “Chơi,” “Chạy,” “Kiểm tra,” “Vào chế độ chơi,” “Chơi để kiểm tra,” “Chơi thử” thuật ngữ dùng thay đổi lẫn việc chạy cảnh khung nhìn Game trình soạn thảo Unity Bất kể bạn dùng vector 2D hay 3D, biến, hàm, toán tử chứa công cụ bản, đầy đủ để xử lý định liên quan đến gameplay dựa theo vị trí hướng chuyển động nhiều đối tượng game Bây bạn biết cách khai báo biến bao gồm kiểu cấu trúc Vector2 Vector3, cách gọi hàm để xử lý liệu chứa biến nơi để tìm hàm tiện ích Unity có sẵn Tóm tắt Bây bạn biết cách sử dụng trình soạn thảo script MonoDevelop Unity, đồng thời làm quen với lý thuyết thuật ngữ lập trình – bạn làm tốt lắm! Chương trang bị cho bạn tảng cần thiết cách đóng vai trò giới thiệu tài liệu tham khảo, để từ bạn thấy kết đoạn script viết đối tượng game trình soạn thảo Unity Tóm lại ý bạn đường đến với hiệu ứng âm thanh, hiệu ứng nổ hành động đấy—thật tuyệt vời! [...]... đây Unity sẽ giúp bạn khi bạn cần tính khoảng cách giữa các đối tượng game với Vector2.magnitude Nhấn lên “magnitude” để xem qua phần mô tả của Vector2.magnitude (Hình 2-34) 54 CHƯƠNG 2: Lập trình Game 101 Hình 2-34. Mô tả Vector2.magnitude từ mục Unity Scripting Reference Unity thực hiện các phép tính theo tọa độ x và y của vector, nhưng bạn có thể thấy Unity cũng áp dụng theo đúng công thức với. .. CHƯƠNG 2: Lập trình Game 101 Toán học cần thiết đối với việc phát triển game, nhưng đối với những ai không có hứng thú đặc biệt đối với việc giải các bài toán để giải trí thì tôi có một tin tuyệt vời: Unity cung cấp hàng tá các hàm toán học có sẵn cho bạn Nhưng trên hết việc thực hiện siêu tốc các phép tính vẫn là những gì máy tính có thể làm tốt nhất, và mục đích ở đây là giúp cho việc phát triển game. .. ích Unity có sẵn Tóm tắt Bây giờ bạn đã biết cách sử dụng trình soạn thảo script MonoDevelop của Unity, đồng thời làm quen với lý thuyết và thuật ngữ lập trình cơ bản – bạn làm tốt lắm! Chương này cũng đã trang bị cho bạn nền tảng cần thiết bằng cách đóng vai trò như một bài giới thiệu và tài liệu tham khảo, để từ đó bạn thấy được kết quả của đoạn script mình viết trên các đối tượng game trong trình. .. CHƯƠNG 2: Lập trình Game 101 nghĩ Khi bạn tra cứu bất cứ thông tin gì trong mục Scripting Reference, hãy dành thời gian đọc toàn bộ phần mô tả - việc này có thể giúp bạn tránh được các tình tiết khó chịu về sau thông qua các hành vi mà Unity đã cố gắng muốn báo cho bạn trước Tuyệt vời! Bây giờ bạn đã làm quen với những kiến thức cơ bản về biến và hàm Bạn cũng sẽ dần quen với việc tham khảo mục Unity Scripting... được thực thi Lưu ý rằng toán tử so sánh “bằng” là ==, khác với toán tử gán = mà bạn dùng để thiết lập giá trị của biến Tiếp tục và chạy đoạn mã này Tuyệt vời – Tôi phải ra ngoài chơi chút đây! Lưu ý Một trong các lỗi phổ biến của các lập trình viên mới bắt đầu là sử dụng dấu = thay vì dấu == trong biểu thức điều kiện CHƯƠNG 2: Lập trình Game 101 45 Chờ đã—nhưng điều gì sẽ xảy ra nếu trời vẫn quang... được mô tả dưới dạng các đường thẳng tương đối so với gốc tọa độ (0, 0), vì vậy (x, y) cũng là thông tin đủ để mô tả vector (Hình 2-30) y (5, 4) (0, 0) x Hình 2-30. Hệ tọa độ Đề các CHƯƠNG 2: Lập trình Game 101 53 Tìm thông tin về Vector2 trong mục Unity Scripting Reference (Hình 2-31) Hình 2-31. Mô tả Vector2 trong mục Unity Scripting Reference Trong trình soạn thảo MonoDevelop, cập nhật lại mã nguồn... thuật ngữ dùng cho việc ghép hai chuỗi độc lập với nhau thành một chuỗi duy nhất Hoặc diễn đạt theo một cách khác là bạn đã “cộng” các chuỗi với nhau, nhưng điều quan trọng là bạn học được các thuật ngữ chính xác khi được 40 CHƯƠNG 2: Lập trình Game 101 giới thiệu, và điều này sẽ giúp bạn thuận lợi hơn khi thực hiện tìm kiếm trợ giúp trên diễn đàn trong mục Unity Answers hoặc sáng suốt hơn khi rơi... một lỗi bằng cách bỏ qua dấu chấm phẩy ở cuối dòng lệnh và lưu lại Trong Trình soạn thảo Unity, bạn sẽ thấy một cảnh báo được hiển thị trong bảng console, kèm theo gợi ý trợ giúp từ Unity để sửa lỗi này (Hình 2-20) Hình 2-20. Cảnh báo lỗi trong bảng Console 36 CHƯƠNG 2: Lập trình Game 101 Nếu bạn cố tình nhấn vào Play, thì Unity sẽ liên tục nhắc bạn sửa lỗi này (Hình 2-21) Hình 2-21. Cảnh báo lỗi... Vòng lặp Vòng lặp có tác dụng lặp lại các dòng mã Bạn có thể kiểm tra trạng thái của một nhóm các đối tượng game, hoặc tạo những đối tượng mới mà trong đó sử dụng các dòng mã giống nhau đối với mỗi phần tử của nhóm 48 CHƯƠNG 2: Lập trình Game 101 Vòng lặp for Để dẫn chứng một vòng lặp for, trong trình soạn thảo MonoDevelop hãy sửa mã nguồn như sau: #pragma strict var targets : int = 4; function Start... khác giữa những điều tôi muốn Unity làm và cách Unity đã dịch các đoạn script của tôi đã đem lại những kết quả không mong muốn Nhưng máy tính của tôi chưa bao giờ bốc cháy hay tan chảy cả, và thường thì những lần chạy hỏng sẽ buồn cười như một lỗi mắc phải trong phim vậy Việc học phát triển game chính là việc giải trí – hãy tiêu khiển với nó đi! Hầu hết các game, đặc biệt là game 3D, đều là về chuyển động