Files
Emberwild/Assets/GAME/Script/Network/SteamAvatarUtil.cs
T
2026-06-22 16:18:34 +02:00

52 lines
1.9 KiB
C#

using Steamworks;
using UnityEngine;
namespace Ashwild.Network
{
/// <summary>
/// Turns a Steam avatar image handle into a Unity Sprite. Steam hands us raw RGBA pixels
/// laid out top-to-bottom, whereas Unity textures are bottom-to-top, so the rows are flipped
/// while copying. Returns null for any invalid/empty handle so callers can fall back cleanly.
/// </summary>
public static class SteamAvatarUtil
{
/// <summary>
/// Builds a Sprite from a Steam image handle (e.g. from GetLargeFriendAvatar).
/// </summary>
public static Sprite BuildSprite(int imageHandle)
{
if (imageHandle <= 0) return null;
if (!SteamUtils.GetImageSize(imageHandle, out uint width, out uint height)) return null;
if (width == 0 || height == 0) return null;
int w = (int)width;
int h = (int)height;
byte[] buffer = new byte[w * h * 4];
if (!SteamUtils.GetImageRGBA(imageHandle, buffer, buffer.Length)) return null;
// Flip vertically: Steam rows run top→bottom, Unity expects bottom→top.
Color32[] pixels = new Color32[w * h];
for (int y = 0; y < h; y++)
{
int srcRow = (h - 1 - y) * w * 4;
int dstRow = y * w;
for (int x = 0; x < w; x++)
{
int s = srcRow + x * 4;
pixels[dstRow + x] = new Color32(buffer[s], buffer[s + 1], buffer[s + 2], buffer[s + 3]);
}
}
Texture2D texture = new Texture2D(w, h, TextureFormat.RGBA32, false, true)
{
wrapMode = TextureWrapMode.Clamp
};
texture.SetPixels32(pixels);
texture.Apply(false, false);
return Sprite.Create(texture, new Rect(0f, 0f, w, h), new Vector2(0.5f, 0.5f), 100f);
}
}
}