ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 3D 프로젝트 정리
    TIL 2024. 5. 30. 21:02

    움직이는 플랫폼

    내가 생각하는 플랫폼 이동

    움직이는 플랫폼을 구현한다고 생각할때 

    당연히 플레이어가 플랫폼 위에 있으면 함께 이동 될거라 생각했다.

    유니티 현실

    만약 위아래로만 움직이는 플랫폼이라면  알아채지 못할수 도 있지만, 옆으로 움직이는 플랫폼인 경우  플랫폼에 플레이어를 올려두면 캐릭터를 버리고 가버리는 것을 볼 수가 있다.

     

    그래서 생각한 방법이 플레이어를 자식으로 둔다는 것이였다.

     

    단순하게 플레이어가 플랫폼 위에 올라갔을 경우에 플레이어를 자식으로 넣어서 이동할때 함께 이동시키고 만약 플레이어가 벗어난다면 자식이였던 플레이어를 밖으로 빼준다는 생각이다.

     

    private void OnCollisionEnter(Collision other) 
        {
            if(coroutine!=null) 
            {
                StopCoroutine(coroutine);
            }
            other.transform.SetParent(this.transform);//부모를 플랫폼으로 변경
            inPlatform=true;
    
        }
        private void OnCollisionExit(Collision other) 
        {
            coroutine = StartCoroutine(Count());//n초 뒤에 발판이 처음 있던 자리로 돌아온다.
            other.transform.SetParent(null); 
    
        }
    transform.SetParent()  오브젝트의 부모를 설정해 줄 수 있다.

     

    이제 플레이어가 플랫폼과 같이 움직이게 되었지만 내가 만든 프로젝트에서는 고려해야할 문제가 하나가 더 있었다.

     

    DontDestroyOnLoad

    DontDestroyOnLoad(Object);

     

    일반적으로 씬을 옮기더라도 오브젝트가 부서지지 않고 유지하기 위해 쓰는 함수이다.

     

    나는 프로젝트에서 캔버스와 매니저들 그리고 플레이어는 씬마다 만들어주지 않고 그대로 다음씬에 가져가서 사용하게 만들어 놨었다.

     

    그런데  이렇게 위에서처럼 부모를 null로 지정해버리게되면 DestroyOnLoad로 들어가지 않고 일반적인 씬의 밖으로 나가게 되버려서 다음씬으로 넘어가면 플레이어가 없어지는 문제가 생겼다.

     

    해결방법 

        private void OnCollisionEnter(Collision other) 
        {
            if(coroutine!=null) 
            {
                StopCoroutine(coroutine);
            }
            other.transform.SetParent(this.transform);
            inPlatform=true;
    
        }
        private void OnCollisionExit(Collision other) 
        {
            coroutine = StartCoroutine(Count());
            other.transform.SetParent(null);
            DontDestroyOnLoad(other.gameObject);
    
        }

    부모를 null로 선언해 주고 다시 해당 오브젝트를 DontDestroyOnLoad() 해줬다.

     

    유니티 프리징

    이것저것 작업을 하다보면 가끔 유니티가 멈출때가 있다. 그냥 단순히 렉이 걸려서 멈춘거라면 단순히 껐다 키면 되겠지만

    게임 모드를 실행 했을 떄 갑자기 아무런 전조도 없이 멈추고 심지어 게임모드가 종류도 안되는 

    아예 유니티가 멈춰 버리는 현상을 겪었다.

     

    내 프로젝트에서 유니티가 아예 멈춘 이유는 반복문에 있었다.

    //예시 코드입니다.
    
    void FixedUpdate()
    {
       While(true)
       {
    	if(count==false) break;
       }
    }

     

    이와 같이  매 프레임마다 실행되는 반복문에서  탈출 조건이 없을 경우 문법적 오류는 없기 때문에 오류가 뜨지는 않지만

    이 코드가 있을때 게임모드에 들어가게 될 경우 유니티가 먹통이 된다.

    사람이 생각하기야 저 조건문이 실행 될 때 까지 보류해주고 실행하겠지? 라고 생각하지만 유니티는 멈추게된다.

     

    그렇다면 입력 대기 같은 기능을 만들고 싶다면 어떻게 해야할까

    IEnumerator WaitInput()
    {
        While(true)
        {
            if(대충 조건문)break;
            yield return null; //없으면 유니티가 멈춘다!
        }
    }

    내가 생각한 방법은 코루틴을 사용하는 것이였다.

     

    특정 조건을 하기 전 까지는 반복문 안에서 

    yield return null을 사용해 제어권을 유니티에 넘겨 줘서 유니티가 멈추는 것을 방지할 수 있다.

     

     

    [PackageManagerWindow] 오류

     

    마무리 작업으로 효과음을 에셋스토어에서 다운받고 적용하려던 중에 발생한 오류이다

    패키지 매니저에서 다운받으려던 중에 오류가 뜨면서 목록을 불러오지 못했다.

     

    검색을 해보니 계정에 문제가 있을 수도 있다고 해서 프로젝트를 껐다 켜보기도하고

    유니티 허브의 로그인을 다시해보기도 했지만 전혀 해결되지 않아서 뭘까 싶었는데

     

     

    유니티 에셋스토어 서버가.....먹통이 되었던 거였다.

    결국에는 마지막에 넣고싶었던 효과음을 넣지 못하고 과제를 제출했다.

     

    솔직히 어이없다.

    'TIL' 카테고리의 다른 글

    [TIL] 제작 관련 기능을 만들기 1  (1) 2024.06.03
    [TIL] 게임에서 데이터 저장하기(직렬화, 역직렬화)  (0) 2024.05.31
    [TIL] UGUI  (0) 2024.05.29
    [TIL] 유니티 숙련주차 3  (0) 2024.05.28
    [TIL] 유니티 숙련주차 2  (0) 2024.05.27
Designed by Tistory.