尧图精选

Unity 3D+C#满族刺绣虚拟展馆交互漫游实战

🕒 发布时间:2026/9/18 11:52:10 📁 来源:尧图网络
做非遗主题虚拟展馆的这几年我手上这个满族刺绣展馆算是真正跑通的一个。前两版都死在中途第一版把全部精力砸在模型精度上观众戴着设备进门三分钟就开始眩晕第二版交互做得花哨可展柜里的绣片看上去像贴了张A4打印纸一点丝线的光泽都没有。到第三版我才想明白一件事——虚拟展馆不是把展厅搬到电脑里而是把看展这件事重新设计一遍。这套基于 Unity 3D C# 的满族刺绣文化主题虚拟展馆交互漫游系统核心就是三件事让观众能自然地走、能看得清绣品的针脚、能随手点开每一件绣品背后的故事。技术栈上用的是 Unity 2022 LTSC# 写全部交互逻辑3D 资产走 Blender 摄影测量结合的管线最终同时发布到 PC 端和 WebGL 网页端并留了一体机 VR 的降级分支。如果你是有 C# 基础想找完整落地路径的开发者或者是做数字展陈、非遗数字化方向的在校同学这篇内容能给你省掉不少重复摸索的时间——下面讲的每一条参数和坑都是我自己在项目里踩出来的。1. 这个展馆为什么最终落在 Unity 上1.1 三种技术路线的实际对比立项初期我认真比过三条路纯 Web 前端Three.js、Unreal、Unity。最后选 Unity不是因为 Unity 最强而是因为它的综合性价比在这个体量的项目里最合适。纯 Web 方案的优势是传播成本极低一个链接就能打开不用装任何东西。但它的问题在于光照和材质的上限太低——满族刺绣最抓人的是丝线的方向性反光和绣片在展柜玻璃后的层次感Three.js 要用自写着色器去补这些东西工作量会直接翻倍。而且一旦展品数量上到五六十件、场景三角面数上百万浏览器的内存和帧率就很难看。Unreal 的渲染效果确实降维打击Nanite 和 Lumen 能直接省掉大量烘焙工作。但代价是构建体积大、上手曲线陡团队里如果只有我一个人能改材质后期维护会变成单点依赖。而且 WebGL 方向的导出体验说实话不如下面要讲的 Unity 方案顺手。Unity 卡在中间URP 管线足够把绣片质感做出来C# 的开发效率高一套工程可以同时导出桌面端、WebGL 和 Android 一体机Asset Store 上现成的交互组件也能省时间。对于一个三到六个月周期、两三个人规模的项目这是最不容易翻车的选择。对比维度Three.jsUnrealUnity传播门槛最低开链接即用高需安装中WebGL 可开链接材质表现上限中需自写着色器极高高URP/HDRP 可调大场景性能受浏览器内存限制最好好可控多端发布仅 Web桌面/主机为主桌面/Web/移动/一体机团队上手成本前端基础即可较高中C# 友好1.2 渲染管线选 URP 而不是 Built-in管线选择这一步很多人会犹豫我的结论是只要你不是必须依赖某些只在 Built-in 下能跑的老插件就选 URP。理由有三个。第一URP 的 Shader Graph 让我能快速试出一种丝线反光的自定义材质不用去啃手写 HLSL。做法是把各向异性高光近似成一张方向性遮罩乘以高光强度虽然不如 HDRP 的物理各向异性精确但在展柜玻璃的反射叠加下视觉上已经足够以假乱真。第二URP 的渲染特性Renderer Feature体系很干净我想加一个选中展品描边的后处理效果只需要挂一个 Renderer Feature比在 Built-in 里改 CommandBuffer 舒服太多。第三移动端和一体机方向的兼容性更好URP 的移动端预设基本可以直接用。需要提醒的是Unity 2022 里 URP 的版本号是跟着编辑器走的别去 Package Manager 里乱升版本我见过有人把 URP 升到高版本后所有材质集体变粉红回退花了一下午。2. 空间尺度、动线与第一人称控制器2.1 用米当单位先把展馆量出来虚拟展馆最容易犯的错是把尺寸随手填。Unity 默认 1 个单位是 1 米这是个必须遵守的约定一旦破掉后面所有物理、光照、阴影距离都会跟着歪。我的做法是先按真实展馆画平面图主展厅开间 12 米 × 18 米层高 4.2 米过渡廊道宽 2.4 米展柜高度 1.1 米柜体进深 0.6 米。观众视点高度设为 1.65 米——这个数字很关键1.6 偏矮会有蹲着看展的压抑感1.75 又会让人觉得自己在飘。我最后在 1.62 到 1.68 之间试了三轮1.65 是最自然的。展品间距也要按观看距离算。人在静止观看时的舒适距离大约是展品对角线长度的 1.5 到 2 倍。一件 0.4 米宽的绣片最佳观看距离在 0.8 到 1.0 米之间。这就要求相邻展柜的间距不能小于 1.8 米否则两个人同时看展会互相挡视线。这些数字看着琐碎但它们是整个漫游体感的地基。提示建模阶段就把所有物体按 1 单位 1 米导入并在 Blender 里先 Apply Scale。导入 Unity 后再放大 100 倍的做法会让烘焙和物理全部出问题。2.2 CharacterController 的六个参数分别管什么第一人称漫游我一开始想用 Rigidbody 加力去做结果在楼梯和门槛上一直卡。后来换成 CharacterController问题基本消失。它的参数不多但每一个都直接影响手感。Slope Limit 我设成 45 度这是控制器能爬上去的最大坡度展馆里有几级缓坡台阶正好卡在 30 度以内很安全。Step Offset 设 0.3代表能自动迈过 30 厘米的台阶展馆门槛高度是 12 厘米绰绰有余。Skin Width 建议设成 Radius 的 10%我用的是 Radius 0.3、Skin Width 0.03这个值太小会导致穿墙抖动太大又会让人浮在地面上。Center 这个参数经常被忽略它决定了胶囊体的中心相对物体原点的偏移。我把 Center 的 y 设成 0.9让胶囊底部正好贴地相机挂在胶囊顶部往下一点的位置。移动速度上观展不是打游戏走路速度 2.2 米/秒就够了奔跑给到 4.0 米/秒。加速度用插值而不是直接赋值否则起步和停下会有明显的顿挫感。using UnityEngine; using UnityEngine.InputSystem; [RequireComponent(typeof(CharacterController))] public class VisitorController : MonoBehaviour { [Header(移动)] public float walkSpeed 2.2f; public float runSpeed 4.0f; public float acceleration 12f; [Header(视角)] public Transform cameraPivot; public float mouseSensitivity 0.12f; public float pitchLimit 75f; [Header(物理)] public float gravity -18f; private CharacterController cc; private Vector3 horizontalVelocity; private float verticalVelocity; private float pitch; void Awake() cc GetComponentCharacterController(); void Update() { Look(); Move(); } void Look() { Vector2 delta Mouse.current.delta.ReadValue() * mouseSensitivity; transform.Rotate(Vector3.up, delta.x); pitch Mathf.Clamp(pitch - delta.y, -pitchLimit, pitchLimit); cameraPivot.localEulerAngles new Vector3(pitch, 0f, 0f); } void Move() { var kb Keyboard.current; Vector2 input Vector2.zero; if (kb ! null) { if (kb.wKey.isPressed) input.y 1f; if (kb.sKey.isPressed) input.y - 1f; if (kb.dKey.isPressed) input.x 1f; if (kb.aKey.isPressed) input.x - 1f; } input Vector2.ClampMagnitude(input, 1f); float target kb ! null kb.leftShiftKey.isPressed ? runSpeed : walkSpeed; Vector3 desired (transform.right * input.x transform.forward * input.y) * target; horizontalVelocity Vector3.Lerp(horizontalVelocity, desired, acceleration * Time.deltaTime); if (cc.isGrounded verticalVelocity 0f) verticalVelocity -2f; verticalVelocity gravity * Time.deltaTime; cc.Move((horizontalVelocity Vector3.up * verticalVelocity) * Time.deltaTime); } }2.3 动线设计比场景好看更重要展馆做出来好不好用一半看动线。我的做法是在平面图上先画一条必看主线入口 → 序厅满族刺绣的历史脉络→ 针法区平针、锁绣、打籽、补绣的对比展示→ 纹样区枕顶、荷包、云肩、幔帐上的蝴蝶、石榴、盘长纹→ 互动区观众可以自己配线配色→ 出口。这条主线的宽度留 2.6 米支线岔路做窄一点1.8 米用地面材质和灯光亮度做隐形引导——主线上地面亮一点、顶灯密一点观众会下意识往亮的地方走。这个技巧比放箭头指示牌优雅得多而且不破坏展厅的整体氛围。另一个细节是回望视野。观众走完主线回头时应该能看到一个有记忆点的画面比如一面通高的绣片墙或者一个旋转的纹样装置。这个位置我放了一面 6 米高的幔帐复原模型配顶部洗墙灯几乎所有人走到出口都会回头拍一张。3. 刺绣展品从实物到引擎的资产管线3.1 什么该建模什么该用贴图解决一开始我想把所有展品都做成高精度模型结果第一件荷包就建了两天三角面数到了八万摆进展厅里和其他展品风格完全不统一。后来我定了一条规则只有观众会绕着看的展品才做完整三维其余一律用底板 法线贴图做浮雕式呈现。具体分三档A 档完整三维荷包、香囊、小件佩饰这类是立体的观众会想看侧面和背面。单件控制在 15000 到 30000 三角面。B 档半立体云肩、枕顶、袖口镶边做成微起伏的曲面片起伏靠法线贴图提供。单件 2000 到 5000 三角面。C 档平面板大面积的幔帐、旗袍面料直接一张贴图贴在平面上靠材质球做出织物质感。单件 200 面以内。这个分档让总面数从 180 万压到 60 万左右帧率直接翻倍而观众几乎看不出区别——因为看展时的注意力集中在图案和针脚上而不是几何精度。3.2 绣线质感不靠分辨率靠这几张图把贴图分辨率从 1024 提到 4096绣片的观感提升其实很有限。真正让它活过来的是这几张图的配合。Albedo底色是最基础的一张但要注意刺绣的颜色是有层次的同一块红色在平针区偏亮、在打籽区偏暗。如果直接拿照片当 Albedo会因为拍摄时的环境光被烤进去导致在引擎里怎么打光都发灰。我的做法是在修图软件里先做一次去光照处理把明暗关系剥掉只留色相和彩度信息再重新在引擎里打光。Normal Map法线贴图是绣线立体感的核心。这里有个取巧办法把绣线走向用一张灰度图表示出来亮的地方是线脊、暗的地方是线沟再转成法线贴图。这样每一根线的凸起方向都是对的侧光一打就会出现真实的丝线反光带。Roughness粗糙度必须做变化。真实的绣线在不同角度下粗糙度不同如果全图给一个常数材质就会显得像塑料。我的做法是把法线贴图的灰度反过来当粗糙度遮罩用——线脊处粗糙度低一点0.25 左右线沟处高一点0.6 左右效果立刻上一个台阶。Ambient OcclusionAO用减法烘焙或者直接在引擎里烘主要压住针脚之间的缝隙让绣片有厚度。贴图尺寸建议关键设置Albedo2048×2048去光照处理sRGB 勾选Normal2048×2048导入类型选 Normal Map不勾 sRGBRoughness1024×1024单通道打包不勾 sRGBAO1024×1024单通道不勾 sRGB遮罩图1024×1024把 Roughness/Metallic/AO 打包进 R/G/B 通道3.3 资产导入 Unity 的规范化清单资产一多导入设置如果不统一后面调材质会疯掉。我给自己定了一份检查表每次导入必过一遍。Model 标签页Scale Factor 保持 1Convert Units 勾选Generate Colliders 只给需要交互的物体勾。法线方向Import Normals 用默认别选 Calculate否则硬边会糊。Read/Write Enabled 默认关闭除非确实要在代码里改 Mesh开着会白占内存。Mesh Compression 展品类选 Off 或 Low压缩过头会让绣片边缘出现锯齿。材质 Material Creation Mode 选 None手动绑材质避免一堆自动生成的重复材质球。所有展品统一挂在Exhibits目录下命名前缀带展品编号方便批量脚本处理。4. C# 交互层射线拾取与数据驱动4.1 为什么展品数据要走 ScriptableObject最早我把展品名称、简介、针法这些信息直接写在挂在物体上的 MonoBehaviour 里。做到第 20 件的时候问题来了改一个字段要挨个点开对象而且美术一旦重新导模型挂的脚本就全丢了。换成 ScriptableObject 之后所有展品信息变成独立的 .asset 文件放在Assets/Data/Exhibits下。好处很直接可以用编辑器脚本批量改可以导出成 Excel 做校模型替换不影响数据而且这些数据在运行时是共享引用几十件展品只占一份内存。using UnityEngine; [CreateAssetMenu(fileName Exhibit_, menuName 展馆/展品数据)] public class ExhibitData : ScriptableObject { [Header(基础信息)] public string exhibitId; public string displayName; [TextArea(2, 4)] public string summary; [Header(工艺信息)] public string stitchPattern; public string motif; public string eraAndRegion; [Header(展示资源)] public Sprite thumbnail; public AudioClip narration; public GameObject highDetailPrefab; [Header(聚焦参数)] public Vector3 focusOffset new Vector3(0f, 1.5f, 0f); public float focusDistance 1.2f; }再写一个继承 ScriptableObject 的数据总表把所有展品按区域分组方便做导览模式和统计。4.2 一条射线搞定拾取与反馈拾取系统我用接口 射线探针的组合。先定一个IInteractable接口所有可交互物体实现它再写一个探针脚本每帧从相机中心发一条射线检测到新目标就切换焦点。交互距离我定的是 2.8 米。这个数字不是随便来的观众站在展柜前眼睛到展品的距离大约 1.2 到 1.5 米考虑到展柜玻璃会挡住一部分探针真正打到的是展柜内的碰撞体所以要留出余量。最开始我设 5 米结果站在大厅中央就能隔空点亮三件展品非常出戏。public interface IInteractable { string Prompt { get; } void OnFocusEnter(); void OnFocusExit(); void OnInteract(); }using UnityEngine; public class InteractionProbe : MonoBehaviour { public Camera viewCamera; public float reach 2.8f; public LayerMask interactMask; public KeyCode interactKey KeyCode.E; private IInteractable current; void Update() { IInteractable hit Probe(); if (!ReferenceEquals(hit, current)) { if (current ! null) current.OnFocusExit(); current hit; if (current ! null) current.OnFocusEnter(); } if (current ! null Input.GetKeyDown(interactKey)) current.OnInteract(); } IInteractable Probe() { Ray ray new Ray(viewCamera.transform.position, viewCamera.transform.forward); if (Physics.Raycast(ray, out RaycastHit info, reach, interactMask, QueryTriggerInteraction.Collide)) return info.collider.GetComponentInParentIInteractable(); return null; } }有个坑必须提GetComponentInParent比GetComponent更适合展品因为展品的碰撞体往往挂在子物体上比如荷包的碰撞体是简化过的盒子接口实现在父物体上。用GetComponent会返回 null调试时会让人怀疑射线根本没打中。4.3 焦点高亮与信息面板的三个细节高亮我试过三种方案。最简单的是改材质 Emission缺点是会污染原始材质多个展品共享材质时会串色。第二种是描边后处理效果最好但需要额外 Renderer Feature移动端开销大。最后我用的是叠加一层高亮壳在展品位置放一个略大一圈的复制体材质用纯色 半透明只在高亮时启用。这个方案的优势是零后处理开销缺点是展品形状复杂时复制体面数高。我折中了一下高亮壳用的是展品的低模版本面数只有原模型的十分之一视觉上完全够用。信息面板用 TextMeshPro 世界空间 Canvas。这里有三个细节第一面板朝向。不要让它永远面向相机Billboard那样观众绕着看的时候面板会跟着转很晕。我改成面板固定在展品旁边只在触发时用一个 0.25 秒的缓动从展品位置滑出来。第二文字长度。满族刺绣的工艺介绍很容易写长面板上超过 6 行就没人看了。我的做法是面板只显示名称、针法、年代三行详细内容放在展开按钮后面。第三音频。每件展品配一段 40 到 60 秒的讲解音频触发时播放。这里要注意音频源的位置——如果挂在展品上观众走远后声音会衰减到听不见体验很割裂。我改成播放时把 AudioSource 挂到相机下的一个空物体上音量恒定。5. 光照烘焙与阴影调试绣片能不能立住看这一步5.1 Mixed Lighting 的配置思路展馆里百分之九十的物体是静止的所以光照烘焙是最优解。我把 Lighting Mode 设成 Baked Indirect天空盒和主方向光设为 Mixed其余补光全部 Baked。关键参数是 Lightmap Resolution。展品区的绣片墙我用了 40 texels/unit普通墙面 15 就够地面 8。分辨率不是越高越好一个 12×18 米的展厅如果全用 40烘焙一次要四十分钟而且光照贴图内存能吃到 800MB。分区设置能把烘焙时间压到十二分钟左右。Lightmap Padding 设 4 像素防止相邻展品的贴图边缘互相渗色。这个值设小了会出现隔壁展柜的暖黄光渗到我这块绣片上的问题非常难排查。还有一点所有需要烘焙的物体必须勾 Static包括展柜玻璃。玻璃如果没勾 Static它就不会参与间接光计算展柜内部会黑成一片。提示展品替换后要重新烘焙。如果只是替换了同尺寸模型的 Mesh可以不勾 Static 让它在运行时用 Light Probe 接收环境光代价是少了自身的间接光反弹。5.2 阴影穿透、漏光和 peter panning 的排查顺序阴影问题我遇到过三种排查顺序建议固定下来别乱试参数。第一种是 shadow acne自阴影条纹表现是物体表面出现一条条明暗相间的斜纹。原因是阴影贴图的分辨率和深度偏移不匹配。解决顺序先降 Bias从 0.05 降到 0.02再降 Normal Bias从 0.4 降到 0.15最后才考虑提高 Shadow Resolution。我一般把方向光的 Shadow Resolution 定在 Medium2048Bias 0.02、Normal Bias 0.2这个组合在展馆场景里基本通吃。第二种是 peter panning阴影脱离物体表现是物体明明放在地上阴影却飘在脚边。这通常是 Bias 设太大导致的。如果降低 Bias 之后 acne 又回来了那就是阴影贴图分辨率不够这时候才需要调高分辨率或者缩小 Shadow Distance。第三种是漏光表现是墙角和展柜缝隙里出现不应该有的亮边。这个八成不是阴影问题而是烘焙的 Lightmap Padding 太小或者模型接缝处有缝隙。先检查模型是否完全贴合用 ProBuilder 快速补一块密封面再调 Padding。Shadow Distance 我设的是 30 米配合四级级联阴影Cascade Count 4。展馆纵深 18 米30 米足够覆盖全部可见区域同时保证近处阴影精度。设到 100 米的话近处阴影会糊成一片。现象最可能原因处理顺序表面斜向条纹阴影 Bias 过小降 Normal Bias → 降 Bias → 提分辨率阴影与物体分离Bias 过大降 Bias必要时提分辨率墙角亮边烘焙 Padding 或模型缝隙补密封面 → 调 Padding 到 4阴影边缘锯齿级联数或分辨率不足Cascade 提到 4 → 提 Shadow Resolution6. 性能预算与多端发布6.1 先把预算定死再动手优化优化最大的敌人是没有目标。我在项目开始就定了三条线的预算指标PC 端WebGL一体机目标帧率603072Draw Call 300 150 200三角面总数 120 万 50 万 80 万实时阴影开启关闭只用烘焙关闭只用烘焙后处理抗锯齿 轻微泛光无无纹理内存 1.5GB 300MB 500MB定完预算之后优化就有了方向。最有效的手段依次是静态合批把所有不动的展柜、地面、墙面标记 Static Batching、遮挡剔除Occlusion Culling展厅是典型的隔断空间效果极好、LOD远处展品用低模、纹理压缩PC 用 DXT/BC移动端用 ASTC。静态合批有一个反直觉的点它会增加内存占用因为要存合并后的网格所以在内存紧张的 WebGL 端要慎用大场景的静态合批或者只对同一材质的小物件合并。6.2 WebGL 部署到 IIS 的几个坑WebGL 发布后传给客户第一条常见反馈是打开一片白。九成是服务器 MIME 类型没配。IIS 默认不认识 .wasm 和 .data 后缀需要在站点根目录放一个 web.config?xml version1.0 encodingUTF-8? configuration system.webServer staticContent remove fileExtension.data / mimeMap fileExtension.data mimeTypeapplication/octet-stream / remove fileExtension.wasm / mimeMap fileExtension.wasm mimeTypeapplication/wasm / remove fileExtension.symbols.json / mimeMap fileExtension.symbols.json mimeTypeapplication/octet-stream / /staticContent /system.webServer /configuration第二个坑是压缩。Unity 在 Build Settings 里可以选 Gzip 或 Brotli 压缩好处是包体小很多坏处是服务器必须配置对应的解压支持Brotli 需要 IIS 装扩展。如果你想省事就勾上 Decompression Fallback让 Unity 在运行时用 JS 解压代价是首屏加载慢几秒。给不熟悉服务器配置的甲方交付时我一般直接选这个兜底方案。第三个坑是内存。WebGL 的默认堆内存是 256MB展馆场景如果纹理吃得多会直接崩。可以在 Player Settings 的 Publishing Settings 里把 Memory 提到 512MB 以上但别超过 1024MB浏览器在移动端扛不住。第四首次加载。整个包体 60MB 的话首次加载要等半分钟。我的做法是做一个 HTML 加载页把 Unity 的进度回调接出来显示百分比再配上满族刺绣的纹样做背景等待焦虑感会低很多。6.3 一体机和移动端的降级策略一体机方向我做过一版核心改动有四处。第一渲染路径改成 Single Pass Instanced这是 VR 里最省性能的模式能让双眼的 Draw Call 近乎减半。第二必须锁帧并且稳定在 72 帧PICO 4 的刷新率掉帧带来的眩晕感比画面差更致命。第三所有后处理关掉抗锯齿改用 MSAA 4x。第四交互从手柄射线改成头部瞄准 单手确认因为长时间抬手会很累。还有一个细节是移动速度。VR 里 2.2 米/秒的速度太快了会引起明显的晕动症。我最后把速度降到 1.2 米/秒并且加了一个瞬移的备选模式——按下摇杆后出现一个落点指示器松开直接跳过去晕的人可以切到这个模式。移动端手机浏览器我基本放弃了这个场景因为展馆需要精细观看手机屏幕太小不如把精力放在 PC 和一体机上。如果确实要出手机版建议只保留定点导览模式去掉自由漫游。7. 几个卡了我两天以上的问题7.1 材质集体变粉红管线切换的批量修复这个坑几乎所有从 Built-in 转 URP 的人都会踩。原因是原材质的着色器在 URP 下找不到Unity 就把它渲染成亮粉色当作错误提示。批量修复的方法是菜单 Window → Rendering → Render Pipeline Converter选 Built-in to URP勾选 Material Upgrade全选后转换。但要注意这个转换只对 Standard 着色器有效如果你之前用过一些自定义着色器它转不了得手动重建。我踩的更深的一层坑是转换完之后有一部分材质球变成过期状态Inspector 里显示 Missing Shader原因是这些材质引用的着色器被删了。解决办法是把材质的 Shader 手动改成 URP/Lit再把原来的贴图重新拖一遍。7.2 烘焙后物体漂移Static 标记的连带效应有一次烘焙完之后展厅里的一个旋转展台突然不动了代码明明还在转但视觉上纹丝不动。查了两个小时才发现这个展台被美术误勾了 Static烘焙的时候 Unity 把它当成了静态物体合批进 Lightmap Static 网格运行时的 Transform 变化对渲染无效。这个问题很阴因为 Console 里没有任何报错。排查思路是先在 Scene 视图里选中物体看 Inspector 右上角是否有 Static 勾选再在 Rendering 调试视图Shaded Wireframe 或 Albedo里看它是否被画在了非预期的位置。教训就是所有需要运行时移动、旋转、缩放的物体一律不勾 Static。我在项目后期加了一个编辑器脚本扫描所有被标记 Static 但运行时位置会变的物体直接在 Console 里报出来。7.3 UI 点击穿透一根射线打中两个目标第三版上线前测试发现点展开按钮的时候背后的展柜也会被触发交互。原因是我用了两套射线UI 用 EventSystem场景用 Physics.Raycast两者互不知情。解决办法是在探针脚本里加一道判断if (EventSystem.current ! null EventSystem.current.IsPointerOverGameObject()) return; // 指针在 UI 上跳过场景交互如果用的是新输入系统这个方法在某些设备上会有延迟更稳的做法是继承IPointerEnterHandler和IPointerExitHandler自己维护一个指针是否在 UI 上的布尔值再给探针读。我用的是后者因为一体机和触屏设备上都验证过没有出现延迟丢帧。还有一个相关的小坑世界空间 Canvas 上的按钮如果 Canvas 没挂 Graphic Raycaster是点不动的。这个问题新手极容易卡住因为按钮的 Interactable 明明是勾上的就是没反应。7.4 关于展品信息的几句实在话满族刺绣的内容整理比技术更难。我在写针法介绍的时候一开始用了很多精美绝伦巧夺天工这类形容词后来全部删掉了。观众想看的是这件绣片用的是平针还是打籽纹样为什么是蝴蝶和石榴什么年代的人会在什么场合用它。把这三件事说清楚比任何形容词都有说服力。数据字段里我专门留了一个eraAndRegion因为这个信息对观众理解展品影响很大——同一件枕顶清末民初和二十世纪中期的配色和题材差别很明显。这类细节写进去展馆才有信息量而不只是好看。跑完整个项目回看虚拟展馆真正难的地方从来不是把模型放进去而是让观众在里面的每一分钟都不别扭走起来不晕、看得清细节、点得到想点的地方、听得懂讲解在说什么。技术在幕后体验在台前这句话我在这个项目里算是彻底体会了一遍。如果后面要做扩展我打算加一个观众自己配色的互动模块让手绣纹样在屏幕上实时换线色这可能是让年轻人真的坐下来的唯一办法。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →