代码之家  ›  专栏  ›  技术社区  ›  roffensive

可编写脚本的对象作为sprite的自定义版本

  •  1
  • roffensive  · 技术社区  · 6 年前

    我做了一个脚本对象,它有一个属性一个公共精灵。我想有一个版本的雪碧添加到任何地方,我想。

    如果我想改变它,我可以把另一个精灵固定到可编写脚本的对象上,在它固定的每个地方,精灵都会改变。

    有没有什么方法可以解决这个问题,或者有什么其他方法可以制作一个对象,我将在其中存储一个精灵并将其固定到多个对象。

    最后这个概念在统一中可能吗?

    我已经想过:

    • 派生prom Sprite渲染器,但类是密封的,因此我不能用这种方式制作自己的版本

    • 创建我自己的自定义版本的Sprite渲染,因为如果有任何更新来,我将不得不再次作出另一个版本。

    3 回复  |  直到 6 年前
        1
  •  2
  •   sswwqqaa    6 年前

    我想你可以用预制板来达到你需要的目的:

    您可以通过拖动和对象到您的资源来创建预置(您的预置将只是一个带有transform和Sprite渲染器的对象)

    创建预置后,你可以复制多少次,你想。 而当你决定改变精灵的时候,只需去你的预设并在那里编辑精灵。现在你预制的每一个实例都会有精灵改变。

        2
  •  2
  •   tsvedas    6 年前

    用C是可能的# events . 首先,让你的 ScriptableObject 每当设置了sprite时调用事件。允许 Sprite 仅使用属性(或方法)设置,以便可以跟踪更改,如下所示:

    public sealed class SpriteObject : ScriptableObject
    {
        public event Action SpriteChanged;
    
    
    
        [SerializeField]
        private Sprite _sprite;
    
    
    
        public Sprite Sprite
        {
            get { return _sprite; }
            set
            {
                if(_sprite == value)
                    return;
    
                _sprite = value;
                SpriteChanged?.Invoke();
            }
        }
    }
    

    然后,您需要脚本,它将对更改做出反应,并将更改后的精灵分配给 SpriteRenderer . 所以,就像这样:

    注: 名字纯粹是个例子。不要这样命名你的班级!

    [RequireComponent(typeof(SpriteRenderer))]
    public class ScriptThatUsedSpriteObject : MonoBehaviour
    {
        public SpriteObject spriteObject;
    
        private SpriteRenderer spriteRenderer;
    
    
    
        /// Called once the script is created.
        private void Awake()
        {
            spriteRenderer = GetComponent<SpriteRenderer>();
    
            if(spriteObject != null)
            {
                spriteRenderer.sprite = spriteObject.Sprite;
                spriteObject.SpriteChanged += HandleSpriteChanged;
            }
        }
    
        /// Called whenever sprite is changed inside SpriteObject.
        private void HandleSpriteChanged()
        {
            spriteRenderer.sprite = spriteObject.Sprite;
        }
    }
    

    现在,如果某些脚本更改了sprite SpriteObject ,每 ScriptThatUsedSpriteObject 将自动更新其精灵。

        3
  •  0
  •   SpoocyCrep    6 年前
    public class PublicSprite : MonoBehaviour {
    public Sprite publicSprite;
    #region Singelton
    public static PublicSprite instance;
    private void Awake()
    {
        if (instance != null)
        {
            Debug.LogWarning("More than one instance found");
            return;
        }
        instance = this;
    }
    }
    

    把雪碧弄成这样:

      PublicSprite.instance.publicSprite;
    

    如前所述,你可能想用一个歌手。最好是在必要时避免使用它们,因为这是一种非常糟糕的编程实践。(您可以在这里了解更多关于为什么要避免它们的信息: What is so bad about singletons?

    但是,我想不出另一种方法来做你想做的事。