puerts icon indicating copy to clipboard operation
puerts copied to clipboard

[Unreal] 关于手机调试热刷新的问题

Open wangyhbupt opened this issue 2 years ago • 23 comments

detail | 详细描述

之前在使用Chrome DevTools进行手机调试的时候,直接修改js代码,然后Ctrl+S保存后。代码就会立即生效。 但是最近发现这个功能貌似没有了。 不知道是否是跟这个功能 UE4下基于V8实现的代码热刷新 https://zhuanlan.zhihu.com/p/364505146 有冲突?

wangyhbupt avatar Jun 22 '22 06:06 wangyhbupt

cdt保存后刷新是V8提供的功能。 《UE4下基于V8实现的代码热刷新》这个老早就加了,应该没影响。 你看是不是v8版本变了导致的?ue4.25及以上之前默认7.7,后面改为默认8.4

chexiongsheng avatar Jun 22 '22 07:06 chexiongsheng

你之前可以的puerts的版本是哪个?

chexiongsheng avatar Jun 22 '22 07:06 chexiongsheng

puerts的版本 在哪里能够看到? 我看了一下大概的时间 应该是2021年7月初的时候,还是可以的

wangyhbupt avatar Jun 22 '22 07:06 wangyhbupt

《UE4下基于V8实现的代码热刷新》在21年三月份就添加了

chexiongsheng avatar Jun 22 '22 08:06 chexiongsheng

我试了下在编辑器下是可以的。

chexiongsheng avatar Jun 22 '22 09:06 chexiongsheng

是的 编辑器下的确是可以的 ,但是在手机上就不行

wangyhbupt avatar Jun 22 '22 09:06 wangyhbupt

在补充一些细节 比如我的js文件是 image

在没有修改此文件的时候,在此文件中打断点,断点会正常命中。 当我在DevTools中修改次文件并保存后。观察游戏内表现,发现代码并未生效。 而断点也无法命中了。 此时,关闭DevTools,然后再次打开DevTools连上手机,会发现上述文件是修改后的样子,打断点会命中,但是就会打开另一个文件: image 而这个文件则是未修改前的样子。

wangyhbupt avatar Jun 22 '22 10:06 wangyhbupt

路径导致的

chexiongsheng avatar Jun 22 '22 11:06 chexiongsheng

你试试抓下包,DevTools的调试页面也是被调试,你调试这个页面就能看到包了。看下他们是怎么交互的。 puerts在其中的角色就透传而已。

chexiongsheng avatar Jun 22 '22 11:06 chexiongsheng

和这个过程有关的一个是v8版本。 另外一个是: https://github.com/Tencent/puerts/commits/master/unreal/Puerts/Source/JsEnv/Private/DefaultJSModuleLoader.cpp 。这个影响了路径 你分别切换到之前的版本试试。

chexiongsheng avatar Jun 22 '22 11:06 chexiongsheng

确认了一下 ,之前我们用的一直就是v8引擎的8.4版本 然后DefaultJSModuleLoader.cpp 回退到之前的版本,也还是不行 抓包结果如下 image 可以看到确实调用了SetScriptSource, 并且查看param,也的确是修改后的文件。 但是手机上 就是不会生效。而编辑器上就会生效。

wangyhbupt avatar Jun 27 '22 08:06 wangyhbupt

看看手机的抓包和编辑器的有什么区别?

chexiongsheng avatar Jul 04 '22 02:07 chexiongsheng

没有区别

wangyhbupt avatar Jul 05 '22 01:07 wangyhbupt

会不会和这里有一定关系:

#if PLATFORM_MAC
        FString FormattedScriptUrl = DebugPath;
#else
        // 修改URL分隔符格式,否则无法匹配Inspector协议在打断点时发送的正则表达式,导致断点失败
        FString FormattedScriptUrl = DebugPath.Replace(TEXT("/"), TEXT("\\"));
#endif

按道理来说,应该是只有window采用'',这逻辑不太对,变成了除mac都用''了

chexiongsheng avatar Jul 08 '22 06:07 chexiongsheng

会不会和这里有一定关系:

#if PLATFORM_MAC
        FString FormattedScriptUrl = DebugPath;
#else
        // 修改URL分隔符格式,否则无法匹配Inspector协议在打断点时发送的正则表达式,导致断点失败
        FString FormattedScriptUrl = DebugPath.Replace(TEXT("/"), TEXT("\\"));
#endif

按道理来说,应该是只有window采用'',这逻辑不太对,变成了除mac都用''了

这我改了,你更新到最新代码试试?

chexiongsheng avatar Jul 08 '22 08:07 chexiongsheng

我更新到最新 结果连编辑器下都不行了 为了避免我自己工程带来的影响,我使用puerts_unreal_demo工程也试了一下,也是编辑器下都不行了

wangyhbupt avatar Jul 18 '22 10:07 wangyhbupt

我更新到最新 结果连编辑器下都不行了 为了避免我自己工程带来的影响,我使用puerts_unreal_demo工程也试了一下,也是编辑器下都不行了

你怎么试?试的哪个脚本?

chexiongsheng avatar Jul 19 '22 03:07 chexiongsheng

我刚刚亲测用cdt ctrl+s保存能热更新

chexiongsheng avatar Jul 19 '22 04:07 chexiongsheng

你在cdt上修改的是ts还是js?我修改js没问题。

chexiongsheng avatar Jul 19 '22 04:07 chexiongsheng

我就是下载最新的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,改变输出日志的内容,结果是日志并没有发生变化。

wangyhbupt avatar Jul 20 '22 07:07 wangyhbupt

我就是下载最新的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里打印日志。 image

scutDavid avatar Sep 17 '22 14:09 scutDavid

请问这个问题解决了吗,同样遇到了

cmatachuan avatar Nov 17 '23 03:11 cmatachuan

请问这个问题解决了吗,同样遇到了

没有解决。 但是应该是我自己环境的问题,同项目的同事,是可以正常调试的和热刷新的

wangyhbupt avatar Nov 20 '23 15:11 wangyhbupt