게임/VRChat

VRChat ImageLoader

모카쨩 2025. 1. 13. 23:46



공식자료는 여기

https://creators.vrchat.com/worlds/examples/image-loading/

https://creators.vrchat.com/worlds/udon/image-loading/

 

 

 

 

종각역에 적용되어 있고 부스에 배포할정도의 퀄리티는 아닌 개인용


https://gist.github.com/ahzkwid/c9498c95986d2b12cf6c65a576f8abd2

//v0.3

using UdonSharp;
using UnityEngine;
using UnityEngine.UI;
using VRC.SDK3.Image;
using VRC.SDKBase;
using VRC.Udon.Common.Interfaces;



[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class ImageLoader : UdonSharpBehaviour
{

    VRCImageDownloader imageDownloader;
    public VRCUrl[] urls;
    //public Material material;
    //public Texture2D[] textures;
    public RawImage[] rawImages;
    int textureIndex = 0;
    void Start()
    {
        /*
        foreach (var rawImage in rawImages)
        {
            rawImage.gameObject.SetActive(false);
        }
        */
        imageDownloader = new VRCImageDownloader();
        //textures = new Texture2D[urls.Length];
        LoadURL();
    }
    void LoadURL()
    {
        for (int i = 0; i < urls.Length; i++)
        {
            if (i>50)
            {
                continue;
            }
            var imageUrl = urls[i];
            var url = imageUrl.ToString();
            if (url.Length > 500)
            {
                continue;
            }
            if (URLSafeCheck(url))
            {
                var info = new TextureInfo();
                info.GenerateMipMaps = true;
                info.AnisoLevel = 1;
                imageDownloader.DownloadImage(imageUrl, null, (IUdonEventReceiver)this, info);
            }
        }
    }
    bool URLSafeCheck(string url)
    {
        if (url.StartsWith("https://raw.githubusercontent.com/"))
        {
            return true;
        }
        if (url.StartsWith("https://media.githubusercontent.com/"))
        {
            return true;
        }
        return false;
    }
    /*
    public override void OnImageLoadError(IVRCImageDownload result)
    {
        LoadURL();
    }
    */
    public override void OnImageLoadSuccess(IVRCImageDownload result)
    {
        if (rawImages.Length == 0)
        {
            return;
        }
        if (urls.Length== 0)
        {
            return;
        }
        if (textureIndex >= rawImages.Length)
        {
            textureIndex = 0;
        }
        var url = result.Url;
        if (url == null)
        {
            return;
        }
        if (URLSafeCheck(url.ToString()) == false)
        {
            return;
        }


        textureIndex = -1;
        for (int i = 0; i < urls.Length; i++)
        {
            if (urls[i].ToString()== url.ToString())
            {
                textureIndex = i;
                break;
            }
        }

        if (textureIndex == -1)
        {
            return;
        }
        //material = result.Material;

        //textures[textureIndex] = result.Result;
        var texture = result.Result;

        for (int i = 0; i < rawImages.Length; i++)
        {
            if (i % urls.Length == textureIndex)
            {
                var rawImage = rawImages[i];
                rawImage.texture = texture;
            }
        }
        /*
        foreach (var rawImage in rawImages)
        {
            rawImage.texture = texture;
            //rawImage.gameObject.SetActive(true);
        }
        */
        /*
        var rawImage = rawImages[textureIndex];
        rawImage.texture = result.Result;
        rawImage.gameObject.SetActive(true);
        textureIndex++;
        */
    }
}