Trong phần này, chúng ta sẽ học làm quen với Function (hàm). Function là một hoặc tập hợp nhiều dòng code dùng để thực hiện một nhiệm vụ cụ thể nào đó. Tập hợp những code này có thể được tái sử dụng nhiều lần trong script bằng cách gọi tên function. Bạn cũng có thể đưa thông tin vào function, và nhận kết quả trả về từ function.
Function cực kỳ hữu ích khi viết script. Bạn nên chuyển bất kỳ đoạn code nào mà có khả năng sẽ cần dùng nhiều thành function. Nó giúp bạn tránh phải viết lại những chức năng lặp đi lặp lại, và giúp code trở nên khoa học và dễ chỉnh sửa hơn. Trong 3ds Max, có những function được viết sẵn và tích hợp vào hệ thống, mà bạn chỉ việc gọi chúng để sử dụng.
Ví dụ, trong các bài viết trước, chúng ta đã biết một trong các function cơ bản của 3ds Max, đó là messageBox x. Function này giúp chúng ta hiển thị một thông báo trên màn hình, với x là nội dung chúng ta nhập. Khi nhập các function này trong MAXScript Editor, nó sẽ được highlight sang chữ màu. Điều này giúp chúng ta biết được đây là một function có sẵn trong hệ thống.
Hãy xem xét ví dụ sau.
try DestroyDialog MAXScript_Test catch() rollout MAXScript_Test "TEST" ( button btn_1 "Button 1" button btn_2 "Button 2" on btn_1 pressed do ( delete selection messageBox "Deleted!" b = box() ) on btn_2 pressed do ( delete selection messageBox "Deleted!" b = box() select b ) ) createDialog MAXScript_Test 100 100
Đoạn code phía trên sẽ tạo ra một dialog với 2 nút bấm. Hãy đọc lại phần 2 nếu bạn chưa quen với những dòng này. Ở đây chú ý phần in đậm. Nó là chức năng của 2 nút bấm. Với nút btn_1, nó sẽ xóa những gì đang chọn (delete selection), hiển thị thông báo “Deleted!” (messageBox), và sau đó tạo ra một khối box ở gốc tọa độ với lệnh box().
Lưu ý rằng box() là một function có sẵn có 3ds Max. Lệnh này dùng để tạo ra 1 khối box cơ bản, kích thước là 25x25x25mm, nằm ở gốc tọa độ. Thực ra, bạn có thể viết box() thay vì b = box(). Tuy nhiên, ở đây tôi cần định danh khối box để gọi lại khi cần, bằng cách gán biến b cho khối box vừa tạo ra. Việc này để phục vụ cho chức năng của btn_2.
Chúng ta thấy rằng nút bấm btn_2 có code gần giống hệt nút bấm đầu tiên. Nó khác ở lệnh cuối cùng. Sau khi tạo khối box, btn_2 sẽ chạy thêm lệnh select b để chọn khối box chúng ta vừa tạo. Hãy chạy thử script và bấm từng nút để xem kết quả.
Trong code phía trên, nếu chúng ta muốn đổi nội dung thông báo “Deleted!” thành “Đã xóa!”, chúng ta sẽ phải đổi nó ở 2 nơi. Trường hợp này, việc edit thủ công không gây nhiều trở ngại. Nhưng với những script mà có hàng chục, hàng trăm chức năng lặp lại, chúng ta sẽ mất rất nhiều công sức để chỉnh sửa hết.
Trong ví dụ này, chúng ta có thể khiến code script khoa học hơn, bằng cách sử dụng function. Hãy thử chỉnh sửa đoạn code trên lại như sau:
try DestroyDialog MAXScript_Test catch() rollout MAXScript_Test "TEST" ( button btn_1 "Button 1" button btn_2 "Button 2" function tao_khoi_box = ( delete selection messageBox "Deleted!" b = box() return b ) on btn_1 pressed do ( t = tao_khoi_box() ) on btn_2 pressed do ( t = tao_khoi_box() select t ) ) createDialog MAXScript_Test 100 100
Hãy để ý đoạn code được in đậm. Đây là công thức để tạo ra 1 function cơ bản. Bắt đầu với từ khóa function, sau đó là tên function, và cuối cùng là tập hợp code của bạn trong cặp dấu ngoặc đơn.
Ở ví dụ trên, tôi đã tạo ra function là tao_khoi_box. Khi cần dùng function này, tôi có thể viết tao_khoi_box(). 3ds Max sẽ tự động thay thế từ khóa này bằng code trong dấu ngoặc đơn của function. Khi chạy function này, 3ds Max sẽ lại xóa những gì đang chọn, hiển thị thông báo, tạo ra khối box.
function tên_function = ( -- code của bạn ở đây... )
Chạy thử lại script phía trên và bấm thử từng nút. Bạn sẽ thấy rằng script vẫn hoạt động bình thường như code ban đầu của chúng ta. Lúc này, nếu muốn đổi nội dung của thông báo, tôi sẽ chỉ cần cập nhật code của function tao_khoi_box, các nút bấm sẽ được tự động cập nhật.
Thêm một điều nữa, bạn có để ý rằng ở cuối function có lệnh return không? Nó dùng để trả về 1 kết quả bạn chọn được tính toán trong function. Nếu tôi viết tao_khoi_box(), function sẽ vẫn trả về kết quả là khối box vừa tạo, tuy nhiên kết quả đấy sẽ không được sử dụng. Bằng việc dùng lệnh t = tao_khoi_box(), tôi gán t cho kết quả mà function tao_khoi_box() trả về, mà cụ thể ở đây là khối box vừa tạo. Khi này tôi có thể dùng lệnh select t trong btn_2.
Lưu ý rằng bạn có thể viết tắt chỉ là b thay vì return b và fn thay vì function. Tuy nhiên, tôi khuyên bạn nên viết dạng đầy đủ của nó để đọc được dễ dàng hơn. Điều này rất có ích với những người mới bắt đầu với MAXScript.
Trong ví dụ trên, chúng ta không đưa thông tin gì vào function, mà chỉ nhận kết quả của nó. Bây giờ chúng ta sẽ cùng xem xét 1 ví dụ khác.
messageBox (250 as string) messageBox (428 as string) messageBox (553 as string)
Trong ví dụ trên, 250, 428, 553 là các con số nguyên. Nếu bạn viết messageBox 250, script sẽ báo lỗi, vì messageBox chỉ có thể hiển thị ký tự – văn bản. Khi viết (250 as string), chúng ta đã chuyển 250 thành “250”, tức là một văn bản. Lúc này lệnh messageBox mới hoạt động được. Điều này rất bất tiện nếu phải dùng nó liên tục để trả kết quả về màn hình. Chúng ta có thể viết 1 function để giải quyết vấn đề trên.
function mess_box input = messageBox (input as string) mess_box 250 mess_box 428 mess_box 553
Hãy chạy thử script trên. Nó đã hoạt động, và giờ bạn có thể dùng mess_box thay cho lệnh messageBox mà không lo nó sẽ bị lỗi. Bạn có thấy rằng lần này phía sau tên function có thêm từ input không? Đây là thông tin mà chúng ta sẽ nhập vào trong function. Khi tôi viết mess_box 250, 3ds Max sẽ hiểu là chạy function mess_box với giá trị nhập vào là 250. Tức 250 sẽ thay thế input, và lệnh mess_box 250 sẽ được 3ds Max dịch thành:
messageBox (250 as string)
Bạn có thể đổi input thành bất kỳ từ khóa hoặc ký tự nào bạn muốn. MAXScript cũng không giới hạn số biến nhập vào. Thêm function plus_box vào dưới function mess_box và chạy thử script.
function mess_box input = messageBox (input as string) function plus_box x y = ( z = x + y mess_box z ) plus_box 15 20
Script sẽ hiển thị thông báo trên màn hình: 35. Function plus_box có tác dụng cộng hai số chúng ta nhập vào, và sau đó gọi function mess_box để biến kết quả thành văn bản và hiển thị thông báo trên màn hình. Chúng ta đã “lồng” một function vào một function khác, giống như lồng lệnh box() trong tao_khoi_box(). Hãy xóa lệnh plus_box 15 20 và thử với 2 lệnh sau:
plus_box "test" "thu" plus_box "so" 1
Trong lệnh đầu tiên, function đã hoạt động hoàn hảo. Kết quả trả về là “testthu”. Ở lệnh số 2, script báo lỗi trong listener. Bởi vì phép cộng 1 văn bản (string) và số nguyên (integer) đã không thực hiện được. Đây cũng là điều bạn cần cẩn thận khi khai báo biến, hãy kiểm soát giá trị nhập vào biến là loại gì.
Trong phần này, bạn đã học được cách viết 1 function cơ bản nhất. Bài tập của bạn là áp dụng nó và tạo ra một script có giao diện gồm 10 nút. Hãy làm cho chúng có tác dụng giống hệt nhau, tuy nhiên thông báo trả về sẽ khác nhau.
Chúc các bạn thành công, và hẹn gặp lại trong các phần tới.