下载 App
荒野猎手 开发者日志(四)
10/122 浏览
一、为什么要加进入自由射击界面的进度条
3D 射击场景切换是同步销毁+重建的过程。EnterPseudo3D 里要先 Destroy 旧场景(如果有的话),再 HuntingScene.Create 新建——这一步同时初始化地面(128×128 噪声纹理循环写入)、天空(复制配置、删纹理节点、生成渐变立方体贴图)、远景圆柱(1500 米半径 64 面体)、240 棵草的节点树、以及武器场景里的猎人模型和枪械骨骼。在低端手机上,这些初始化一次性做完会卡 200-500ms,玩家看到的是黑屏或上一帧残留。
加进度条的目的不是让用户等得更久,而是把"卡死感"变成"加载感"。进度条可以按初始化阶段拆分:地面生成 → 天空创建 → 远景加载 → 动物模型缓存预热 → 武器场景构建。每个阶段更新一次进度百分比,UI 线程保持刷新,玩家至少知道系统在动,不会以为 App 崩了。
另一个作用是暴露加载瓶颈。加了进度条之后,你会发现卡在哪个阶段——如果 70% 的时间花在地面噪声纹理生成上,就会意识到需要把地面改成预生成的静态贴图,或者把噪声计算拆到分帧协程里。


二、如何做 3D 场景(TapTap Maker / UrhoX 的双场景渲染方案)
核心问题是:第一人称射击的"枪不动、世界转"在单场景里做不到,因为枪会绕玩家原点旋转,准星和枪口永远对不上。
解决方案:双场景 + 双 RenderTarget。
世界场景(Scene + Camera):
- 地面:128×128 噪声纹理 → Texture2D → BoxGeometry(1,1,1) 缩放成 6800×6800 的平面
- 天空:复制 DiffSkybox.xml 配置,删掉 texture 节点,换成代码生成的渐变 SkyUtils.MakeGradientCubemap
- 远景:圆柱(CylinderGeometry,半径 1500,高 445,64 段),内侧贴照片,每帧 position 跟随玩家平移
- 草:240 个 StaticModel 节点,锚在 120 米网格上,每帧 grassRoot.position = floor(playerX/120+0.5)*120
- 动物:12 个物种的 Model + PBRDiffNormal 材质,Metallic=0,Roughness=0.88,体重立方根缩放
武器场景(独立 Scene + 独立 Camera):
- 完整猎人模型(AnimatedModel),双手骨骼绑定枪械
- 相机 FOV 64°,近裁剪面 0.01 米,比世界场景的 0.05 米更近——确保枪身不穿出屏幕
- 枪和双手的所有动画(拉栓、换弹、瞄准晃动)走骨骼变换,不是整体位移
合成方式:
两个场景各自渲染到 Texture2D(TEXTURE_RENDERTARGET),通过 nvgCreateVideo 绑定到 NanoVG 纹理,再 nvgImagePattern 画到 UI 画布上。平台判断 NeedsRenderTargetFlip——Web/Android/iOS/HarmonyOS 必须翻 Y 轴,否则画面上下颠倒。#聚光灯gamejam开发者日志 #TapTap聚光灯游戏创作挑战
两个场景各自渲染到 Texture2D(TEXTURE_RENDERTARGET),通过 nvgCreateVideo 绑定到 NanoVG 纹理,再 nvgImagePattern 画到 UI 画布上。平台判断 NeedsRenderTargetFlip——Web/Android/iOS/HarmonyOS 必须翻 Y 轴,否则画面上下颠倒。#聚光灯gamejam开发者日志 #TapTap聚光灯游戏创作挑战











