【解决】ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor...

这篇具有很好参考价值的文章主要介绍了【解决】ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发平台:Unity 2018版本
编程平台:Visual Studio 2018版本
编程语言:CSharp

一、问题描述


描述
原文 ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call it in Awake or Start instead. Called from MonoBehaviour ‘脚本名称’ on game object ‘游戏对象名称’.See “Script Serialization” page in the Unity Manual for further details.
翻译 ScriptableObject 不被允许在 MonoBehaviour 中进行实例化相关操作。请在 Awake 或 Start 周期进行实例化操作!更多信息来源:XXX对象上的XXX脚本。你可以从 Unity Manual 获取更多关于 Script Serialization 信息。

备注:这是一处关于 Unity ScriptableObject 实例化问题。

二、场景还原


建立 ScriptableObject 数据存储文件

[CreateAssetMenu(FileName="TreeViewData", MenuName="Assets/Create SO/Tree View SO", 1)]
public class TreeViewData : SciptableObject { }

  如上所示,这是一个服务于 Tree View 的 SO配置数据。使用该类型数据资产应配合使用 CreateAssetMenu() 特性建立创建入口。

在 Mono 中实例化数据文件对象(失败)

  在 Unity + CSharp 中,为方便管理与初始化属性对象,可使用 访问类型 类 类名 = new 类型() 进行初始化构建。
对于非需要运行前配置进行空间开辟存储下,显得方便简洁。避免 Awake/Start 等周期进行 new 操作要便捷些许。

public class TreeViewRoot : MonoBehaviour
{
	public TreeViewData Data = new TreeViewData();
}

  但 Unity 中 ScriptableObject 不同于 MonoBehaviour。无法作为组件方式存在。如上图代码所示,最终运行结果将出现核心报错信息。


总结文章来源地址https://www.toymoban.com/news/detail-610355.html

  • 不支持实例化。但可以通过 Resources.Load 等方法从资产库中加载此 SO 数据使用。
  • 仅作为特别资产文件存在于 Asset/ 目录下(注意:目录下的 StreamingAssets | Plugins 目录也无法存在)。

三、解决方法


方法一:使用 Resouces.Load 加载 已创建 + 配置 资产完成赋值。

方法二:替换 Class 存储数据内容,完成实例化过程。

到了这里,关于【解决】ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包