C# 是否可以将Unity GameObject强制转换为ScriptableObject类类型?

C# 是否可以将Unity GameObject强制转换为ScriptableObject类类型?,c#,unity3d,game-engine,C#,Unity3d,Game Engine,我已创建可脚本化对象自定义类卡: [CreateAssetMenufileName=卡片,menuName=卡片] 公共类卡:ScriptableObject { 公共新字符串名称; 公共字符串描述; 公共精灵英雄法师; 公众攻击; 公共卫生; 公共国际合作; 公共国际合作; } 我通过Unity Editor添加了大量此类对象,并在2d画布上实例化了游戏对象: 对于int i=0;i

我已创建可脚本化对象自定义类卡:

[CreateAssetMenufileName=卡片,menuName=卡片] 公共类卡:ScriptableObject { 公共新字符串名称; 公共字符串描述; 公共精灵英雄法师; 公众攻击; 公共卫生; 公共国际合作; 公共国际合作; } 我通过Unity Editor添加了大量此类对象,并在2d画布上实例化了游戏对象:

对于int i=0;i<5;我++ { GameObject go=实例化CardPrefactTemplate,新矢量3x_delt,0,0,四元数.identity作为GameObject; go.transform.SetParentMPlayerOpenedCards.transform,false; go.gameObject.name=cardui+i; x_delt+=intcardPrefactTempleBackgrrect.rect.width*cardPrefactTemplateBackground.localScale.x+x_card_边距; } 通过鼠标单击进行光线投射后,我获得当前已单击的卡游戏对象:

GameObject RaycastOpenedCardstring预设名称 { //设置新指针事件 m_PointerEventData=新的PointerEventDatam_事件系统; //将指针事件位置设置为鼠标位置 m_PointerEventData.position=Input.mousePosition; //创建光线投射结果的列表 列表结果=新列表; //使用图形光线投射器和鼠标单击位置进行光线投射 m_Raycaster.Raycastm_PointerEventData,结果; 如果Input.GetMouseButtonDown0 { foreach RaycastResult产生结果 { 如果result.gameObject.transform.parent!=null&&Regex.IsMatchresult.gameObject.transform.parent.name、prefactName { Debug.LogHit+result.gameObject.transform.parent.name; 返回result.gameObject.transform.parent.gameObject; } } } 返回null; } 在程序的另一部分中,我有List ActiveCards List,无法将光线投射的游戏对象投射到scriptableobject类卡:

GameObject g=raycastOpenedCardCardui打开; 如果g!=无效的 { 如果活动卡!=null&&ActiveCards。计数<5 { Mplayer.ActiveCards.Addg.GetComponent; } } 是否可以将Unity GameObject强制转换为ScriptableObject类类型

错误:

ArgumentException:GetComponent要求请求的组件“卡”派生自MonoBehavior或组件或是接口。 C:/buildslave/unity/build/Runtime/Export/Scripting/GameObject.bindings.cs:28 BoardManager.Update at Assets/Scripts/BoardManager.cs:202


简单地说,不,不可能将游戏对象强制转换为ScriptableObject,也不可能相反。这是因为GameObject不会从ScriptableObject继承,ScriptableObject也不会从GameObject继承。然而,它们都直接从对象继承

线GameObject go=InstanceCardPrefactTemplate,新矢量3x_delt,0,0,四元数.identity作为GameObject的原因;这是因为实例化将对象作为参数并克隆它,然后返回一个对象。ScriptableObject是一个可以正常工作的对象。你可以将一个对象投射到一个游戏对象上,这样也可以。但这并没有实现很多,因为通过这样做,您将保留的唯一东西是对象部分,所以在您的示例中,Object.name

现在GetComponent失败的原因是因为它只能查找单行为,而ScriptableObject卡不是。顺便说一句,MonoBehavior也从某个点继承对象

因此,真正的问题是,您首先想要实现什么?

是否可以将Unity GameObject转换为ScriptableObject类类型?不,根据你的错误判断,这没有任何意义。它告诉您,您正试图在一个不是单一行为的类型上获取组件。ScriptableObjects是类似于文本文件的资产。现在GetComponent失败的原因是因为它只能查找单一行为—存在非单一行为组件,如Transform、MeshRenderer、Sprite等。区别在于,作为开发人员,您不能创建直接从组件派生的对象,只能创建单一行为,但这并不排除它们的存在。你也可以传入一个接口,虽然它只能找到实现该接口的组件,但它工作得很好。此外,仅仅因为实例化接收一个对象并将其强制转换到游戏对象并不总是有效,所以实例化的对象必须事先是游戏对象。如果您传入一个转换,您将得到一个转换,因为特定的实现是通用的:publicstatict-instanceet-original;如果你试图把它作为一个游戏对象,你会得到一个InvalidClassCastException。