โดยทั่วไปในการเขียนโปรแกรม ฟังก์ชันจะมีหน้าที่อยู่สองอย่างในเวลาเดียวกัน คือการดำเนินการทำให้เกิดอะไรบางอย่างขึ้นตามคำสั่ง เช่น move() คือสั่งให้ย้ายวัตถุ ส่วน polyCube() คือสร้างทรงสี่เหลี่ยม
ส่วนอีก หน้าที่หนึ่งของฟังก์ชันก็คือการคืนค่าตัวแปรบางอย่างกลับออกมา ซึ่งหน้าที่ตรงนี้จะคล้ายกับคำว่าฟังก์ชันในทางคณิตศาสตร์ เช่น f(x) = x+1 ในที่นี้ฟังก์ชัน f(x) มีค่าคืนกลับเป็น x+1
ฟังก์ชันในโปรแกรมมายา นั้นโดยส่วนใหญ่แล้วจะทำหน้าที่ดำเนินการคำสั่งต่างๆ แต่ว่าในขณะเดียวกันในตัวฟังก์ชันนั้นก็มักจะมีค่าคืนกลับมาด้วยเช่นกัน เพียงแต่บ่อยครั้งที่เราไม่ได้จำเป็นต้องใช้มัน จึงไม่จำเป็นต้องใส่ใจ
อย่างไรก็ตาม ก็มีบางครั้งที่อาจจำเป็นต้องใช้ค่าที่คืนกลับมานั้น จึงไม่อาจละเลยได้
ในบทที่ผ่านมาได้รู้จักฟังก์ชันที่สร้างรูปทรงต่างๆไปมากมายแล้ว เช่น polyCube(), polyPrism(), ฯลฯ
ฟังก์ชันเหล่านี้เมื่อใช้ไปแล้วก็จะเห็นว่ามีการคืนค่ากลับมา ซึ่งสังเกตได้จากแถบแสดงผลของสคริปต์อีดิเตอร์
เช่นพอพิมพ์
mc.polyCube(n='lukbat')
ลงไปแล้วรันขึ้นมา ก็มีข้อความขึ้นมาดังนี้
# 結果: [u'lukbat', u'polyCube1'] #
สิ่งที่อยู่หลังคำว่า 結果: ก็คือค่าที่คืนกลับมาหลังจากการรันฟังก์ชันนั่นเอง โดยจะเห็นว่าได้ค่าคืนกลับมาเป็นลิสต์ของสายอักขระ ๒ ตัว ซึ่งอันแรกเป็นชื่อของวัตถุที่เราตั้งไว้ และอีกอันเป็นชื่อของโหนดที่เก็บข้อมูลรูปทรงของวัตถุ
ส่วนที่เป็นชื่อคือด้านในเครื่องหมายคำพูด ' ' ส่วน u ที่อยู่ด้านหน้าเครื่องหมายคำพูดมีไว้แสดงถึงว่าเป็นสายอักขระแบบยูนิโค้ด UTF-8 (ในไพธอน 2 สายอักขระทั่วไปจะเป็น ASCII ถ้าไม่เติม u นำหน้า)
ค่าที่คืนกลับมาสามารถใช้ตัวแปรเพื่อรับค่าได้ เช่น
chue = mc.polySphere(n='songklom')
print(chue)
print(chue[0])
print(chue[1])
ในนี้เราเก็บค่าที่คืนกลับมาลงในตัวแปร chue เสร็จแล้วก็สั่งให้พิมพ์ค่าของ chue ออกมาก็จะได้ค่าลิสต์ของสายอักขระ ๒ ตัว ซึ่งสามารถอ้างอิงถึงแต่ละตัวได้โดยใส่ [] ตามด้วยเลข 0 และ 1 ซึ่งจะได้ผลเป็น songklom และ polySphere1 ตามลำดับ
ตัวแปรที่เก็บค่าชื่อของวัตถุอยู่นี้สามารถนำไปใช้ในฟังก์ชันต่างๆได้ เช่น
mc.move(10,10,10,chue[0])
แบบนี้ก็จะเป็นการย้ายวัตถุ เทียบเท่ากับการพิมพ์ mc.move(10,10,10,'songklom')
การใช้แบบนี้มีข้อดี เพราะป้องกันปัญหาที่อาจเกิดขึ้นเวลาที่ชื่อซ้ำ
เช่น ลองพิมพ์
mc.polySphere(n='songklom')
ลงไปใหม่อีกรอบโดยที่ยังไม่ได้ลบทรงกลมลูกเดิมทิ้ง คราวนี้จะได้ผลเป็น
[u'songklom1', u'polySphere2']
จะเห็นว่าค่าของ chue[0] เป็น songklom1 แทนที่จะเป็น songklom ตาที่เราตั้งไว้
กรณีที่เป็นแบบนี้ถ้าเราไปสั่ง mc.move(10,10,10,'songklom') มันก็จะทำการย้ายวัตถุก้อนแรก แทนที่จะเป็นวัตถุก้อนหลังที่เพิ่งสร้าง
ดังนั้นการเก็บชื่อลงไปในตัวแปรจะทำให้เราไม่ต้องสนใจว่าชื่อมันเป็นอะไร แก้ปัญหากรณีที่ได้ชื่อไม่ตรงกับที่ตั้ง
อีกทั้งเราอาจไม่มีความจำเป็นต้องตั้งชื่อวัตถุเลยก็ได้ แต่ใช้ตัวแปรนั้นแทนชื่อไปเลย
อนึ่งต้องระวังด้วยว่าตัวแปรที่เก็บค่าชื่อนั้นจะไม่มี ' ' ล้อม ในขณะที่ชื่อวัตถุเป็นสายอักขระไม่ใช่ตัวแปรต้องมี ' ' ล้อม
หากไม่ต้องการจะต้องมาพิมพ์ [0] หลังตัวแปรทุกครั้งเพื่อชี้ถึงชื่อวัตถุให้เพิ่ม [0] ต่อท้ายฟังก์ชัน เช่น
chue = mc.polySphere(n='songklom')[0]
แบบนี้ค่าของตัวแปร chue ก็จะเป็นชื่อของตัววัตถุ ส่วนชื่อโหนดที่เก็บข้อมูลรูปทรงของวัตถุก็จะไม่ถูกเก็บเอาไว้ในตัวแปร
หากตอนที่สร้างฟังก์ชันเราใส่แฟล็ก ch=0 ลงไป เท่ากับเป็นการไม่เก็บข้อมูลรูปทรงของวัตถุ กรณีนี้เราจะได้ตัวแปรคืนกลับมาแค่ตัวเดียว เช่น
mc.polyCone(ch=0,n='kruai')
จะได้ผลเป็น [u'kruai']
อย่างไรก็ตาม แม้จะออกมาแค่ค่าเดียวแต่ชนิดของข้อมูลก็ยังเป็นลิสต์อยู่ เวลาจะอ้างอิงถึงตัวสายอักขระที่เป็นชื่อก็ยังต้องใส่ [0] ต่อท้าย
chue = mc.polyCone(ch=0,n='kruai')[0]
ฟังก์ชัน rename() ก็อาจใช้ตัวแปรที่เก็บชื่อนี้ได้เช่นกัน เช่น
chue = mc.polyCube(w=1,h=1,d=1)[0]
mc.rename(chue,'lukbatleklekluknueng')
แบบนี้แล้วก็จะได้ลูกบาศก์ที่ชื่อ lukbatleklekluknueng มา
ฟังก์ชัน rename เองก็มีค่าคืนกลับเช่นกัน ค่าคืนกลับนั้นก็คือชื่อใหม่ของวัตถุที่เราใส่ไปนั่นเอง แต่ค่าที่ได้กลับมาจะเป็นตัวสายอักขระนั้นเลย ไม่ใช่ลิสต์ของสายอักขระ ซึ่งข้อนี้ต่างจากพวกฟังก์ชันสร้างรูปทรง
ข้อควรระวังอย่างหนึ่งที่ อาจจะเข้าใจผิดก็คือ ค่าที่ฟังก์ชันคืนกลับมานั้นไม่ใช่ตัวแปรออบเจ็กต์ที่แทนวัตถุนั้น แต่เป็นแค่ตัวแปรชนิดสายอักขระที่เป็นชื่อของวัตถุนั้น เท่านั้น ซึ่งชื่อนี้จะไปชี้ถึงตัววัตถุอีกที
ความจริงแล้วมีคำสั่งที่ใช้ ควบคุมวัตถุในลักษณะที่เป็นออบเจ็กต์อยู่เหมือนกัน แต่อยู่ในมอดูล pymel ซึ่งจะยังไม่พูดถึงตอนนี้ ลักษณะการใช้งานจะคล้ายกับ maya.cmds ที่ใช้อยู่แต่เน้นการจัดการในแบบของการเขียนโปรแกรมเชิงวัตถุ
ส่วนบางฟังก์ชันเช่นฟังก์ชัน move() นั้นจะไม่มีการคืนค่าใดๆกลับมาทั้งสิ้น เป็นฟังก์ชันที่มีหน้าที่สั่งการอย่างเดียว ดังนั้นถ้าเอาตัวแปรมารับค่าก็จะได้ตัวแปรที่ว่างเปล่า
นอกจากนี้แล้วในที่นี้จะขอพูดถึงหน้าที่อีกอย่างของฟังก์ชันคำสั่งสร้างรูปทรงต่างๆ ซึ่งนอกจากจะใช้สร้างแล้วยังสามารถใช้เพื่อดูค่าได้ด้วย ทำได้โดยการเติมแฟล็กไปอีกตัวคือ q (query)
แฟล็ก q ใช้เมื่อต้องการเอาข้อมูลของวัตถุที่สร้างไปแล้ว เมื่อใส่ q=1 หน้าที่ของฟังก์ชันจะเปลี่ยนไปจากปกติ รวมทั้งหน้าที่ของแฟล็กอื่นๆที่ใส่ลงไปพร้อมกันด้วย
ตัวอย่าง
return1 = mc.polyCone(r=10,h=15,n='kruaiyai')
return2 = mc.polyCone('kruaiyai',q=1,r=1)
return3 = mc.polyCone('kruaiyai',q=1,h=1)
print(return1)
print(return2)
print(return3)
จะได้ผลลัพธ์เป็น
[u'kruaiyai', u'polyCone1']
10.0
15.0
นั่นคือฟังก์ชัน polyCone ในบรรทัดแรกคืนค่ากลับเป็นชื่อของวัตถุและชื่อของโหนดตามที่อธิบายไปข้างต้น แต่ว่า polyCone ๒ บรรทัดล่างกลับให้ค่าคืนกลับมาเป็นตัวเลข
นั่นเพราะใน ๒ บรรทัดหลังมีการใส่แฟล็ก q=1 ลงไป ซึ่งเป็นการประกาศว่าเราใช้ฟังก์ชันนี้เพื่อถามหาข้อมูลของรูปทรง แทนที่จะใช้เพื่อสร้างรูปทรงเหมือนอย่างทุกที
ในกรณีนี้จะต้องทำการเพิ่มอาร์กิวเมนต์เข้ามาตัวหนึ่ง ซึ่งก็คือชื่อของวัตถุที่เราต้องการหาข้อมูล ในที่นี้คือ 'kruaiyai' ซึ่งเพิ่งถูกสร้างมาจากบรรทัดแรก
แต่จะไม่ระบุชื่อก็ได้ ในกรณีนั้นจะเป็นการถามหาข้อมูลของวัตถุที่ถูกเลือกอยู่ สำหรับกรณีในตัวอย่างนี้ที่จริงแล้วไม่ต้องใส่ 'kruaiyai' ก็มีค่าเท่ากันเพราะวัตถุถูกเลือกอยู่แล้ว
จากนั้นสิ่งที่ต้องใส่อีกอย่างก็คือแฟล็กที่เราอยากได้ข้อมูล ในที่นี้คือ r รัศมี และส่วนสูง h ตามลำดับ ซึ่งในกรณีนี้แฟล็กที่ใส่จะต้องการชนิดข้อมูลเป็นค่าจริงเท็จ แทนที่จะเป็นจำนวนจริงเหมือนกรณีทั่วไป
สามารถหาค่าได้เพียงทีละตัวเท่านั้น ดังนั้นหลังจากใส่ q=1 แล้วก็ให้ใส่แฟล็กที่ต้องการหาค่าเพิ่มเข้าไปอีกแค่ตัวเดียว
นอกจากที่กล่าวมาแล้วฟังก์ชันแต่ละตัวที่ยังไม่ได้พูดถึงก็มีค่าคืนกลับที่ต่างกัน ออกไปอีก ต่อจากนี้ไปจะกล่าวถึงเมื่อพูดถึงฟังก์ชันอื่นๆเพิ่มเติมต่อไปอีก
อ้างอิง