1인 개발/PushAndSlash

푸쉬앤슬래시 개인 프로젝트 18일차

잼잼재미 2024. 6. 4. 17:07

구현 내용


1. 카메라 설정 구현


 

[System.Serializable]
public class GameData
{
    public string UserName;
    public int Stage;
    public int Coin;

    [Header("Settings")]
    public float SFXValume;
    public float BGMValume;
    public int CameraSettingValue;
}
private void CameraSetting()
{
    _cameraSettingValue.text = _gameData.CameraSettingValue.ToString();

    if(_gameData.CameraSettingValue == 1)
    {
        _cameraController.Offset.y = 5f;
        _cameraController.Offset.z = -5f;
        _cameraController.OriginCameraRotation.x = 45f;
        _mainCamera.transform.rotation = Quaternion.Euler(_cameraController.OriginCameraRotation);
    }
    else if(_gameData.CameraSettingValue == 2)
    {
        _cameraController.Offset.y = 6f;
        _cameraController.Offset.z = -5f;
        _cameraController.OriginCameraRotation.x = 50f;
        _mainCamera.transform.rotation = Quaternion.Euler(_cameraController.OriginCameraRotation);
    }
}

 

CameraSettingValue를 GameData에 저장하고 값에 따라 CameraSetting 값들을 설정

 

 

트러블 슈팅


1. 비동기 로딩씬 이동 안됨


 

로비씬 -> 전투씬으로 이동할 때는 로딩씬이 잘 작동함

 

 

 

전투씬 -> 로비씬으로 이동할 때는 로딩씬에서 슬라이더 바가 0에서 멈춰서 씬 이동이 진행되지 않음

 

 

private void Start()
{
    Time.timeScale = 1f;
    StartCoroutine(LoadScene());
}

IEnumerator LoadScene()
{
    yield return null;
    AsyncOperation op = SceneManager.LoadSceneAsync(NextScene);
    op.allowSceneActivation = false;
    float timer = 0.0f;

    while (!op.isDone)
    {
        yield return null;
        timer += Time.deltaTime;
        
        if (op.progress < 0.9f)
        {
            _loadingBar.value = Mathf.Lerp(_loadingBar.value, op.progress, timer);
            if (_loadingBar.value >= op.progress)
            {
                timer = 0f;
            }
        }
        else
        {
            _loadingBar.value = Mathf.Lerp(_loadingBar.value, 1f, timer);
            if (_loadingBar.value == 1.0f)
            {
                op.allowSceneActivation = true;
                yield break;
            }
        }
    }
}

 

디버깅을 통해 timer 변수가 0에서 멈춰있는 것을 확인했다. 이유를 찾아보니 전투씬에서 게임을 클리어하게 되면 일시정지를 위해 Time.timeScale = 0f로 설정되어 있었다. 그래서 로딩씬을 이동하고도 일시정지가 적용되어 있어서 timer의 값이 변하지 않았고, Mathf.Lerp 함수가 동작하지 않았다.

 

 

 

해결 완료!

 

 

회고


오늘은 멀티 플레이를 구현하기 전, 마지막 버그 수정과 카메라 수정 기능을 추가했다. 그리고 멀티 플레이를 구현하기 위해 검색을 많이 해봤는데, 가장 간단하게 구현할 수 있는 방법은 유니티의 PUN2를 이용하는 방법이었다. 하지만 상당히 난이도가 있어보이는 작업이어서 아직 구현을 시작하지는 못했다. 더 자료들을 찾아보고 충분한 공부를 한 뒤, 블로그에 정리를 하면서 구현할 예정이다.