private Texture2D GetTexture(GuestSpritesheetData guestSpritesheetData)
    {
        Texture2D texture = new Texture2D(512, 512, TextureFormat.RGBA32, true);

        Color[] spritesheetBasePixels = baseTexture.GetPixels(0, 0, 512, 512);
        texture.SetPixels(0, 0, 512, 512, spritesheetBasePixels);

        Color skinColor = guestSpritesheetData.skinColor;

        Color[] headPixels         = baseHeadTexture.GetPixels(0, 0, 128, 128);
        Color[] headSkinMaskPixels = baseHeadMaskTexture.GetPixels(0, 0, 128, 128);
        TintColorArraysInsideMask(headPixels, skinColor, headSkinMaskPixels);

        Color[] handPixels = handTexture.GetPixels(0, 0, 64, 64);
        TintColorArray(handPixels, skinColor);
        texture.SetPixels(384, 448, 64, 64, handPixels);

        Color hairColor = guestSpritesheetData.hairColor;

        bool hasHair = guestSpritesheetData.hairIndex != -1;

        if (hasHair)
        {
            int     hairIndex  = guestSpritesheetData.hairIndex;
            Color[] hairPixels = hairTexture.GetPixels(128 * hairIndex, 0, 128, 128);
            TintColorArray(hairPixels, hairColor);
            MergeColorArrays(headPixels, hairPixels);
        }

        bool hasBeard = guestSpritesheetData.beardIndex != -1;

        if (hasBeard)
        {
            int     beardIndex  = guestSpritesheetData.beardIndex;
            Color[] beardPixels = beardTexture.GetPixels(128 * beardIndex, 0, 128, 128);
            TintColorArray(beardPixels, hairColor);
            MergeColorArrays(headPixels, beardPixels);
        }

        texture.SetPixels(0, 384, 128, 128, headPixels);

        int bodyIndex = guestSpritesheetData.bodyIndex;

        Color[] bodyPixels       = bodyTextureWhite.GetPixels(128 * bodyIndex, 0, 128, 128);
        Color[] bodyMaskPixels   = bodyTextureMask.GetPixels(128 * bodyIndex, 0, 128, 128);
        Color   primaryColor     = guestSpritesheetData.bodyPrimaryColor;
        Color   primaryMaskColor = new Color(0, 1, 0);

        TintColorArraysInsideMask(bodyPixels, primaryColor, bodyMaskPixels, primaryMaskColor);
        Color secondaryColor     = guestSpritesheetData.bodySecondaryColor;
        Color secondaryMaskColor = new Color(0, 0, 1);

        TintColorArraysInsideMask(bodyPixels, secondaryColor, bodyMaskPixels, secondaryMaskColor);
        texture.SetPixels(0, 256, 128, 128, bodyPixels);

        texture.Apply();

        return(texture);
    }
    private void Awake()
    {
        guestSpritesheetData = GuestSpritesheetData.GenerateRandom();
        SetGuestSpritesheetData(guestSpritesheetData);

        CMDebug.ButtonUI(new Vector2(100, -170), "Randomize", () => {
            guestSpritesheetData = GuestSpritesheetData.GenerateRandom();
            SetGuestSpritesheetData(guestSpritesheetData);
        });
        CMDebug.ButtonUI(new Vector2(250, -170), "Save", () => {
            guestSpritesheetData.Save();
            CMDebug.TextPopupMouse("Saved!");
        });
        CMDebug.ButtonUI(new Vector2(400, -170), "Load", () => {
            guestSpritesheetData = GuestSpritesheetData.Load_Static();
            SetGuestSpritesheetData(guestSpritesheetData);
            CMDebug.TextPopupMouse("Loaded!");
        });
    }
    private void SetGuestSpritesheetData(GuestSpritesheetData guestSpritesheetData)
    {
        Texture2D texture = GetTexture(guestSpritesheetData);

        guestMaterial.mainTexture = texture;
    }