Unity_2기 내일배움캠프 TIL

Unity_2기 5주차 (231205)

잼잼재미 2023. 12. 5. 21:07

유니티 팀 프로젝트의 마감기한이 막바지에 다달았기 때문에 오늘 프로젝트 최종본 완성을 목표로 하여 업무를 분담했다. 나는 앞서 구현했던 ItemDisruption 코드 수정과 효과음, 배경음 슬라이더로 제어와 Playerprefs를 사용한 볼륨 저장 부분을 맡았다.

 

 

프로젝트 구현한 내용


ItemDisruption


기존 코드

private void DisruptionItemUse()
{
    _firstBall = Managers.Game.CurrentBalls[0];
    Rigidbody2D firstBallRb = _firstBall.GetComponent<Rigidbody2D>();
    Vector2 firstBallVec = firstBallRb.velocity;

    float seta;
    seta = Mathf.Atan2(firstBallVec.y, firstBallVec.x);

    // 우측볼
    GameObject secondBall = Instantiate(_firstBall, _firstBall.transform.position + new Vector3(1, 0, 0), Quaternion.identity);
    Managers.Game.CurrentBalls.Add(secondBall);
    ArkanoidBall secondArkanoidBall = secondBall.GetComponent<ArkanoidBall>();
    secondArkanoidBall.isLaunch = true;
    Rigidbody2D secondBallRb = secondBall.GetComponent<Rigidbody2D>();
    if (firstBallVec.x == 0)
    {
        secondBallRb.velocity = new Vector2(firstBallVec.y * Mathf.Cos(45), firstBallVec.y * Mathf.Sin(45));
    }
    else
    {
        secondBallRb.velocity = new Vector2(firstBallVec.x, firstBallVec.x * Mathf.Tan(seta - 45));
    }

    // 좌측볼
    GameObject thirdBall = Instantiate(_firstBall, _firstBall.transform.position + new Vector3(-1, 0, 0), Quaternion.identity);
    Managers.Game.CurrentBalls.Add(thirdBall);
    ArkanoidBall thirdArkanoidBall = thirdBall.GetComponent<ArkanoidBall>();
    thirdArkanoidBall.isLaunch = true;
    Rigidbody2D thirdBallRb = thirdBall.GetComponent<Rigidbody2D>();
    if (firstBallVec.x == 0)
    {
        thirdBallRb.velocity = new Vector2(-firstBallVec.y * Mathf.Cos(45), firstBallVec.y * Mathf.Sin(45));
    }
    else
    {
        thirdBallRb.velocity = new Vector2(-firstBallVec.x, firstBallVec.x * Mathf.Tan(seta - 45));
    }
}

 

 

수정 코드

public void Disruption()
{
    var ball = Managers.Game.CurrentBalls[0];
    Rigidbody2D BallRb = ball.GetComponent<Rigidbody2D>();
    Vector2 BallVec = BallRb.velocity;

    InstantiateBall(ball, BallRb, BallVec, false);
    InstantiateBall(ball, BallRb, BallVec, true);
}

private void InstantiateBall(GameObject mainBall, Rigidbody2D BallRb, Vector2 BallVec, bool IsLeft)
{
    float directionMultiplier = IsLeft ? -1f : 1f;
    float seta = Mathf.Atan2(BallVec.y, BallVec.x);
    Vector2 ballPos = mainBall.transform.position + new Vector3(directionMultiplier, 0, 0);
    GameObject ball = Managers.Resource.Instantiate("BallPrefab", ballPos);
    ball.GetComponent<Ball>().BallState = BallPreference.BALL_STATE.LAUNCH;
    Managers.Game.CurrentBalls.Add(ball);
    Rigidbody2D secondBallRb = ball.GetComponent<Rigidbody2D>();
    if (BallVec.x == 0)
    {
        secondBallRb.velocity = new Vector2(directionMultiplier * BallVec.y * Mathf.Cos(45), BallVec.y * Mathf.Sin(45));
    }
    else
    {
        secondBallRb.velocity = new Vector2(directionMultiplier * BallVec.x, BallVec.x * Mathf.Tan(seta - 45));
    }
}

함수를 하나 더 만들어서 중복되는 부분을 최대한 줄였다. Mathf 함수 사용 시, 도수법이 아니라 호도법으로 작성하여야 한다는 것을 정리하면서 알게되었다. 이 부분은 수정해야하지만 구현된 아이템 기능이 나쁘지 않아서 나중으로 미루기로 했다.

 

 

사운드 볼륨 슬라이더


설정에서 배경음과 효과음의 크기를 저장할 수 있고, 종료 후, 다시 접속해도 동일한 볼륨이 적용되어 있다.

 

 

코드

public Slider audioSlider;

public void SFXAuidoControl(float sound)
{
    sound = audioSlider.value; // 0.0001 ~ 1
    AudioSystem<SFX>.Instance.VolumeScale = sound;
    PlayerPrefs.SetFloat("SFXSoundValue", sound);
}

public void BGMAuidoControl(float sound)
{
    sound = audioSlider.value; // 0.0001 ~ 1
    AudioSystem<BGM>.Instance.VolumeScale = sound;
    PlayerPrefs.SetFloat("BGMSoundValue", sound);
}

슬라이더 핸들의 값 범위를 0~1로 설정해서 sound 값으로 받아서 볼륨을 적용했다. 적용이 될 때마다 PlayerPrefs로 데이터를 저장했다.

 

 

private void Start()
{
    // 오디오볼륨 저장 데이터 확인
    if (!PlayerPrefs.HasKey("SFXSoundValue"))
    {
        PlayerPrefs.SetFloat("SFXSoundValue", 1f);
    }
    else
    {
        //SFX
        SFXAudioSliderSetting.audioSlider.value = PlayerPrefs.GetFloat("SFXSoundValue");
        SFXAudioSliderSetting.SFXAuidoControl(SFXAudioSliderSetting.audioSlider.value);

        //BGM
        BGMAudioSliderSetting.audioSlider.value = PlayerPrefs.GetFloat("BGMSoundValue");
        BGMAudioSliderSetting.BGMAuidoControl(BGMAudioSliderSetting.audioSlider.value);
    }
}

게임이 시작할 때 마다, PlayerPrefs로 저장된 데이터를 불러왔다. 처음에는 Awake 함수에서 구현하려고 했는데 데이터가 적용이 되지 않았다. 아마도 데이터가 적용된 후에 배경음이 실행이 되서 그런 것 같다.

 

사운드와 Playerprefs 로 구현을 하면서 함께 정리를 했다.

https://kkln2486.tistory.com/152

 

사운드

사운드 효과음, 배경음 으로 구분 모든 파일은 ogg 파일로 통합하는 것이 좋음 wave 파일 사용 시, 짧은 효과음만 사용해야 함 AudioSource (오디오 플레이어) 와 AudioClip (오디오파일) 두 가지가 항상

kkln2486.tistory.com

 

https://kkln2486.tistory.com/155

 

사운드 슬라이더 바 만들기

1. 슬라이더 추가 볼륨은 -80~20까지 존재하지만, -40~0까지만 사용함 (-40 이하는 거의 들리지 않고, 0 이상은 음악이 깨짐) 2. AudioSource 준비 3. AudioMixer 설정 Mixers 이름 설정 Master - BGM, SFX 그룹으로 구

kkln2486.tistory.com

 

https://kkln2486.tistory.com/154

 

데이터 저장, 불러오기 (PlayerPrefs)

PlayerPrefs 앱을 껐다 켜도 데이터가 유지되게하는 데이터 보관 방법, 라벨을 붙여서 저장 저장 PlayerPrefs.SetFloat("bestScore", 어떤숫자값); PlayerPrefs.SetString("bestScore", 어떤문자열); 불러오기 저장된 정

kkln2486.tistory.com

 

 

오늘의 회고


오늘은 아이템 구현을 마치고 드디어 다른 구현에 도전해봤다. 사운드 슬라이더 조절과 Playerprefs는 예전에 한 번 해본적이 있었지만 전혀 기억이 나지 않아서 모두 새로 공부하면서 구현했다. 그래도 한번이라도 해봤던 것이라 오래걸렸지만 구현할 수 있었다. 프로젝트를 시작하고 몇일이 지났고, 내가 구현한 부분은 많다고 할 수 없지만, 오늘 완성된 프로젝트본을 보니 상당히 퀄리티가 있다고 생각했다. 이래서 협업이 중요하구나 라는 생각을 또 다시 한번하게 되었다. 내일은 프로젝트 완성본 제출 전, 전체적으로 QA 시간을 가질 것 같다. 내일까지 프로젝트를 잘 마무리해서 좋은 결과가 있었으면 좋겠다!!

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 5주차 (231207)  (1) 2023.12.07
Unity_2기 5주차 (231206)  (0) 2023.12.06
Unity_2기 5주차 (231204)  (0) 2023.12.04
Unity_2기 4주차 (231201)  (0) 2023.12.01
Unity_2기 4주차 (231130)  (1) 2023.11.30