我已经将具有一个属性的可编写脚本对象设为公共精灵。我想在想要的任何地方添加一个版本的Sprite。
如果我想更改它,我可能会将另一个精灵固定在可编写脚本的对象上,并且在固定它的每个位置,精灵都会更改。
有没有办法以这个问题或其他任何想法来制造一个对象,我将在其中存储一个Sprite并将其固定到多个对象。
最后这个概念在Unity中可行吗?
我已经考虑过:
派生了舞会Sprite Renderer,但该类是密封的,因此我无法以这种方式制作自己的版本
创建自己的Sprite Render自定义版本会导致如果有任何更新,我将不得不再次制作另一个版本。
答案 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?
但是,我想不出另一种方法来做您想要的事情。