ScriptableObject
- это активы, которые «живут» только в Активах и не связаны ни с какой Сценой.
Вы (обычно) не можете иметь никаких ссылок со Сцены вСборный / актив, который живет только в активах.Причина заключается в сохранности.Если соответствующая сцена не загружена, то ссылки просто не будут существовать.
Вам понадобится какое-то постоянное внедрение зависимостей, чтобы восстановить эти ссылки после загрузки сцены (например, система сериализации Odin Inspector способна на это) или использовать динамическую зависимостьвнедрение во время выполнения (некоторые активы существуют для этого также в AssetStore ).
В соответствии с именем поля ShapeFactory.prefabs
вы хотите использовать Префаб этого куба GameObject вместо этого.
Простоперетащите этот куб из сцены (иерархия) в папку активов (ProjectView).Это создает Prefab из него.Этот новый созданный префаб теперь можно ссылаться в активе ScriptableObject
и других префабах.
До того, как я сказал (usually)
, потому что существуют некоторые обходные пути, если вам действительно нужна ссылка из сцены.Самым простым из известных мне было бы использовать другой ScriptableObject
, например,
Измените ваш сценарий на
public class ShapeFactory : ScriptableObject
{
[SerializeField] private PersistableObjectReference[] prefabsReferences;
}
, затем укажите ссылкувведите
[CreateAssetMenu]
public class PersistableObjectReference : ScriptableObject
{
public PersistableObject value;
}
Затем на соответствующем объекте сцены есть
[RequireComponent(typeof(PersistableObject))]
public class PersistentObjectReferenceSetter : MonoBehaviour
{
[SerializeField] private PersistableObjectReference reference;
// use Awake so it is also called if this object is
// deactivated in the hierachy
private void Awake()
{
reference.value = GetComponent<PersitableObject>();
}
}
и теперь ссылка на соответствующий актив PersistableObjectReference
в reference
.Это во время выполнения установит правильную ссылку из Сцены в ScriptableObject
(она будет отображаться как Type missmatch
, но работать как положено).
Теперь все, что вам нужно сделать, этопозже вместо прежнего prefabs[index]
используйте prefabReferences[index].value
в ShapeFactory
.