วันศุกร์ที่ 23 พฤษภาคม พ.ศ. 2557

[สอน C# for Unity] ตอนที่ 6 : Transform หมุน ขยับ ปรับขนาด



จากตอนที่แล้วได้พูดถึงการดึงค่าตัวแปรและการเรียกใช้งานฟังชั่นจากใน component กันไปเรียบร้อยแล้ว ตอนที่ 6 นี้จะมาสานต่อจากตอนที่ 5 ด้วยการแนะนำ component สุดฮิต Transform ที่ทุก GameObject ต้องมี ให้ทุกท่านได้รู้จักและนำไปใช้กัน



Transform เป็น component ที่ใช้สำหรับจัดการ ตำแหน่ง การหมุนและขนาดของวัตถุ ซึ่ง component ที่เกี่ยวกับการเรนเดอร์ภาพจะต้องดึงค่าเหล่านี้มาใช้ในการวาดภาพบนจอให้ตรงกับตำแหน่ง ขนาดและการหมุนที่เรากำหนดไว้



ระบบพ่อลูก
transform สามารถจัดกลุ่มเป็นพวกๆได้โดยการเอาวัตถุอันนึงลากใส่อีกอันนึงจะทำให้วัตถุนั้นเข้าไปอยู่ข้างในเหมือนกับการจัดเรียง folder ของ PC - การเปลี่ยนค่า transform อะไรก็ตามจะส่งผลไปถึงวัตถุที่อยู่ด้านในด้วยเหมือนเวลาที่เราย้ายโฟลเดอร์นึงไป โฟลเดอร์และไฟล์ทั้งหมดในโฟลเดอร์นั้นก็จะถูกย้ายตามไปด้วย ใน unity เราจะเรียกวัตถุด้านในว่า child ส่วนวัตุที่ครอบอยู่เรียกว่า parent



Local / Global
จากระบบการจัดเรียงแบบ parent-child ของ transform ทำให้เกิดค่า transform 2 แบบ
  • Local เป็นค่าที่เปรียบเทียบกับ transform ของ parent
  • Global เป็นค่าที่เปรียบเทียบกับ origin หรือ จุด (0,0,0) ง่ายๆคือเลขเป็นยังไงก็เห็นเป็นยังงั้นเลย
  • มีปุ่มปรับการมองแกนระหว่าง global กับ local แบบในภาพ


ต่อไปผมจะยกตัวอย่างสิ่งที่มีอยู่ข้างใน transform นะครับ ทั้งหมดนี้มีตัวอย่างอยู่ใน unity doc ซึ่งจะมีคำอธิบายและตัวอย่างไว้ครบเลย เป็นภาษาอังกฤษ

ตัวแปรใน transform
  • เป็น Vector3 พิกัดตำแหน่งของวัตถุ
  • เป็นค่า global
  •  สามารถใส่ตำแหน่งใหม่ได้เลย
  •  transform.position = new Vector3(x,y,z);
  • เป็น Vector3 ที่บอกการหมุนของแกน x y z 
  • เป็นค่า global
  • หน่วยของตัวนี้จะเป็น องศา ถ้าใช้ rotation จะเป็นแบบอื่น
  • เป็นค่าขนาดในแบบ local
  • ของ global จะใช้   lossyScale
  • transform.forward/right/up - ทิศทางที่วัตถุหันไปด้านหน้าว่าหันไปด้านไหน
  • transform.parent - เข้าถึง transform ของ parent และดึงค่าข้างต้นทั้งหมดมาใช้ได้


ฟังชั่นเจ๋งๆใน transform (พร้อมตัวอย่าง :)
  • ใส่ค่าเป็น Vector3 ตามด้วยแกนที่เคลื่อนที่ว่าเคลื่อนที่ตามแกนวัตถุ(Space.Self)หรือแกน (0,0,0) (Space.World)
  • transform.Translate(new Vector3(1,0,0),Space.Self); 
  • การใส่ค่าเหมือนกับ transform แต่จะเปลี่ยนจากการเคลื่อนที่ตามแกนเป็นหมุนรอบแกน x y z แทน
  • transform.Rotate(new Vector3(0,2,0),Space.World); 
  • LookAt - ให้ด้านหน้าของวัตถุมองไปยังตำแหน่งที่กำหนด
  • ต้องใส่ค่าเป็น component transform ของวัตถุที่จะถูกมอง
  • public tranform target;
  • transform.LookAt(target); 
  • GetChild - ดึง transform ของวัตถุลูกมาใช้
  • ใส่เลขว่าจะดึง transform ของลูกตัวที่เท่าไหร่ เรียงลำดับตาม scene โดยเริ่มต้นจาก 0
  • transform.GetChild(0).position = new Vector3(0,0,0); 

ถ้าใครอยากทราบรายละเอียดมากกว่านี้ลองดูคลิปนี้นะครับ เกี่ยวกับค่า Vector ที่เราใส่ในฟังชั่นกันบ่อยๆ