Unity มีการสนับสนุนไทม์ไลน์ที่มีอยู่แล้วหรือไม่?


13

ฉันวางแผนที่จะพัฒนาเกมใน Unity3D และพยายามทำความเข้าใจกับสิ่งที่เอ็นจิ้นได้จัดเตรียมไว้แล้วและสิ่งที่ฉันต้องเขียนโค้ดเอง

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

เมื่อเราพูดถึงระบบการประสานงานประเภทนี้ในชั้นเรียนการออกแบบเกมของฉันที่มหาวิทยาลัยศาสตราจารย์ของฉันเรียกการออกแบบประเภทนี้ว่า "เส้นเวลา" แนวคิดที่ว่าคุณสามารถยกตัวอย่างสิ่งเหล่านี้อย่างน้อยหนึ่งอย่างเพื่อความก้าวหน้าในอัตราที่ต่างกันกำหนดสิ่งต่าง ๆ ที่จะเกิดขึ้นในอนาคตและซิงค์เหตุการณ์เป็นระยะ อย่างไรก็ตามการเรียกคลาสนี้ว่า "Timeline" นั้นถูก จำกัด เฉพาะอาจารย์ของฉันเองเนื่องจาก googling สำหรับฟังก์ชั่นการใช้งาน "Timeline" บางอย่างของ API นั้นเป็นความพยายามที่ไร้ผล

มีชื่อสามัญเพิ่มเติมสำหรับฟังก์ชันประเภทนี้หรือไม่ Unity มีวิธีการใด ๆ ที่มีอยู่ก่อนเพื่อประสานงานการจัดกำหนดการของเหตุการณ์เช่นนี้หรือเป็นสิ่งที่ต้องสร้างขึ้นบนเครื่องยนต์หรือไม่ และถ้าเป็นเช่นนั้นฉันขอขอบคุณที่ชี้ไปที่บทเรียนบางอย่าง!


ฉันยังใช้คลาส Timeline ที่คล้ายกัน (พวกเขามีชื่อเหมือนกัน) ฉันไม่ทราบชื่อทั่วไปของรูปแบบ แต่อาจมีการนำไปใช้บ่อยๆผ่านการเขียนโปรแกรมเชิงโต้ตอบการทำงาน coroutines หรือแนวคิดแบบอะซิงโครนัสอื่น ๆ
interphx

คำตอบ:


10

แม้ว่าฟังก์ชั่นนี้จะใช้งานไม่ได้ใน Unity แต่การใช้งานพื้นฐานของไทม์ไลน์ดังกล่าวไม่ควรทำยากเกินไป

นี่คือวิธีที่ฉันจะไปเกี่ยวกับที่:

  • คลาสTimelineของคุณใช้ลำดับความสำคัญเป็นโครงสร้างข้อมูลเพื่อจัดเก็บเหตุการณ์
  • เหตุการณ์ก็อาจจะเวลาและโทรกลับ timeline.AddEvent(0.25f, MyCallback)ดังนั้นการเพิ่มกิจกรรมในไทม์ไลน์จะเป็นง่ายๆเป็น:
  • ทุก ๆUpdateคลาสไทม์ไลน์จะ:

    1. เพิ่มเพลย์ลิสต์ (แบบง่ายfloat) ตามเวลาที่ผ่านไป
    2. ตรวจสอบส่วนหัวของคิวลำดับความสำคัญและลบและโทรกลับไปยังเหตุการณ์ทั้งหมดที่มีลำดับความสำคัญ (เช่นเวลา) เล็กกว่าหรือเท่ากับหัวการเล่นปัจจุบัน

หากคุณต้องการฟังก์ชั่นย้อนกลับหรือเล่นซ้ำบางอย่างมันจะเป็นเรื่องโง่ที่จะลบกิจกรรมทั้งหมดออกจากคิว แต่คุณสามารถใช้อาร์เรย์ที่จัดกิจกรรมของคุณแทน เหตุการณ์จะประกอบด้วยและTime คุณจะต้องให้อาร์เรย์ที่เรียงลำดับตามCallbackTime

จากนั้นแทนที่จะลบรายการออกจากอาร์เรย์คุณจะติดตามดัชนีอาร์เรย์ปัจจุบันและทุกการอัพเดทจะค้นหาล่วงหน้าจากดัชนีนั้นและดำเนินการเรียกกลับทั้งหมดด้วยPlayhead >= Timeขณะเดียวกันก็เพิ่มดัชนีตามลำดับ

การใช้ความเร็วในการเล่นที่เร็วขึ้นนั้นใช้ได้กับทั้งการใช้งานและจะง่ายเหมือน:

Playhead += Time.deltaTime * playbackSpeed

2
"เพิ่มเพลย์ลิสต์ (โฟลตแบบง่าย ๆ ) ตามเวลาที่ผ่านไป" - หากคุณทำเช่นนี้คุณจะได้รับข้อผิดพลาดรวมของคะแนนทศนิยม คุณควรใช้Time.time (เวลานับตั้งแต่เกมเริ่ม)แทน
BlueRaja - Danny Pflughoeft

4

ไม่ Unity3D ไม่มี API ดังกล่าวนอกกรอบ

มันสนับสนุน coroutines แต่และฉันขอแนะนำให้คุณดูพวกเขา Coroutines โดยทั่วไปทำให้การกำหนดเวลาและการซิงค์เหตุการณ์ง่าย ๆ


1

ฉันไม่แน่ใจว่านี้เป็นคำตอบใหม่ตั้งแต่ในปี 2012 แต่ความสามัคคีจริงจะมีการสนับสนุนการควบคุมระยะเวลาผ่าน (แบบเดิม) แอนิเมชั่บรรณาธิการ

แม้ว่าคุณลักษณะนี้มีวัตถุประสงค์หลักสำหรับการเคลื่อนไหวพารามิเตอร์วัตถุที่มีเส้นโค้งจะมีความสามารถในการทริกเกอร์สคริปต์ในเหตุการณ์นิเมชั่น สคริปต์เหล่านี้สามารถขับเคลื่อนกราฟิกและเสียงของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.