카테고리 없음

Unity에서 다이나믹하게 SkyBox 변경하기

Wood Pecker 2024. 6. 23. 08:17

1. 개요 

    프로그램 실행 중에   Sky Box를 변경한다. 

 

2. 수작업으로 변경하는 방법

     프로젝트 Asset 폴더에  360도 파노라마 사진을 준비한다. 

     마우스 우측버튼으로 Create> Material을 생성하고, 적절한 이름을 부여한다.(예: PanoramaSkybox).
     생성한 Material을 선택하고, Inspector 창에서 Shader를 Skybox > Panoramic으로 변경합니다.

 

Main Texture 슬롯에 파노라마 이미지를 드래그 앤 드롭한다. 

 

   이제 생성한 Skybox Material을 현재 Scene에 적용합니다.
   Window > Rendering > Lighting을 선택하여 Lighting 창을 엽니다.
   Environment 탭에서 Skybox Material 항목을 찾습니다.
   Skybox Material 슬롯에 생성한 Material (PanoramaSkybox)을 드래그 앤 드롭하여 할당합니다.

 

3. 로컬파일에서 읽어서  프로그램에서 변경하기

     Assets/images/panorama.jpg로  skybox를 변경하는 예제 코드이다. 

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class ChangeSkyBox : MonoBehaviour
{
    public string imagePath = "Assets/Images/panorama.jpg";
    public Material skyboxMaterial;

void Start()
    {
        // 에디터에서만 동작하는 코드
        #if UNITY_EDITOR
            Texture2D panoramaTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(imagePath);
            if (panoramaTexture != null)
            {
                Material skyboxMaterial = new Material(Shader.Find("Skybox/Panoramic"));
                skyboxMaterial.SetTexture("_MainTex", panoramaTexture);
                RenderSettings.skybox = skyboxMaterial;
                DynamicGI.UpdateEnvironment();
            }
            else
            {
                Debug.LogError("Failed to load texture from path: " + imagePath);
            }
        #endif
    }
}

 

4. 서버에서 읽어서 변경하기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class ChangeSkyBox2 : MonoBehaviour
{ 
    public string imageUrl = "https://server_url/Notre-Dame01.jpg";
    public Material skyboxMaterial;

    void Start()
    {
        skyboxMaterial = new Material(Shader.Find("Skybox/Panoramic")); 
        StartCoroutine(DownloadAndSetSkybox());
    }

    IEnumerator DownloadAndSetSkybox()
    {
        using (UnityWebRequest webRequest = UnityWebRequestTexture.GetTexture(imageUrl))
        {
            // 요청을 보내고 응답을 기다림
            yield return webRequest.SendWebRequest();

            if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError)
            {
                Debug.LogError("Error downloading image: " + webRequest.error);
            }
            else
            {
                // 성공적으로 다운로드된 텍스처를 Skybox에 적용
                Texture2D panoramaTexture = ((DownloadHandlerTexture)webRequest.downloadHandler).texture;
                skyboxMaterial.SetTexture("_MainTex", panoramaTexture);
                RenderSettings.skybox = skyboxMaterial;
                DynamicGI.UpdateEnvironment();
            }
        }
    }
}
반응형