feathure-moveable-object

ในโปรเจกต์นี้เราจะทำให้ Object อันหนึ่งที่อยู่ใน Level มีการเคลื่อนไปมา แนวคิดในการสร้างคำสั่งก็คือเราจะดึงค่าคุณสมบัติ Transform ของ Object ออกมา แล้วทำการปรับเปลี่ยนค่า Location ให้ใหม่ แล้วกำหนดกลับไปให้ Object คุณสมบัติ Transform ใหม่นี้ก็จะทำ Object มีการย้ายตำแหน่งตามค่าที่ถูกกำหนด ซึ่งการปรับเปลี่ยนค่าดังกล่าวจะให้เกิดขึ้นทุกๆ Frame ของการแสดงผลหน้าจอ

ในวิดีโอนี้จะแสดงขั้นตอนทั้งหมด หากต้องการรายละเอียดมากขึ้นสามารถอ่านเนื้อหาที่ต่อจากวิดีโอนี้


ขั้นเตรียมการ

ในเบื้องต้นให้ทำการสร้าง project โดยเลือก Template เป็น ชนิด First Person และตั้งค่าให้เป็น Blueprint

จากนั้นสร้าง  Test Object โดยไปที่แท็บ Place Actor ในหน้าต่างโปรแกรม แล้วเลือก Basic จากนั้นคลิกเลือก Cylinder แล้วลากไปวางใน Viewport

place-test-object

object-test

กำหนดคุณสมบัติ Object เป็น Moveable

เนื่องจาก Test Object ที่เราสร้างขึ้นมา ค่า Default ที่โปรแกรมกำหนดไว้จะเป็นแบบ Static (หยุดนิ่ง) หากต้องการให้ Test Object เคลื่อนที่ได้นั้น ต้องไปกำหนดค่าให้เป็นแบบ Moveable (เคลื่อนที่) ก่อน

เริ่มจากการคลิกเลือก Cylinder ใน Viewport แล้วไปที่แท็บ Details จากนั้นคลิกที่ปุ่ม Blueprint/Add Script

blueprint-script-build

ทำการตั้งชื่อ Blueprint ซึ่งผู้อ่านสามารถตั้งชื่อได้ตามต้องการ ในที่นี้จะใช้ชื่อ CylinderTarget_Blueprint

new-class

เมื่อหน้าต่าง Blueprint ปรากฏขึ้นมาให้ ให้ไปที่แท็บ Components ซึ่งอยู่ทางด้านซ้ายมือของหน้าต่าง ให้คลิกเลือก StaticMeshComponent จะสังเกตุได้ว่าแท็บ Details ที่อยู่ทางด้านขวาของหน้าต่างนั้นจะแสดงรายละเอียดต่างๆ ขึ้นมา

object-test-details

ไปที่แท็บ Detailas ทางด้านขวามือ ในส่วนของ Transform กำหนด Mobility ให้เป็น Moveable

change-moveable

สร้าง Variable ให้ Test Object

เราจะทำการสร้างตัวแปร 2 ตัว ให้กับ Test Object โดยตัวแปรตัวแรกจะมีชื่อว่า speed จะใช้เก็บค่าความเร็วการเคลื่อนที่ ส่วนตัวที่สองมีชื่อว่า direction ใช่เก็บค่าทิศทางการเคลื่อนที่

ให้ไปที่แท็บ My Blueprint ซึ่งอยู่ใต้แท็บ Components อยู่ของหน้าต่าง Blueprint ไปที่หมวดหมู่ Variable ซึ่งจะมีเครื่องหมาย (+) อยู่ทางด้านขวามือ ในการเพิ่มตัวแปรให้เราคลิกที่เครื่องหมาย (+)

add-var-speed

ให้ไปที่แท็บ Details เราจะทำการกำหนดคุณสมบัติให้กับตัวแปรของเรา ดังนี้

Variable Name : speed

Variable Type : Float (จำนวนที่มีทศนิยม)

Instance Edittable : Check (ทำให้ค่าของตัวแปรนี้สามารถเปลี่ยนแปลงจากภายนอกได้)

จากนั้นให้ทำการ complie จะปรากฏหมวดหมู่ Default Value ขึ้นในด้านล่างสุดของแท็บ Details ให้เรากำหนดค่าเป็น 200 ซึ่งจะค่าเริ่มต้นของตัวแปร speed

var-speed-details

ทำการเพิ่มตัวแปรตัวที่สอง และให้กำหนดคุณสมบัติดังนี้

Variable Name : Direction

Variable Type : Vector (ปริมาณที่มีขนาดและทิศทาง)

Edittable : Check

ให้เรากำหนด Default Value ของแกน Y เป็น -10.0

var-direction-details

Script คำนวณทิศทาง

ในหน้าต่าง Blueprint ให้ไปที่แท็บ Event Graph คลิกเลือกตัวแปร Direction ในหมวด Variable  แล้วลากมาวางลงใน graph เลือกเป็น Get โหนดนี้จะเป็นการอ่านค่าจากตัวแปร Direction

get-var-direction

ทำการเพิ่มโหนดที่ชื่อว่า Normalize ซึ่งโหนดนี้เวลาที่เราค้นหามันจะอยู่ในหมวดที่ชื่อว่า Vector โหนด Normalize จะทำหน้าที่ในการแปลงเวกเตอร์ทั่วไปให้เป็นเวกเตอร์หนึ่งหน่วย (Unit Vector)

จากนั้นทำการเชื่อมโหนดทั้งสองเข้าหากัน

add-normalize-node

คำสั่งชุดนี้ก็จะเป็นการนำค่าจากตัวแปร Direction ซึ่งเป็นเป็นค่าแบบเวกเตอร์ (x:0, y:-10, z:0) มาการเปลี่ยนเป็นเวกเตอร์หนึ่งหน่วย (x:0, y:-1, z:0) โดยโหนด Normalize ซึ่งค่าที่ได้นี้จะนำไปใช้ในการกำหนดทิศทาง


Script คำนวณระยะทาง

คลิกเลือกตัวแปร Speed ในหมวด Variable แล้วลากมาวางลงใน graph เลือกเป็น Get โหนดนี้จะเป็นการอ่านค่าจาก Speed

ทำการเพิ่มโหนดที่ชื่อว่า Get World Delta Second โหนดนี้จะให้ค่าเวลาเป็นวินาทีของผลต่างเวลาที่แต่ละ Frame แสดงผลห่างกัน

เพิ่มโหนด x (การคูณ) ในการค้นหาให้พิมพ์ * (ดอกจัน) แล้วเลือกเป็นแบบ Float * Float โหนดนี้จะเป็นการนำเอาจำนวนที่มีทศนิยมมาคูณกัน

จากนั้นทำการเชื่อมโหนด Speed และ Get World Delta Second เข้าหาโหนด X

add-x-node

คำสั่งชุดนี้ก็จะเป็นการนำค่าจากตัวแปร Speed มาคูณค่าเวลาที่ได้จากโหนด Get World Delta ผ่านทางโหนด X ซึ่งผลลัพธ์ที่ออกมาก็จะได้ระยะที่ Test Object ต้องเคลื่อนที่ในแต่ละ Frame


Script คำนวณเวกเตอร์ระยะทาง

เพิ่มโหนด X (การคูณ) เลือกเป็นแบบ Vector * Float โหนดนี้จะเป็นการนำเอาจำนวนที่เป็นเวกเตอร์กับจำนวนที่มีทศนิยมมาคูณกัน

จากนั้นให้เชื่อมโหนด Normalize กับโหนด X (Float * Float) เข้ากับโหนด x (Vector * Float)

add-x-vec-float

คำสั่งชุดนี้ก็จะเป็นการนำเอาเวกเตอร์ที่ใช้แสดงทิศทางจากโหนด Normalize มาคูณกับค่าระยะทางจากโหนด X (Float * Float) โดยใช้โหนด x (Vector * Float) ซึ่งผลลัพธ์ที่ออกมาก็จะได้เวกเตอร์ของระยะทาง (x:0, y:-200, z:0) ที่ Test Object ต้องเคลื่อนที่ในแต่ละ Frame


Script หาตำแหน่ง Object

คลิกเลือก StaticMeshComponent ลากไปวางลงใน graph เราจะได้โหนดที่เป็นตัวแทนของ Test Object ซึ่งเราจะสามารถดึงเอาค่าคุณสมบัติต่างๆ มาใช้งานได้


add-staticmesh-node

เพิ่มโหนด Get World Transform ลงใน graph โหนดนี้จะทำการดึงเอาค่าคุณสมบัติ Transform ของ Object ได้แก่ Ratation (การหมุน) Scale (การลด/ขยายขนาด) Location (ตำแหน่ง)

add-get-worldtrasform-node

เพิ่มโหนด Break Transform โหนดนี้จะทำการแยกค่าคุณบัติ Tranform ที่ได้จากโหนด Get World Transform ออกตามรูปแบบคุณสมบัติ

จากนั้นทำการเชื่อมโหนดทั้ง 3 เข้าด้วยกัน

add-breaktransform-node

คำสั่งชุดนี้จะเป็นการหาตำแหน่งของ Test Object โดยการใช้โหนด Get World Transform ดึงค่าจากโหนด StaticMeshComponent  ซึ่งค่าที่ได้จะเป็นคุณสมบัติ Transform ของ Object จากนั้นทำการแยกค่าออกมาตามรูปแบบคุณสมบัติ โดยใช้โหนด Break Transform


Script คำนวณตำแหน่งให้ Object เคลื่อนที่

เราจะนำเอาเวกเตอร์ระยะทางที่เราหาไว้ มารวมเข้ากับค่าตำแหน่งของ Test Object ผลลัพธ์ที่ได้ก็คือตำแหน่งใหม่ที่ Test Object จะเคลื่อนที่ไป

เพิ่มโหนด + (การบวก) เลือกเป็นแบบ Vector + Vector โหนดนี้จะทำการรวมค่าที่เป็นเวกเตอร์เข้าด้วยกัน

จากนั้นเชื่อมต่อโหนด x (Vector * Vector) และ Output Pin ที่ชื่อว่า Location ของโหนด Break Transform เข้ากับโหนด + (Vector + Vector)

connect-all-node

เพิ่มโหนด Make Transform ลงใน graph โหนดนี้จะเป็นสร้างค่าคุณสมบัติ Transform ใหม่ที่จะนำไปกำหนดค่าให้กับ Test Object ขึ้นมา

ทำการเชื่อมโหนดต่างๆ เข้าด้วยกันตามรูป

add-maketranform-node

คำสั่งชุดนี้จะเป็นการนำค่า ระยะทาง มารวมค่า Location ซึ่งเป็นพิกัดตำแหน่งปัจจุบันของ Test Object ทดสอบ โดยโหนด + (Vector  + Vector) ทำให้ได้พิกัดตำแหน่งใหม่ จากนั้นทำการปรับเปลี่ยนคุณสมบัติ Transform โดยใช้โหนด Make Transform แล้วค่าพิกัดตำแหน่งใหม่ทาง Input Pin ที่ชื่อว่า Location


Script ทำให้ Object เคลื่อนที่

เพิ่มโหนด Set Actor Transform โหนดนี้จะนำค่าคุณสมบัติ Tranform มากำหนด ให้กับ Test Object

จากนั้นเชื่อมต่อโหนด Event Tick เข้ากับโหนด Set Actor Transform 

เชื่อมต่อ Output pin ที่ชื่อว่า Return Value จากโหนด Make Transform ไปยัง Input pin ของโหนด Set Actor Transform ที่ชื่อว่า New Transform

add-settransform-node

คำสั่งชุดนี้จะเป็นการปรับเปลี่ยนคุณสมบัติ Tranform ให้กับ Test Object โดยนำค่าคุณสมบัติที่เตรียมไว้แล้วจากโหนด Make Transform มากำหนดให้ Test Object โดยโหนด Set Actor Transform โดยการปรับเปลี่ยนค่าคุณสมบัตินี้จะเกิดขึ้นในทุก Frame การแสดงผลของหน้าจอซึ่งถูกควบคุมโดยโหนด Event Tick ส่งผลทำให้ Test Object เกิดการเคลื่อนที่เกิดขึ้น


Script เปลี่ยนทิศทางการเคลื่อนที่ของ Object

จากขั้นตอนที่ผ่านหากทดลองรัน Project ของเราดูจะพบว่า Test Object นั้นจะเคลื่อนที่ไปอย่างต่อเนื่องและหลุดออกจาก Level ของเราไป ดังนั้นในขั้นตอนนี้เราจะมาเพิ่มชุดคำสั่งเพื่อกลับทิศทางการเคลื่อนที่ เพื่อให้ Test Object เคลื่อนที่ไปมา

ให้เพิ่มโหนด Delay แล้วกำหนด Duration เป็น 6 วินาที โหนดนี้จะเป็นการหน่วงเวลาก่อนจะไปทำงานในโหนดถัดไปตามค่า Duration ที่กำหนดไว้

add-delay-node

เพิ่มโหนด FlipFlop โหนดนี้จะทำสลับเส้นทางการทำงานของคำสั่ง

เพิ่มโหนดสำหรับกำนดค่าตัวแปร Direction จำนวน 2 โหนด โดยคลิกเลือกที่ตัวแปร Direction ในแท็บ My Blueprint แล้วลากมาวางใน graph เลือกเป็น Set แล้วกำหนดค่า Y เป็น 10.0 กับ -10.0 ตามลำดับ

add-flipflop-node

คำสั่งชุดนี้จะเป็นการสลับการตั้งค่าให้กับตัวแปร Direction จากค่า Y เท่ากับ 10 ไปเป็น -10 โดยโหนด FlipFlop โดยการทำงานจะเกิดขึ้นในทุก 6 วินาที ซึ่งการหน่วงเวลากล่าวจะถูกควบคุมโดยโหนด Delay


โหนตต่างภายใน Bluprint แสดงดังภาพข้างล่างนี้


Similar Posts