유니티 버전은 22.3.33f1사용하고 있고요,
맵과 맵을 텔레포터로 잇고, 텔레포트가 작동할 때마다 새로 로드된 씬의 텔레포터를 찾고, 이전 맵으로 가는건지 다음 맵으로 가는건지 판단하는 bool함수를 판별해
판별이 성공하면 해당 위치로 이동시켜주는 코드를 작성했습니다.
처음엔 private void OnLevelWasLoaded(int level)를 이용해보려 했는데, 나중버전에서는 없어지는 함수라고 해서 다른 방법 찾아보고 있습니다.
다른 함수 검색해보니까 onSceneLoaded가 있다고 해서 코드를 써봤는데 비주얼스튜디오에서 자동완성이 안뜨는걸로 봐선 뭔가 적용이 안되는것 같더라고요.
혹시 다른 방법 있을까요? 기존 코드와 onSceneLoaded 사용 봤던 링크 첨부하겠습니다.
private void OnLevelWasLoaded(int level) //이전 코드
{
GameObject[] teleporters = GameObject.FindGameObjectsWithTag(Define.TPtag);
foreach (GameObject teleporter in teleporters)
{
bool LR = MapTeleporter1.GiveIsLR(); //텔레포터내의 isLR값 반환해주는 함수.
Debug.Log(teleporter.name + ", "+ LR);
if(priviousMap != LR) //priviousMap은 이전 맵에서 텔레포트했던 그 텔레포터의 bool값 받아옴.
{
Debug.Log(teleporter.transform.position);
this.transform.position = new Vector3 (teleporter.transform.position.x + offset, teleporter.transform.position.y, this.transform.position.z);
break;
}
}
}
https://discussions.unity.com/t/how-to-use-scenemanager-onsceneloaded/624895/3
나라면 그런 정적인 요소들을 판가름 해야하는 상황이면 런타임에서 다 찾는게 아니라 미리 데이터들을 다 매핑 시켜놓고 찾을거같은데
c#이나 c++의 기능들? 구조들을 다 숙지하지 못한 채로 동아리 합숙활동을 진행하는거라 주먹구구식으로 짜게 됬네요.. 데이터 매핑은 어떻게 하면 될까요?
방법이야 많은데 스크립터블 오브젝트 앎?
네네 설정하는 방법은 찾아보긴 했습니다
씬에 대한 포탈 데이터들을 너 프로젝트에 필요한 구조로 짜서 스크립터블 오브젝트로 미리 저장시켜놓고 런타임에서는 스크립터블 오브젝트들 잘 만져서 판별해보셈
미리 원하는 좌표값을 씬 인덱스별로 넣어두고 인덱스 바뀔때마다 SO에서 찾아서 가져오라는 말씀이시죠?
좌표값을 넣든 게임오브젝트를 넣든 뭘 넣든 너가 생각해서 지금 프로젝트에 필요한데로 담아서 잘 쓰면됨 정적인 요소들에 대한 로직을 짤때 머리 아프게 다 런타임으로 할 필요없이 스크립터블 오브젝트만 잘 만져도 런타임 로직 줄이면서 코드까지 간결하게 줄일 수 있어서 얘기하는거 ㅇㅇ
넵 매핑하는법 정확히 더 찾아보고 수정해보겠습니다
쌉초보를 위해 private void OnLevelWasLoaded(int level)을 문법적인 해석 또는 사용원리를 어린이가 이해하기 싶게 설명한다면?
저게 onTriggerEnter2D처럼 다른 씬이 로드되었을 때 호출되는걸로 알고 있어요
텔레포드는 동일한데 텔레포트의 결과값이 각각 다른 레벨이 되어져야 하는 로직을 원하는건가?
정확히는 isLR가 true면 build setting 인덱스 상 다음 맵으로 이동, false면 이전 맵으로 이동시키는 코드를 짜서요, 만약 인덱스 1에서 다음 맵으로 이동(true)면 인덱스 2의 false값 텔레포터 좌표로 이동시켜주는 코드를 만들었습니다.
일부로 != 쓴 이유가 맵이 복도형식처럼 이어지게 나타나려고 한거였습니다. 1층에서 2층으로 올라가는 계단은 2층에서 1층으로 내려가는 계단이니까요
deprecate 면 걍 쓰고; obsolete 됐으면 그때 딴거 찾는거야
아예 없어진건 아닌데.. Awake에서 설정한 boolen값이 Awake안에서 로그 출력했을땐 설정한대로 떴는데, OnlevelWasLoaded안에서 로그 출력해보면 다 초기화되어있더라고요..
그래서 지원도 종료된다고 계속 콘솔창에 경고창 띄워주니 다른거 찾아보려 했습니다..
약간 헷갈리는데, 왜 Awake에서 안하고 굳이 OnLevelWasLoaded에서 하는거야?
씬이 바뀔때(맵이 바뀔때) 플레이어를 해당 위치로 옮겨주려고 OnLevelWasLoaded에서 씬 바뀐걸 확인하면 올바른 텔레포터로 옮겨주려고 했습니다. Awake에다가 짤 수도 있나요?
내가 코드 구조를 전부 아는건 아니라 정답은 모르지만.. OnLevelWasLoaded에서 해야만 하는거면 몰라도 Awake에서도 할 수 있지 않나 싶어서 물어봤어
텔레포트할 때 전달하는 값 (여기서는 bool 값?이겠지??)를 싱글톤인 스크립트에 저장을 하고 Awake에서 하면 되지 않나,, 싶어서
씬이 로드될 때 텔레포터의 Awake에서 bool값을 확인해 플레이어를 옮기라는 말씀이시죠?
텔레포터 Awake에서 로드될 때 판별해주니까 이전처럼 Awake랑 OnlevelWasLoaded 사이 데이터가 꼬이는 일은 없네요!