Почему я не могу перетащить компонент в инспектор в unity3d? - PullRequest
0 голосов
/ 03 июля 2019

Я делаю упражнение после блога и столкнулся с проблемой.

После кодирования я создаю ресурс ShapeFactory в проекте и подписываю prefabs.size равным 3, добавляю компонент Shape в куб, после этой работы я попытался перетащить куб в актив ShapeFactory, ноон остановился редактором без всякой информации, кроме запрещенной иконки.

Вот код:

ShapeFactory.cs

public class ShapeFactory :ScriptableObject
{
    [SerializeField] private Shape[] prefabs;
}

Shape.cs

public class Shape : PersistableObject
{
    private int shapeId=int.MinValue;
}

PersistableObject.cs

public class PersistableObject : MonoBehaviour {}

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

НЕВЕРНЫЙ : Вы не можете назначить игровые объекты сцены объектам сценариев.
Игровые объекты сцены находятся в окне иерархии .

VALID : Вы можете назначить Префабы объектам Scriptable.
Префабы находятся в Окне Проекта .

Поскольку вы создаете Фабрику, которую вы хотитеПрефаб там, а не сцена игрового объекта.


КАК СДЕЛАТЬ ТАК

Чтобы добиться этого, вы можете просто сделать это:

  1. СОЗДАНИЕ ПРЕДИСЛОВИЯ : Перетащите GameObject- (тот, который находится в окне иерархии) -Cube в папку проекта =>, чтобы создать префаб

  2. Назначить префаб в SO : перетащить -Cube Prefab- (тот, что в окне проекта) на SO.

Теперь вы можете использовать Prefab на фабрике SO для создания экземпляров или для любых других целей.

0 голосов
/ 03 июля 2019

ScriptableObject - это активы, которые «живут» только в Активах и не связаны ни с какой Сценой.

Вы (обычно) не можете иметь никаких ссылок со Сцены вСборный / актив, который живет только в активах.Причина заключается в сохранности.Если соответствующая сцена не загружена, то ссылки просто не будут существовать.

Вам понадобится какое-то постоянное внедрение зависимостей, чтобы восстановить эти ссылки после загрузки сцены (например, система сериализации Odin Inspector способна на это) или использовать динамическую зависимостьвнедрение во время выполнения (некоторые активы существуют для этого также в AssetStore ).


В соответствии с именем поля ShapeFactory.prefabs вы хотите использовать Префаб этого куба GameObject вместо этого.

Простоперетащите этот куб из сцены (иерархия) в папку активов (ProjectView).Это создает Prefab из него.Этот новый созданный префаб теперь можно ссылаться в активе ScriptableObject и других префабах.


До того, как я сказал (usually), потому что существуют некоторые обходные пути, если вам действительно нужна ссылка из сцены.Самым простым из известных мне было бы использовать другой ScriptableObject, например,

  1. Измените ваш сценарий на

    public class ShapeFactory : ScriptableObject
    {
        [SerializeField] private PersistableObjectReference[] prefabsReferences;
    }
    
  2. , затем укажите ссылкувведите

    [CreateAssetMenu]
    public class PersistableObjectReference : ScriptableObject
    {
        public PersistableObject value;
    }
    
  3. Затем на соответствующем объекте сцены есть

    [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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...