修复超级单例允许创建目标为空的脚本的问题 #24
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
这个程序中应该是调用到了超级单例去获取一个什么东西,但是单例本身内容是空的,所以每帧获取的时候都会重新创建一遍。
等我找到调用位置后,再做限制
您好喵~ 感谢您提交这个问题报告!
从您描述的情况来看,这确实是一个需要修复的问题呢。超级单例在目标为空时不应该每帧都重新创建,这样会造成不必要的性能开销。
我可以帮您分析一下这个问题:
需要我帮忙查找调用位置吗?我可以:
您觉得这些建议有帮助吗?还是您已经有具体的修复计划了呢?
获取时会固定检查脚本是否存在,如果不存在就会使用AddComponent来添加脚本,如果失败,只能说明这个脚本可能时抽象类型之类的不能被实例化的脚本?
喵~ 明白了!您是说在获取超级单例时会检查脚本是否存在,不存在就自动添加组件,但如果脚本是抽象类或接口等无法实例化的类型就会失败对吧?
让我帮您分析一下这种情况:
可能的问题类型:
改进建议:
需要我帮您实现完整的解决方案吗?或者您希望我检查项目中现有的单例使用情况?喵~
和传入的类型是否为抽象类型无关,修正后问题依旧。
根据实例的名称可以得知,应该是有代码在通过绝对自身获取时产生的问题。
然后找到了项目中使用了这段代码:
这个周边环境面板的作用是创建一个基于数据管理对象的面板。这个实例时是为了创建一个管理脚本。
喵~ 明白了!问题出在
SurroundingEnvironmentManager类的继承和单例实现方式上呢。让我仔细分析一下:问题定位:
SingleMonoBase<DataDriveMonoBase>但实际需要的是SurroundingEnvironmentManager实例InstanceSelf可能返回了错误的类型导致强制转换问题当前实现的问题:
SingleMonoBase的实现是否支持正确的类型转换需要我帮您查看
SingleMonoBase的实现细节吗?或者您希望我提供一个完整的替代实现方案?喵~(另外注意到您说"修正后问题依旧",能告诉我您已经尝试了哪些修正方法吗?这样我可以更有针对性地帮助您~)
我知道了,因为unity上不能直接创建一个基于泛型的类:
就是说你不能直接 AddComponent<MyClass>
所以导致返回的结果为空。
喵~ 原来如此!您完全说对了呢!Unity确实不支持直接添加泛型组件,这是引擎层面的限制。让我们一起来解决这个问题吧!(。・ω・。)
问题根源分析:
AddComponent<T>()要求T必须是具体类型AddComponent<MyGenericClass<T>>()这样的形式解决方案建议:
您觉得哪种方案更适合您的项目需求呢?我可以帮您:
另外要注意的是,在编辑器脚本中这些限制可能略有不同,需要特别处理喵~ (≧▽≦)
改了一下,通过反射获取后续已经符合定义的类,并进行修正。
如果当前程序集中存在多个相同的类型,需要使用一个标记进行区分。
喵~ 您使用了反射来解决这个问题真是聪明的做法呢!(≧▽≦)✨ 让我帮您分析一下当前的解决方案和可能的改进点:
当前方案分析:
改进建议:
注意事项:
需要我帮您实现完整的标记系统吗?或者您希望我对现有反射代码进行更详细的安全检查?喵~
(可以告诉我您希望如何处理多个同名类型的情况,我可以提供更精确的建议哦!)