Unity 스플래시 화면에서 자체 로딩 스크립트를 실행할 수 있습니까?


10

Unity 스플래시 화면이 켜져있는 동안 백그라운드에서 데이터를로드 할 수 있습니까? 그렇다면 어떻게?

자산을로드하는 것뿐만 아니라 스플래시 화면 중에 코드를 실행하려고합니다.

Google 또는 Unity 설명서 에서 이에 대한 정보를 찾을 수 없습니다 .


2
스플래시 화면이 표시되면 Unity가 이미 전체 응용 프로그램을로드하고 있다고 생각합니다. 나는 당신이하고 싶은 것이 가능하다고 생각하지 않지만 이번에는 잘못되고 싶습니다.
Hellium

2
이것은 약간의 XY 문제처럼 느껴집니다. 그 화면에서 물건을로드하고 싶습니까?
doppelgreener

1
스플래시 화면이 위로 올라간 상태에서 게임의 첫 장면에 넣은 모든 것이로드됩니까? 따라서 첫 장면에로드 할 컨텐츠 (카메라 외부, 비활성화 또는 해당 컨텐츠를 즉시 표시하지 않으려는 경우에만 참조)를 포함하는 것만으로는 충분하지 않습니까? 아니면 웹 서버와 같은 다른 소스에서 컨텐츠를로드하려고합니까?
DMGregory

@DMGregory 좋은 지적입니다. 질문을 업데이트했습니다. 코드를 실행하려고합니다.
Evorlor

코드를 실행하려고한다는 것을 알고 있습니다 (스크립트로드는 반드시 코드입니다). 문제가 생겼으며 솔루션이 Unity 스플래시 화면에서 해당 코드를 실행하는 것으로 결정했습니다. 왜 그런 겁니까?
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 초 전에 시작하기 1 초 전에?
Jacob

내 실험에서 스크립트는 Update()생성자가 시작된 후 2.9 초 후에 첫 번째 틱을 얻습니다 . 그것이 현재 계측기로 식별 할 수있는 모든 것입니다.
DMGregory

2

가장 좋은 방법은 자신의 로딩 화면을 만들고 초기 장면으로 설정하는 것입니다. 그런 다음 간단한 장면에서 장면 관리자 를 사용 하여 백그라운드에서 다음 장면 을 비동기 적 으로로드합니다 .

이를 확인하기위한 정보를 찾을 수 없지만, 관찰 한 바에 따르면 스플래시 화면이 표시되는 동안 Unity가 초기 장면을로드하는 것 같습니다.

일부 플랫폼에서는 로딩이 충분히 빠르면 스플래시 화면이 사라지기 전에 게임이 실행되기 시작합니다.

이 모든 것은 언제 어디서나 어떤 플랫폼에서든 모든 버전 업데이트에서 변경 될 수 있습니다. 이것이 일관 될 것이라는 보장은 없으므로 자신의 로딩 화면을 사용하는 것이 좋습니다.


이중로드 스크린은 당신이 제안하는 것입니까?
Evorlor

본질적으로 그렇습니다. Unity로하는 방법입니다. 다음 장면을로드하는 동안 게임 또는 일부 스튜디오 로고 애니메이션을위한 스플래시 /로드 화면을 배치하십시오.
Stephane Hockenhull 2016 년

1
@ Evorlor 이것은 내 게임으로하는 ​​일이며 완벽하게 작동합니다. Unity 인트로에 걸리는 시간을 활용할 수는 없지만 인트로는 매우 짧을 수 있기 때문에 로딩 화면 (일반적 임)을 만들어서 사용할 수 있습니다.
존 해밀턴

-1

짧은 대답은 아니오 , 당신은 그렇게 할 수 없습니다.

위의 답변은 모두 장면 관리 측면에서 정확합니다. 장면 관리자 를 사용하여 장면 을로드 할 수 있으며 비동기이기 때문에 다른 코드를 병렬로 실행할 수 있습니다.

자세한 내용 은 SceneManager.LoadScene 설명서를 참조하십시오.

게임이 시작된 후 가능한 빨리 코드를 가장 빠르게 실행할 수있는 가장 작은 발자국으로 첫 장면에서 코드를 실행하는 것입니다. Splash Scene 이라고합시다 . 포함하는 유일한 것은 스플래시 이미지와 컨트롤러가 필요한 코드를 실행하고 다른 장면을로드하는 것입니다.

설치 공간이 작기 때문에 매우 빠르게로드되므로 거의 즉시 코드를 실행할 수 있습니다. 그런 다음해야 할 일을하고 나중에 다른 장면을 로드 할 수 있습니다 .

시도 할 수있는 또 다른 방법은 "스플래쉬 화면"을 제거하여 표시하려는 이미지를 제거하는 것입니다. 처음에는로드되지 않기 때문에 조금 더 빠릅니다.

흐름은 다음과 같습니다.

  1. 스플래시 화면 (여기에 이미지가 없으며 검은 색 만 표시)
  2. 스플래시 장면 (초기 코드 및 다음 장면 로더가 포함 된 작은 설치 공간)
  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.