facebook_pixel

ทำ Rewind ใน Unity แบบง่ายๆ

Home/ทั่วไป/ทำ Rewind ใน Unity แบบง่ายๆ

สวัสดีครับ กลับมาพบกับเทคนิคดีๆในการเขียนเกมด้วย Unity กันอีกครั้งนะครับ โดยในวันนี้ผมก็จะมาสอนทำการย้อนเวลา หรือ Rewind แบบง่ายๆกันครับ

เพื่อนๆอาจจะเคยเล่นเกมที่มีการ Rewind ในการเล่นมาบ้างนะครับ เอาที่ดังๆเลยก็สกิลของ Tracer ที่สามารถย้อนเวลาของตัวละครกลับไปได้ในระยะนึง ซึ่งหลักและวิธีการคิดที่เราจะนำมาใช้ในวันนี้ก็คือ เราจะเก็บตำแหน่งและการหมุนของออบเจคเอาไว้เพื่อที่จะกด Rewind หรือย้อนกลับไปได้นั่นเองครับ มาเริ่มกันเลย

จากภาพผมสร้าง Scene ไว้ประกอบด้วยกล่องที่มี Ridgidbody เรียงกัน 3 X 3 กล่อง และทำ Prefab เอาไว้ และมีลูกบอลที่ใส่สคริป Add force เอาไว้ ถ้าหากเรากด Play ลูกบอลจะพุ่งไปชนกล่องแยกออกจากกันลักษณะนี้ครับ

จากนั้นเราจะสร้างสคริปพระเอกของบทความนี้กันครับ โดยผมตั้งชื่อว่า RewindScript ครับ ซึ่งเราจะใส่สคริปนี้ให้กับ GameObject ที่เราต้องการให้ย้อนเวลาได้ทุกตัวครับ

เริ่มจากเราจะประกาศตัวแปรกันก่อนครับ

จากภาพผมประกาศตัวแปรไว้ทั้งหมด 4 ตัวครับนั่นคือ

public bool isrewind; – เก็บเพื่อเปลี่ยนไปมาระหว่างกำลังย้อนเวลากับบันทึก

List<Vector3> position = new List<Vector3>(); – ลิสต์เพื่อเก็บตำแหน่ง

List<Quaternion> rotation = new List<Quaternion>(); – ลิสต์เก็บการหมุน

Rigidbody rb; – Ridgidbody ของออบเจคเพื่อคอยเปลี่ยน Iskinemetic ครับ

 

จากนั้นเราจะ Initialize Ridgidbody ของเราใน Start ฟังชั่นก์ครับ

 

ทีนี้เราจะใส่เงื่อนไขในการย้อนเวลากันครับ โดยในที่นี้ผมจะใช้การกดปุ่ม Enter ค้างเพื่อเริ่มย้อนเวลา และหยุดเมื่อเราปล่อยปุ่ม Enter ครับ

ฟังชั่นก์ startrewind และ stoprewind มีหน้าที่คือคอยสลับว่าเราจะเอาค่าในลิสต์มาใช้หรือจะบันทึกลงไปใหม่ กับเปลี่ยนให้ Ridgidbody เป็น Kinemetic คือไม่มีผลต่อแรงกระทำนั่นเองครับ

จากนั้นเราจะทำการสร้างฟังชั่นก์การเอาค่าออกมาใช้และการเซฟค่า โดยผมจะสร้างในฟังชั่นก์ FixedUpdate เพื่อนที่จะได้เป็นเวลาที่ Fix ไว้ในทุกๆเครื่องไม่ขึ้นกับเฟรมเรตครับ

จากภาพก็คือ ถ้าไม่ได้ย้อนเวลาอยู่ให้บันทึก ถ้าไม่ก็ให้ย้อนเวลานั่นเองครับ ซึ่งเราจะเปลี่ยนค่าตัวแปรตัวนี้ได้โดยการกด Enter นั่นเอง ทีนี้เราก็จะมาทำส่วนของฟังชั่นก์ record และ rewind กันครับ

ฟังชั่นก์ record มีหน้าที่บันทึกค่าตำแหน่งและการหมุนลงไปในลิสต์เราครับ

ฟังชั่นก์ rewind จะเป็นการเอาค่าในลิสต์มาใช้ โดยลบค่าออกไปเรื่อยๆ ซึ่งหากในลิสต์ไม่มีสมาชิกเหลือแล้วก็จะสั่งให้หยุดการ Rewind ทันทีครับ

จากนั้นเอาสคริปที่เราเขียนไปใส่ใน Prefab ของกล่องและของลูกบอลที่เราสร้างไว้ เราก็จะสามารถกด Enter เพื่อย้อนเวลาได้แล้วครับ

 

เป็นยังไงบ้างครับกับเทคนิคที่นำมาฝากกันในวันนี้ ไม่ยากเกินไปใช่ไม๊ล่ะครับ ข้อสังเกตคือวิธีนี้เป็นการสร้าง List เพิ่มขึ้นเรื่อยๆ ถ้าเราไม่กำหนดลิมิตของมันเราจะมีตัวแปรเยอะมากขึ้นเรื่อยๆและจะทำให้เกมเราค้างในที่สุด เพราะฉะนั้นในการเอาไปใช้อาจจะต้องเพิ่มเงื่อนไขในการบันทึกว่าเราจะให้บันทึกแค่ไหนด้วยนะครับ แล้วพบกันใหม่โอกาสหน้าครับ

 

 

 

 

 

By | 2017-12-06T00:16:34+00:00 December 6th, 2017|ทั่วไป|0 Comments

Leave A Comment