Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- unity merge
- 유니티
- 유니티 합치기
- 유니티 브랜치 merge
- 몬스터
- 유니티 해상도 변경
- NavMesh
- M590
- 유니티 머지
- networkobject
- Github DeskTop Merge
- m585 수리
- m585
- 유니티 해상도
- networkobject.networkid
- 깃허브 데스크탑 병합
- 오브젝트 깜빡임
- unity 병합
- stateauthority
- githubdesktopmerge
- nav오브젝트사이거리
- unity git
- m590 수리
- navigation
- networkbehaviourid
- 유니티 해상도 설정
- 깃허브 데스크탑 합치기
- Unity
- nav거리
Archives
- Today
- Total
집게사장의 꿈
[영혼들] 씬 불러오기 본문
씬 불러오기
씬을 로드하는 과정에서 중간 씬을 거치지 않고 바로 로드하니 메모리 사용 초과로 모바일에서 강제 종료되는 현상이 발생했습니다.
그렇기에, 중간씬을 추가하여 로드하였습니다.
SceneLoader
씬을 불러올 때, static 함수를 사용하여 로딩 씬을 불러온 후 다음 씬에서 실행할 동작을 지정받습니다.
로딩씬에서 Start()를 통해 지정된 다음씬을 로드합니다.
//씬에 대한 정보를 가지고 있는다.
public class SceneInformation
{
public string SceneName = null; //로딩할 씬의 이름
public Action SceneEndAction = null; //씬 로딩 후 실행 할 것
public bool SceneLoading = false; //씬 로딩 완료 여부
}
//씬 로딩을 위한 전역함수
public static void LoadLoaderScene(string _name, Action _action=null)
{
SceneManager.LoadScene("LoadScene");
SceneLoader.sceneInformation.SceneName = _name;
SceneLoader.sceneInformation.SceneEndAction = _action;
SceneLoader.sceneInformation.SceneLoading = false;
}
전체 코드
//로딩 씬 빈 오브젝트에 추가되어있습니다.
public class SceneLoader : MonoBehaviour
{
public static SceneInformation sceneInformation = new SceneInformation();
public TMP_Text txt_tip;
public Image img_progress;
public Animation anim_dot;
void Start()
{
DontDestroyOnLoad(this.gameObject);
StartCoroutine(SceneLoad());
//씬 전체의 사운드 변경 동작을 저장합니다.
Setting.Action_SoundChanger = null;
}
IEnumerator SceneLoad()
{
Debug.LogWarning("씬을 불러오는 중.....");
//화면 보이기
Fade.FadeSetting(false,1.0f,Color.white);
//화면 보이는 동안 대기
yield return new WaitUntil(() => Fade.b_faded);
// Debug.LogWarning("씬 로딩 1");
//팁과 애님 실행
txt_tip.text = LocalLanguageSetting.Instance.GetLocalText("Tip", $"Loading{Random.Range(1, 3)}");
anim_dot.Play();
//Debug.LogWarning("씬 로딩 2");
//씬 로딩을 위한 함수
AsyncOperation _operation = SceneManager.LoadSceneAsync(sceneInformation.SceneName);
_operation.allowSceneActivation = false;
//Debug.LogWarning("씬 로딩 3");
//로딩 진행도 표시
float _progress = 0.0f;
while (_progress < 0.89f)
{
if (_progress > _operation.progress) { continue; }
_progress += Time.unscaledDeltaTime * 0.333f;
img_progress.fillAmount = _progress;
yield return null;
}
//1초 지연한다.
float time = 0;
while (time < 1.0f)
{
time += Time.unscaledDeltaTime;
img_progress.fillAmount = Mathf.Lerp(0.9f, 1.0f, time);
}
//Debug.LogWarning("씬 로딩 4");
//씬을 로드시킨다.
_operation.allowSceneActivation = true;
//작업이 끝날때까지 대기 시킨다.
while (!_operation.isDone)
{
Debug.Log("맵을 불러오고 있습니다.");
yield return null;
}
//FadeOut
Fade.FadeSetting(false, 1.0f, Color.white);
//Debug.LogWarning("씬 로딩 5");
//씬 하면서 지정된 동작을 수행합니다.
if (sceneInformation.SceneEndAction != null)
{
sceneInformation.SceneEndAction();
sceneInformation.SceneEndAction = null;
}
Debug.Log("씬을 로드에 성공했습니다. : " + sceneInformation.SceneName);
//종료를 알림
sceneInformation.SceneLoading = false;
Time.timeScale = 1.0f;
//현재 로딩 오브젝트 제거
Destroy(gameObject);
}
실제 플레이
설명
게임을 시작하면서 LoadScene가 로드 되고, Loader가 동작하면서 지정된 다음씬을 불러와 Loader에서 지정된 동작을 수행합니다.
'제작 > 영혼들' 카테고리의 다른 글
[영혼들] 아이템 표시 (0) | 2024.08.02 |
---|---|
[영혼들] 사운드 추격 (0) | 2024.08.02 |
[영혼들] 컬라이더로 맵에서 플레이어의 위치 찾기 (0) | 2024.08.02 |
[영혼들] 아이템 상호작용 (0) | 2024.08.02 |
[영혼들]아이템 - 오르골 (0) | 2023.11.04 |