我在写博客后做运动,遇到了麻烦。
编码后,我在项目中创建一个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 {}
答案 0 :(得分:0)
ScriptableObject
是仅在资产中“存在”并且与任何场景都不相关的资产。
您(通常)不能从仅存在于资产中的预制件/资产中的场景获得任何引用。原因是节省。如果未加载相应的场景,则引用将根本不存在。
您需要某种持久性依赖注入,以便在加载场景后重建这些引用(例如afaik,例如Odin Inspector的序列化系统)或在运行时使用动态依赖注入(某些资产)也可以在AssetStore中进行此操作)。
根据字段名ShapeFactory.prefabs
,您要使用的是该多维数据集GameObject的Prefab。
只需将该多维数据集从场景(层次结构)中拖放到Assets文件夹(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
。
答案 1 :(得分:0)
无效:您不能将场景游戏对象分配给可脚本编写的对象。
场景游戏对象位于Hierarchy Window中。
有效:您可以将Prefabs分配给可脚本编写的对象。
预制件位于Project Window中。
在创建工厂后,您需要在此处创建预制件,而不是在场景中创建游戏对象。
要实现此目的,您只需执行以下操作:
创建PREFAB :将 -Cube Scene GameObject-(在“层次结构”窗口中)拖到“项目”文件夹=>中,以便创建预制件
在SO中预配置:将 -Cube Prefab-(在项目窗口中的一个)拖到SO上。
< / li>现在,您可以在SO工厂中使用Prefab进行实例化或任何其他目标。