public virtual void SetImage(string imageName, bool fade = true)
        {
            this.RuntimeAssert(characterTextureMerger == null && textureChanger == null,
                               "Do not use SetImage() when CharacterTextureMerger or OverlayTextureChanger exists.");

            if (imageName == currentImageName)
            {
                return;
            }

            Sprite sprite = AssetLoader.Load <Sprite>(System.IO.Path.Combine(imageFolder, imageName));

            if (spriteChanger != null && spriteChanger.enabled && fade && !gameState.isMovingBack &&
                dialogueBoxController.state != DialogueBoxState.Skip)
            {
                // If pose is not changing, do not hide body
                if (currentImageName != null && imageName[0] == currentImageName[0])
                {
                    spriteChanger.SetSprite(sprite, overlay: true);
                }
                else
                {
                    spriteChanger.sprite = sprite;
                }
            }
            else
            {
                spriteRenderer.sprite = sprite;
            }

            currentImageName = imageName;
        }