จากตอนที่แล้วได้พูดถึงการดึงค่าตัวแปรและการเรียกใช้งานฟังชั่นจากใน 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
- transform.position - ค่าตำแหน่ง
- เป็น Vector3 พิกัดตำแหน่งของวัตถุ
- เป็นค่า global
- สามารถใส่ตำแหน่งใหม่ได้เลย
- transform.position = new Vector3(x,y,z);
- transform.eulerAngles - ค่าการหมุน
- เป็น Vector3 ที่บอกการหมุนของแกน x y z
- เป็นค่า global
- หน่วยของตัวนี้จะเป็น องศา ถ้าใช้ rotation จะเป็นแบบอื่น
- transform.localScale - ขนาดของวัตถุ
- เป็นค่าขนาดในแบบ local
- ของ global จะใช้ lossyScale
- transform.forward/right/up - ทิศทางที่วัตถุหันไปด้านหน้าว่าหันไปด้านไหน
- transform.parent - เข้าถึง transform ของ parent และดึงค่าข้างต้นทั้งหมดมาใช้ได้
ฟังชั่นเจ๋งๆใน transform (พร้อมตัวอย่าง :)
- Translate - เคลื่อนย้าย
- ใส่ค่าเป็น Vector3 ตามด้วยแกนที่เคลื่อนที่ว่าเคลื่อนที่ตามแกนวัตถุ(Space.Self)หรือแกน (0,0,0) (Space.World)
- transform.Translate(new Vector3(1,0,0),Space.Self);
- Rotate - หมุน
- การใส่ค่าเหมือนกับ 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 ที่เราใส่ในฟังชั่นกันบ่อยๆ