puerts
puerts copied to clipboard
[Unreal] 关于手机调试热刷新的问题
detail | 详细描述
之前在使用Chrome DevTools进行手机调试的时候,直接修改js代码,然后Ctrl+S保存后。代码就会立即生效。 但是最近发现这个功能貌似没有了。 不知道是否是跟这个功能 UE4下基于V8实现的代码热刷新 https://zhuanlan.zhihu.com/p/364505146 有冲突?
cdt保存后刷新是V8提供的功能。 《UE4下基于V8实现的代码热刷新》这个老早就加了,应该没影响。 你看是不是v8版本变了导致的?ue4.25及以上之前默认7.7,后面改为默认8.4
你之前可以的puerts的版本是哪个?
puerts的版本 在哪里能够看到? 我看了一下大概的时间 应该是2021年7月初的时候,还是可以的
《UE4下基于V8实现的代码热刷新》在21年三月份就添加了
我试了下在编辑器下是可以的。
是的 编辑器下的确是可以的 ,但是在手机上就不行
在补充一些细节
比如我的js文件是
在没有修改此文件的时候,在此文件中打断点,断点会正常命中。
当我在DevTools中修改次文件并保存后。观察游戏内表现,发现代码并未生效。
而断点也无法命中了。
此时,关闭DevTools,然后再次打开DevTools连上手机,会发现上述文件是修改后的样子,打断点会命中,但是就会打开另一个文件:
而这个文件则是未修改前的样子。
路径导致的
你试试抓下包,DevTools的调试页面也是被调试,你调试这个页面就能看到包了。看下他们是怎么交互的。 puerts在其中的角色就透传而已。
和这个过程有关的一个是v8版本。 另外一个是: https://github.com/Tencent/puerts/commits/master/unreal/Puerts/Source/JsEnv/Private/DefaultJSModuleLoader.cpp 。这个影响了路径 你分别切换到之前的版本试试。
确认了一下 ,之前我们用的一直就是v8引擎的8.4版本
然后DefaultJSModuleLoader.cpp 回退到之前的版本,也还是不行
抓包结果如下
可以看到确实调用了SetScriptSource, 并且查看param,也的确是修改后的文件。
但是手机上 就是不会生效。而编辑器上就会生效。
看看手机的抓包和编辑器的有什么区别?
没有区别
会不会和这里有一定关系:
#if PLATFORM_MAC
FString FormattedScriptUrl = DebugPath;
#else
// 修改URL分隔符格式,否则无法匹配Inspector协议在打断点时发送的正则表达式,导致断点失败
FString FormattedScriptUrl = DebugPath.Replace(TEXT("/"), TEXT("\\"));
#endif
按道理来说,应该是只有window采用'',这逻辑不太对,变成了除mac都用''了
会不会和这里有一定关系:
#if PLATFORM_MAC FString FormattedScriptUrl = DebugPath; #else // 修改URL分隔符格式,否则无法匹配Inspector协议在打断点时发送的正则表达式,导致断点失败 FString FormattedScriptUrl = DebugPath.Replace(TEXT("/"), TEXT("\\")); #endif
按道理来说,应该是只有window采用'',这逻辑不太对,变成了除mac都用''了
这我改了,你更新到最新代码试试?
我更新到最新 结果连编辑器下都不行了 为了避免我自己工程带来的影响,我使用puerts_unreal_demo工程也试了一下,也是编辑器下都不行了
我更新到最新 结果连编辑器下都不行了 为了避免我自己工程带来的影响,我使用puerts_unreal_demo工程也试了一下,也是编辑器下都不行了
你怎么试?试的哪个脚本?
我刚刚亲测用cdt ctrl+s保存能热更新
你在cdt上修改的是ts还是js?我修改js没问题。
我就是下载最新的demo工程https://github.com/chexiongsheng/puerts_unreal_demo 修改JsEnv.Build.cs,添加PublicDefinitions.Add("WITH_INSPECTOR"); 然后修改QuickStart.ts spawn了一个TsTestActor let u_class = makeUClass(TsTestActor); let test_actor_wyh = world.SpawnActor(u_class, undefined, UE.ESpawnActorCollisionHandlingMethod.Undefined, undefined, undefined) as TsTestActor; 然后运行,这样TsTestActor的tick就会不停的输出日志 我在用cdt连上调试,修改TsTestActor.js,改变输出日志的内容,结果是日志并没有发生变化。
我就是下载最新的demo工程https://github.com/chexiongsheng/puerts_unreal_demo 修改JsEnv.Build.cs,添加PublicDefinitions.Add("WITH_INSPECTOR"); 然后修改QuickStart.ts spawn了一个TsTestActor let u_class = makeUClass(TsTestActor); let test_actor_wyh = world.SpawnActor(u_class, undefined, UE.ESpawnActorCollisionHandlingMethod.Undefined, undefined, undefined) as TsTestActor; 然后运行,这样TsTestActor的tick就会不停的输出日志 我在用cdt连上调试,修改TsTestActor.js,改变输出日志的内容,结果是日志并没有发生变化。
我也是这么测试,断点查看确实有跑到 hot_relaod.js发送新脚本的逻辑,但就是不生效,在actor 的 tick里打印日志。
请问这个问题解决了吗,同样遇到了
请问这个问题解决了吗,同样遇到了
没有解决。 但是应该是我自己环境的问题,同项目的同事,是可以正常调试的和热刷新的