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

时间:2018-07-26 12:23:46

标签: unity3d

我已经将具有一个属性的可编写脚本对象设为公共精灵。我想在想要的任何地方添加一个版本的Sprite。

如果我想更改它,我可能会将另一个精灵固定在可编写脚本的对象上,并且在固定它的每个位置,精灵都会更改。

有没有办法以这个问题或其他任何想法来制造一个对象,我将在其中存储一个Sprite并将其固定到多个对象。

最后这个概念在Unity中可行吗?

我已经考虑过:

  • 派生了舞会Sprite Renderer,但该类是密封的,因此我无法以这种方式制作自己的版本

  • 创建自己的Sprite Render自定义版本会导致如果有任何更新,我将不得不再次制作另一个版本。

3 个答案:

答案 0 :(得分:2)

我认为您可以使用预制件实现所需的功能:

您可以通过将对象拖动到资产上来创建预制件(您的预制件仅是带有transform和Sprite Renderer的对象)

创建预制件后,您可以根据需要多次复制它。 比起决定更改子画面时,只需转到预制件并在其中编辑子画面即可。现在,您的每个预制实例都将更改精灵。

答案 1 :(得分:2)

使用C#events可以实现。首先,只要设置了精灵,就进行ScriptableObject通话事件。允许仅使用属性(或方法)设置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;
    }
}

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

答案 2 :(得分:0)

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;

在这里提到,您可能想使用Singelton。最好仅在必要时才避免使用它们,因为这是非常糟糕的编程习惯。 (您可以在此处详细了解为什么避免使用它们:What is so bad about singletons?

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