[Unity]TIL (48) | 2023.10.02 | 유니티 스카이박스 스크립트 제어

kjg5370·2023년 10월 2일
0

TIL

목록 보기
48/91
post-thumbnail

들어가기 앞서

오늘은 스타트 씬의 멋진 인트로를 만들고 싶어서 고민하다가
타임라인, 시네머신 등 여러 방법이 있지만 너무 과분한 것 같아
그냥 스카이 박스를 움직여서 게임 인트로를 시작하는 것을 만들어보았습니다.

오늘 배운 것

  • 스카이박스 프로퍼티

    이 사진의 Properties에 있는 쉐이더 속성 값을 변경

  • 진행한 것
    Rotation -> Time.DeltaTime으로 특정시간 동안 움직이게 하기
    Exposure -> 0, 2, 0.96 순으로 어둡게 시작하여 밝아졌다가 원래대로 돌아가는 느낌을 표현

  • ControlSky.cs

     public class ControlSky : MonoBehaviour
    {
        private float exposure1 = 0f;
        private float exposure2 = 2f;
        private float exposure3 = 0.96f;
        private float customTime = 0f;
    
        private bool isChangingExposure = false;
        private bool isScriptActive = true;
        private Material skyboxMaterial;
    
    
        void Start()
        {
            skyboxMaterial = RenderSettings.skybox;
            SetExposure(exposure1);
            customTime = 0f;
        }
    
        void Update()
        {
            customTime += Time.deltaTime;
            if (isScriptActive)
            {
                if (!isChangingExposure)
                {
                    StartCoroutine(ChangeExposure(exposure2, 2.5f));
                }
                skyboxMaterial.SetFloat("_Rotation", customTime * 2f + 80);
            }
        }
    
        private void SetExposure(float value)
        {
            if (skyboxMaterial != null)
            {
                skyboxMaterial.SetFloat("_Exposure", value);
            }
        }
    
        private IEnumerator ChangeExposure(float targetExposure, float duration)
        {
            isChangingExposure = true;
    
            float initialExposure = RenderSettings.skybox.GetFloat("_Exposure");
            float startTime = Time.time;
            float endTime = startTime + duration;
    
            while (Time.time < endTime)
            {
                float t = (Time.time - startTime) / duration;
                float currentExposure = Mathf.Lerp(initialExposure, targetExposure, t);
                SetExposure(currentExposure);
                yield return null;
            }
    
            SetExposure(targetExposure);
            isChangingExposure = false;
    
            if (targetExposure == exposure3)
            {
                isScriptActive = false;
            }
            else if (targetExposure == exposure2)
            {
                StartCoroutine(ChangeExposure(exposure3, 2.5f));
            }
        }
    }

skyboxMaterial = RenderSettings.skybox; 로 Skybox Material을 할당하고 .SetFloat를 통해 원하는 값으로 변경
_Exposure값은 코루틴을 사용하여 특정 시간 후에 다음 값으로 변경되도록 설정.

  • 결과값

기억 할 것 & 진행 사항

  • 코루틴

    • 장점
      부드러운 애니메이션 및 전환: 코루틴은 값의 변화를 부드럽게 조절할 수 있도록 도와줍니다.
      코드 가독성 향상: 복잡한 비동기 작업을 효율적으로 처리할 수 있으므로 코드의 가독성을 향상시킵니다.

    • 단점
      오류 처리 어려움: 예외가 발생하면 코루틴이 즉시 중단되지 않고, 예외를 적절히 처리해야 합니다.
      미세한 성능 오버헤드: 코루틴은 작업을 중단하고 다시 시작하는 데 약간의 오버헤드가 발생할 수 있습니다.
      오작동 가능성: 코루틴이 중단되지 않고 계속 실행되는 경우 메모리 누수가 발생할 수 있습니다.

진행 사항

UI작업은 거의 완료 하였고 게임 로직 관련 플레이어 공격력 UP 버튼 등을 적절한 함수와 연결 시켜 기능을 구현해야 함.

내일 할 일

  • 하루 계획
    • 못 들은 강의 듯기
    • 졸업작품
profile
학생입니다

0개의 댓글