切换到宽版
  • 416阅读
  • 10回复

UnrealCS插件教程汇总 [复制链接]

上一主题 下一主题
离线xg_55
 

— 本帖被 xg_55 执行加亮操作(2017-01-15) —
离线lvzuoxin

只看该作者 沙发  发表于: 02-09
版主我有个疑问,为什么BeginPlay()等之类的方法,不遵循C++的模式,用真正的重写呢
比如这个在C#重写并不需要override,其实是一个私有的函数,而且父类也是私有的,根本没办法这个对象有什么函数,还要飞回去C++那边看有什么能重写,有一种感觉是,规则不一样了
离线lvzuoxin

只看该作者 板凳  发表于: 02-09
如果C#的父类做成public virtual void BeginPlay()不可以吗,会有什么影响,目前这个使用方式是U3D的模式,但我觉得更好的方式是,能和C++的使用一样。

还有,C#那边如果直接输入override,编辑器会自动暴露出能重写的函数,极大大的提高使用方便,而且符合UE4原声C++的口味,虽然现在做法是符合U3D口味的,但U3D的函数重写其实一点都不方便,而且项目众多,U3D的架构是不可能再修改了成override的这种形式了。
离线lvzuoxin

只看该作者 地板  发表于: 02-09
作者是不是出于方便的原因,private的函数相对来说,在mono那边设计可以更好的调用父函数,而逻辑这边的子类都不需要写base.BeginPlay()等形式,节省功夫,但我觉得从使用思想角度来说,是真重写比这个好用,毕竟调用父函数的形式更灵活了
离线lvzuoxin

只看该作者 4楼 发表于: 02-10
还有一个一问是,mono相关的dll为什么放到Context目录下
离线xg_55

只看该作者 5楼 发表于: 02-14
1.设计原则按照Unity来的
2.BeginPlay等方法,父类不定义虚函数,效率更高。因为如果子类没有定义,则不会被调用。特别是在Tick函数中。
3.用户可以自己声明一个继承于UMonoActorComponent的类,声明这些虚方法。
离线lvzuoxin

只看该作者 6楼 发表于: 02-14
回 xg_55 的帖子
xg_55:1.设计原则按照Unity来的
2.BeginPlay等方法,父类不定义虚函数,效率更高。因为如果子类没有定义,则不会被调用。特别是在Tick函数中。
3.用户可以自己声明一个继承于UMonoActorComponent的类,声明这 .. (2017-02-14 10:02) 

看得出来是按照U3D(Unity3D)的原则的,但在这方面,如果是出于效率原因的话,那不是舍弃了方便的用法,不过也没有数据表明,非虚函数private的会比虚函数override的快很多,不过希望斑竹能做个测试,虚拟机层的虚函数和非虚函数,不同于C++的,应该不至于效率那么低下,因为override确实可以带来非常方便和高效的开发,望版主也能做个时间长的测试,看看区别,再取舍下,看看我的建议是否可行,只是小小建议。

目前U3D就是自己写另外开写虚函数,然后使用重写的函数调用自己的虚函数满足需要,如果真这样每个都这样做逻辑,对于游戏来说效率更低了,因为只是引擎做了private而逻辑没这么做,也就是说,轮子做得好,却上路走得不快。也可以这么说,可能是大部分情况不会像前面所说这么做,但这种带来的不是很方便,不看API还真不知道有什么函数能重写的,这种做法其实颠覆了传统的面向对象,从效率角度来说,虽然有各种论证可能会降低,但实际实验结果,却没有什么考证。

如果按照这样的理论,UE4的C++函数应该也是不要做成虚函数,所有都是用实体函数进行绑定,那不是引擎效率高上加高?还是出于使用方便的原因,进行了一些取舍,何况也没有强而有力的实验数据证明虚函数效率很低。
离线xg_55

只看该作者 7楼 发表于: 02-14
BeginPlay等方法,父类不定义虚函数,效率更高。因为如果子类没有定义,则不会被调用。特别是在Tick函数中。

这句话的意思是:如果在C#中的一个类没有BeginPlay方法,并且父类中也没有,则这个方法就不会被C++调用。而如果声明了虚函数,则这个虚函数一定会被C++调用
离线lvzuoxin

只看该作者 8楼 发表于: 02-14
回 xg_55 的帖子
xg_55:BeginPlay等方法,父类不定义虚函数,效率更高。因为如果子类没有定义,则不会被调用。特别是在Tick函数中。
这句话的意思是:如果在C#中的一个类没有BeginPlay方法,并且父类中也没有,则这个 .. (2017-02-14 10:47) 

嗯,我知道楼主的意思,可是我就是觉得,即使不断调用,损耗可以忽略不计,父类确实会保留一个空白的虚函数Tick,并且mono那边不断调用。但看看是否有一种策略,如果没有被重写,就不需要调用了,这种方案走
离线lvzuoxin

只看该作者 9楼 发表于: 02-14
很久没有接触mono相关的东西了,我记得是有函数可以判断是否被重写,再保存起来,以后就不用每次调用都判断下,只是在初始化的时候,相对做一些判断
备注:老外有个Mono for ue这个项目,已经停掉了(好像是版权原因),就是我说的这种方式去做的,用override的形式去重写各个函数
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个