为什么不能在unity3d中将组件拖动到检查器?

时间:2019-07-03 03:57:29

标签: unity3d

我在写博客后做运动,遇到了麻烦。

编码后,我在项目中创建一个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 :(得分:0)

ScriptableObject是仅在资产中“存在”并且与任何场景都不相关的资产。

您(通常)不能从仅存在于资产中的预制件/资产中的场景获得任何引用。原因是节省。如果未加载相应的场景,则引用将根本不存在。

您需要某种持久性依赖注入,以便在加载场景后重建这些引用(例如afaik,例如Odin Inspector的序列化系统)或在运行时使用动态依赖注入(某些资产)也可以在AssetStore中进行此操作)。


根据字段名ShapeFactory.prefabs,您要使用的是该多维数据集GameObject的Prefab

只需将该多维数据集从场景(层次结构)中拖放到Assets文件夹(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

答案 1 :(得分:0)

无效:您不能将场景游戏对象分配给可脚本编写的对象。
场景游戏对象位于Hierarchy Window中。

有效:您可以将Prefabs分配给可脚本编写的对象。
预制件位于Project Window中。

在创建工厂后,您需要在此处创建预制件,而不是在场景中创建游戏对象。


怎么做

要实现此目的,您只需执行以下操作:

  1. 创建PREFAB :将 -Cube Scene GameObject-(在“层次结构”窗口中)拖到“项目”文件夹=>中,以便创建预制件

  2. 在SO中预配置:将 -Cube Prefab-(在项目窗口中的一个)拖到SO上。

    < / li>

现在,您可以在SO工厂中使用Prefab进行实例化或任何其他目标。