ฉันสามารถรันสคริปต์การโหลดของตัวเองระหว่างหน้าจอ Unity splash ได้หรือไม่


10

ฉันสามารถโหลดข้อมูลในพื้นหลังในขณะที่หน้าจอ Unity splash ได้หรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร

ฉันกำลังพยายามเรียกใช้รหัสในหน้าจอเริ่มต้นไม่ใช่แค่โหลดเนื้อหา

ฉันยังไม่ได้สามารถที่จะหาข้อมูลใด ๆ เกี่ยวกับเรื่องนี้ใน Google หรือเอกสารสามัคคี


2
ฉันคิดว่า Unity กำลังโหลดแอปพลิเคชันทั้งหมดของคุณอยู่แล้วเมื่อหน้าจอสแปลชมองเห็นได้ ฉันไม่คิดว่าสิ่งที่คุณต้องการจะทำเป็นไปได้ แต่ฉันชอบที่จะผิดในครั้งนี้
Hellium

2
นี่รู้สึกเหมือนเป็นปัญหา XY เล็กน้อย: ทำไมคุณต้องการโหลดสิ่งต่าง ๆ ระหว่างหน้าจอนั้น
doppelgreener

1
สิ่งใดที่คุณใส่ในฉากแรกของเกมของคุณจะถูกโหลดขณะที่หน้าจอสแปลชนั้นอยู่ใช่ไหม? ดังนั้นจะไม่เพียงพอหรือไม่ที่จะรวมเนื้อหาที่คุณต้องการโหลดในฉากแรกนั้น (ไม่ว่าจะเป็นกล้องถ่ายรูปปิดการใช้งานหรืออ้างอิงเพียงถ้าคุณไม่ต้องการให้เนื้อหานั้นปรากฏทันที) หรือคุณพยายามโหลดเนื้อหาจากแหล่งอื่นเช่นเว็บเซิร์ฟเวอร์
DMGregory

@DMGregory จุดยอดเยี่ยม ฉันอัพเดทคำถาม ฉันพยายามเรียกใช้รหัส
Evorlor

เราเข้าใจว่าคุณกำลังพยายามเรียกใช้รหัส (การโหลดสคริปต์จำเป็นต้องใช้รหัส) - แต่ต้องใช้รหัสใดและเพราะอะไร คุณมีปัญหาและคุณตัดสินใจว่าจะเรียกใช้รหัสนั้นในหน้าจอ Unity splash ทำไมถึงเป็นอย่างนั้น?
doppelgreener

คำตอบ:


9

ฉันเพิ่งทำการทดสอบและพบว่าตัวสร้างของวัตถุในฉากแรกนั้นถูกเรียกจริง ๆ ในขณะที่หน้าจอยังคงปรากฏขึ้น

นี่คือเวลาที่ฉันวัดด้วยนาฬิกาจับเวลาแบบคงที่:

Constructed  0     s
Awake        2.118 s
OnEnable     2.12  s
Start        2.744 s
First Update 2.919 s

ดังนั้นดูเหมือนว่าเราสามารถทริกเกอร์สคริปต์ให้ทำงานเกือบ 3 วินาทีก่อนสิ้นสุดหน้าจอเริ่มต้น (ด้วยการตั้งค่าเริ่มต้น) โดยการปิดสคริปต์จากตัวสร้าง คุณสามารถลองเรียกรหัสโหลดของคุณ (อาจเป็นไปได้ในเธรดของตนเอง) จากที่นั่น

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


1
3 วินาทีก่อนที่จะจบคุณหมายถึงหนึ่งวินาทีก่อนที่จะเริ่ม?
จาค็อบ

ในการทดลองของฉันสคริปต์ของฉันได้รับUpdate()ติ๊กครั้งแรก2.9 วินาทีหลังจากตัวสร้างเริ่มทำงาน นั่นคือทั้งหมดที่ฉันสามารถมองเห็นได้ด้วยเครื่องมือปัจจุบัน
DMGregory

2

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

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

ในบางแพลตฟอร์มเกมจะเริ่มทำงานก่อนที่หน้าจอเริ่มต้นจะหายไปหากการโหลดเร็วพอ

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


หน้าจอโหลดคู่เป็นสิ่งที่คุณแนะนำ
Evorlor

ใช่เป็นหลัก มันเป็นวิธีที่จะทำกับ Unity ใส่หน้าจอเริ่มต้น / โหลดสำหรับเกมหรือภาพเคลื่อนไหวโลโก้สตูดิโอขณะที่โหลดฉากต่อไป
Stephane Hockenhull

1
@ Evorlor นี่คือสิ่งที่ฉันทำกับเกมของฉันและในการทำงานได้อย่างสมบูรณ์แบบ แม้ว่าสิ่งนี้จะไม่อนุญาตให้คุณใช้เวลาที่อินโทรของ Unity ใช้เพราะอินโทรนั้นสั้นมากคุณสามารถสร้างหน้าจอโหลด (อย่างไรก็ตามทั่วไป) และใช้สำหรับของคุณ
John Hamilton

-1

คำตอบสั้น ๆ คือไม่คุณไม่สามารถทำได้

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

ดูที่เอกสารของSceneManager.LoadSceneสำหรับรายละเอียดเพิ่มเติม

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

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

อีกสิ่งที่คุณสามารถลองได้คือการลบ "หน้าจอเริ่มต้น" ลบภาพใด ๆ ที่คุณต้องการแสดงที่นั่น มันจะเร็วขึ้นอีกเล็กน้อยเนื่องจากจะไม่โหลดในตอนแรก

ดังนั้นการไหลจะเป็นดังนี้:

  1. หน้าจอเริ่มต้น (ไม่มีภาพที่นี่เพียงทำให้เป็นสีดำ)
  2. Splash scene (รอยเท้าขนาดเล็กที่มีรหัสเริ่มต้นและตัวโหลดซีนถัดไป)
  3. ฉากแนะนำ (ฉากแนะนำปกติ)
  4. .... (ฉากอื่น ๆ ตามปกติ)

ฉากที่เล็กลงก็จะโหลดเร็วขึ้น คุณสามารถใช้สิ่งที่ต้องการเช่นตัวควบคุมการสาดที่แนบกับวัตถุใด ๆ ในหน้าจอเริ่มต้นที่โหลด

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

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