Unity塔防游戏开发实战:从丧尸围城项目掌握核心模块与性能优化
1. 项目概述与核心思路最近在社区里看到不少朋友对Unity游戏开发感兴趣特别是想从一个小而完整的项目入手快速体验从零到一的开发流程。我自己也带过不少新人发现“丧尸围城”这类塔防/生存类小项目确实是个绝佳的练手选择。它麻雀虽小五脏俱全几乎涵盖了Unity游戏开发中大部分核心模块从场景搭建、角色控制、AI寻路、战斗系统到UI交互和简单的资源管理。今天我就以“丧尸围城”这个小项目为蓝本和大家深入聊聊它的实现思路、核心模块拆解以及开发过程中那些容易踩坑的细节。无论你是刚学完Unity基础语法的新手还是想巩固实战经验的中级开发者相信这篇分析都能给你带来一些启发。这个项目的核心玩法很直观玩家控制一个角色比如士兵或幸存者在一个固定的场景如废弃城镇、军事基地中抵御一波波来袭的丧尸。丧尸会从地图边缘的生成点不断涌现并自动寻路向玩家角色发起攻击。玩家需要利用场景中的障碍物、武器近战或远程以及可能的防御工事如路障、陷阱来生存尽可能长的时间或者完成特定的防守目标。整个项目的技术栈完全基于Unity引擎不依赖复杂的第三方框架旨在用最纯粹的Unity功能实现完整的游戏逻辑。2. 核心模块设计与技术选型2.1 场景与角色系统架构一个清晰的架构是项目成功的基础。对于这个小项目我建议采用基于GameObject和组件的经典Unity架构但要有意识地做好模块分离。2.1.1 场景管理场景不仅仅是美术资源的堆砌。我们需要一个GameManager单例来统筹全局。它负责游戏状态的切换如准备、进行中、胜利、失败、波次管理、分数计算和游戏暂停/继续。波次管理是核心我通常会设计一个WaveManager脚本挂载在空物体上它内部维护一个波次配置列表ScriptableObject是个好选择包含每波丧尸的数量、类型、生成间隔和生成点信息。GameManager在每波开始时通知WaveManager后者再按配置逐个生成丧尸。2.1.2 玩家角色控制玩家角色是项目的核心交互点。控制方案的选择直接影响手感。对于这种俯视角或第三人称的生存游戏我强烈推荐使用Unity的新输入系统Input System Package。它比传统的Input.GetAxis更灵活、更易于配置并且完美支持键鼠、手柄等多设备。玩家控制器脚本如PlayerController需要处理移动通过输入系统获取移动向量通常结合CharacterController组件或刚体Rigidbody来实现移动和碰撞。使用CharacterController更简单但物理反馈弱使用刚体Rigidbody.MovePosition或AddForce则物理感更真实但需要处理更多细节如防止滑墙。旋转/朝向让角色始终面向鼠标或右摇杆的方向。可以通过从摄像机发射射线到鼠标点击的地面位置计算方向向量然后用Quaternion.LookRotation或Transform.LookAt让角色朝向该方向。记得只旋转Y轴保持角色直立。动画状态机使用Animator Controller来管理角色的闲置、移动、攻击、受伤、死亡等状态。动画参数如Speed, IsAttacking由控制器脚本驱动。2.1.3 丧尸AI设计丧尸AI是项目的另一大核心它决定了游戏的挑战性和趣味性。一个基础的丧尸AI应包含以下状态巡逻空闲状态、追击发现玩家、攻击进入攻击范围、死亡。实现的关键在于状态机State Machine。你可以用枚举和switch语句实现一个简单的有限状态机FSM对于这个小项目完全够用。更优雅的方式是使用状态模式State Pattern每个状态一个类但初期用FSM更直观。寻路是AI的核心。Unity内置的NavMesh系统是首选。你需要在场景中烘焙导航网格NavMesh在Window - AI - Navigation中打开面板在Bake页签设置好Agent的半径、高度、爬坡坡度等参数然后点击Bake。确保所有丧尸可以行走的地面都被烘焙为可行走区域墙壁、高台等障碍物被烘焙为不可行走区域。为丧尸预制体添加NavMeshAgent组件。这个组件会帮你处理复杂的路径寻找和移动逻辑。在丧尸的AI脚本中在“追击”状态下通过NavMeshAgent.SetDestination(playerTransform.position)来让丧尸自动寻路至玩家位置。记得要定期更新目标位置例如每0.5秒一次因为玩家在移动。注意NavMeshAgent的stoppingDistance属性非常重要它决定了丧尸在离目标多远的距离停下。这个距离应该略小于丧尸的攻击范围这样丧尸一进入攻击范围就会停止移动并切换至攻击状态。2.2 战斗与交互系统实现战斗系统是游戏性的直接体现需要处理好伤害计算、攻击反馈和对象交互。2.2.1 伤害体系建立一个清晰的伤害传递流程。我通常会创建一个IDamageable接口任何可以受到伤害的物体玩家、丧尸、可破坏的木箱都实现这个接口。public interface IDamageable { void TakeDamage(float damageAmount, Vector3 hitPoint, GameObject damageSource); void Die(); }然后在玩家和丧尸的脚本上实现这个接口。TakeDamage方法里处理减血、播放受击音效/粒子、触发受击动画等逻辑。当生命值HP降到0时调用Die()方法播放死亡动画、禁用碰撞体、可能触发死亡事件如加分并在几秒后销毁对象或放入对象池。2.2.2 攻击检测攻击检测有多种方式选择取决于攻击类型近战攻击如挥剑在攻击动画的关键帧Animation Event触发时启用一个碰撞体如Box Collider作为攻击范围检测器持续零点几秒。在这个碰撞体的OnTriggerEnter方法中检测碰撞到的物体是否实现了IDamageable如果是则调用其TakeDamage方法。远程攻击如开枪更常用射线检测Raycast。在开枪的瞬间从枪口或摄像机向准心方向发射一条射线。使用Physics.Raycast或Physics.RaycastAll对付穿透效果来检测击中的物体。同样对击中的IDamageable对象造成伤害并可以在击中点生成子弹孔贴花或血花粒子效果。2.2.3 武器与装备系统即使是小项目一个简单的武器系统也能大大增加可玩性。可以设计一个Weapon基类定义攻击力、攻击范围、攻击间隔等属性以及Attack()虚方法。然后派生出MeleeWeapon近战武器和RangedWeapon远程武器等子类实现各自具体的攻击逻辑。玩家控制器持有一个当前武器的引用并在攻击输入时调用当前武器的Attack()方法。你还可以设计一个简单的武器切换逻辑比如按数字键1、2、3切换不同的武器预制体。2.3 UI、音效与数据持久化2.3.1 用户界面UI使用Unity的UGUI系统。核心UI包括HUD平视显示器实时显示玩家生命值、弹药数量、当前波次、击杀数、分数。使用Slider做血条Text组件显示数字信息。游戏状态UI开始菜单、暂停菜单、游戏结束胜利/失败界面。这些界面通常通过Canvas Group控制Alpha和Interactable属性来显示/隐藏或者直接SetActive游戏对象。UI更新的最佳实践是使用事件驱动。例如当玩家生命值发生变化时抛出一个OnPlayerHealthChanged事件血条UI脚本订阅这个事件并更新Slider的value。这样可以避免在Update里每帧去查询玩家状态提升效率。2.3.2 音效管理不要简单地在每个脚本里AudioSource.PlayClipAtPoint。创建一个AudioManager单例来统一管理所有音效和背景音乐的播放。它维护两个AudioSource组件一个用于背景音乐循环播放一个用于音效。同时它有一个字典将音效名称如“PlayerShoot”、“ZombieGroan”映射到对应的AudioClip。其他脚本只需要调用AudioManager.Instance.PlaySFX(“音效名”)即可。2.3.3 数据持久化虽然是小项目但保存最高分、解锁的武器等数据能提升完成度。使用PlayerPrefs是最简单的方式但它不安全且只适合存储简单数据。对于稍复杂的数据如玩家配置、游戏设置可以定义一个可序列化的C#类然后使用JsonUtility.ToJson将其转换为JSON字符串再用PlayerPrefs.SetString保存。读取时反向操作即可。[System.Serializable] public class SaveData { public int highScore; public bool[] weaponsUnlocked; } // 保存 SaveData data new SaveData { highScore 100 }; string json JsonUtility.ToJson(data); PlayerPrefs.SetString(SaveData, json); PlayerPrefs.Save(); // 读取 string json PlayerPrefs.GetString(SaveData); SaveData loadedData JsonUtility.FromJsonSaveData(json);3. 性能优化与资源管理实战当丧尸数量增多、特效频繁播放时性能问题就会凸显。以下几个优化点是这个项目的重中之重。3.1 对象池Object Pooling这是必须实现的优化丧尸、子弹、血花粒子、弹壳等需要频繁创建和销毁的对象如果每次都Instantiate和Destroy会造成严重的GC垃圾回收卡顿。对象池的原理是预先创建一定数量的对象或懒创建放入一个“池子”如队列中。需要时从池中取出并激活使用用完后不是销毁而是失活并放回池中。Unity官方现在提供了ObjectPool类使用起来非常方便。下面是一个丧尸对象池的简化示例using UnityEngine; using UnityEngine.Pool; public class ZombiePoolManager : MonoBehaviour { public GameObject zombiePrefab; private ObjectPoolGameObject pool; private void Start() { // 创建池子创建对象、获取对象、释放对象、销毁对象 pool new ObjectPoolGameObject( createFunc: () Instantiate(zombiePrefab), actionOnGet: (obj) obj.SetActive(true), actionOnRelease: (obj) obj.SetActive(false), actionOnDestroy: (obj) Destroy(obj), defaultCapacity: 20, maxSize: 50 ); } public GameObject GetZombie(Vector3 position, Quaternion rotation) { GameObject zombie pool.Get(); zombie.transform.position position; zombie.transform.rotation rotation; // 初始化丧尸状态 zombie.GetComponentZombieAI().ResetState(); return zombie; } public void ReleaseZombie(GameObject zombie) { pool.Release(zombie); } }在WaveManager中生成丧尸时调用GetZombie丧尸死亡时调用ReleaseZombie。3.2 渲染与Draw Call优化Draw Call是CPU向GPU发送的绘制命令数量越多CPU压力越大。合批Batching确保使用相同材质球和贴图的静态物体如场景中的建筑、地面标记为Static在Inspector右上角Unity会自动进行静态合批。对于大量相同的动态物体如丧尸如果它们使用相同的材质可以考虑使用GPU Instancing在材质球上勾选Enable GPU Instancing能极大降低Draw Call。层级细节LOD为复杂的丧尸模型或场景建筑制作多个不同面数的模型高模、中模、低模。使用LOD Group组件根据物体与摄像机的距离自动切换不同细节层次的模型远处用低模显著减少三角形数量。遮挡剔除Occlusion Culling在大型或室内场景中很多物体被墙壁挡住不需要渲染。在Window - Rendering - Occlusion Culling中烘焙遮挡数据可以避免渲染被完全遮挡的物体。3.3 脚本与逻辑优化避免在Update中做昂贵操作如FindGameObjectWithTag、GetComponent、复杂的物理检测如OverlapSphere。这些操作应该放在Start或Awake中缓存结果或者以较低的频率执行使用InvokeRepeating或自己写一个计时器。使用Tag和Layer进行高效检测在射线检测或碰撞检测时明确指定LayerMask只检测你关心的层。例如将玩家、丧尸、子弹、环境分别放在不同的Layer检测时只检测“丧尸”层避免无谓的检测计算。减少SendMessage和BroadcastMessage这些方法使用反射性能开销大。优先使用C#事件event和delegate或UnityEvent进行组件间通信。4. 开发流程、调试与打包发布4.1 迭代开发与版本控制即使是个人小项目也强烈建议使用版本控制系统如Git。在项目根目录初始化Git仓库使用.gitignore文件忽略Library、Temp、Obj等Unity生成的临时文件夹和构建文件。为每个功能如“实现玩家移动”、“添加丧尸AI”、“设计第一关”创建独立的分支进行开发完成后再合并到主分支。这能让你大胆尝试新想法而不怕搞坏现有功能。4.2 常用调试技巧与工具开发中遇到Bug是常态高效的调试能节省大量时间。Debug.Log是你的好朋友在关键逻辑处输出变量状态。但要注意发布前要清理或使用条件编译[Conditional(“UNITY_EDITOR”)]来避免影响发布版性能。使用断点在Visual Studio中关联Unity项目后可以在代码行左侧点击设置断点在Unity编辑器中以Debug模式运行代码执行到断点处会暂停可以查看所有变量的当前值非常好用。Unity Profiler性能分析神器。通过Window - Analysis - Profiler打开。在游戏运行时它能实时显示CPU、GPU、渲染、内存、音频等各方面的消耗。如果游戏卡顿打开Profiler看看是哪一部分通常是脚本或渲染占用了过多时间。Frame Debugger渲染分析工具。Window - Analysis - Frame Debugger。它能让你一帧一帧地查看Draw Call的绘制过程清晰看到每个Draw Call绘制了什么是分析渲染性能问题的利器。4.3 打包、测试与发布项目完成后打包是最后一步也可能遇到各种问题。平台选择在File - Build Settings中选择目标平台如PC、Mac、Android、iOS。对于“丧尸围城”这种小项目打包成PC独立游戏或WebGL在浏览器中分享都是不错的选择。Player Settings务必仔细检查Project Settings - Player中的设置。包括公司名、产品名、图标、分辨率设置等。对于WebGL还需要注意“Compression Format”和“WebGL Template”的选择。解决常见打包错误脚本编译错误这是最常见的确保在打包前所有脚本都没有错误。缺失依赖如果使用了Asset Store的插件确保其支持你选择的构建平台。WebGL初始化慢/黑屏这通常是因为Unity WebGL的初始压缩包.data文件较大浏览器下载和解压需要时间。优化方法包括在Player Settings中启用Compression Format为Brotli比Gzip压缩率更高使用Addressable Asset System将资源分包实现按需加载尽可能减少首包资源大小。纹理变紫这通常是着色器Shader在目标平台不兼容或丢失导致的。确保你使用的所有Shader都支持目标平台。如果使用了TextMeshProTMP在打包前务必通过Window - TextMeshPro - Font Asset Creator为所有用到的字体生成SDF Atlas并确保TMP的材质球设置正确。测试打包后一定要在目标平台或模拟器上进行充分测试。检查所有功能是否正常UI是否适配不同分辨率输入设备键鼠、手柄是否兼容性能是否达标。5. 项目扩展方向与进阶思考完成基础版本后你可以尝试以下方向来深化项目这也能很好地反映在个人作品集中。5.1 引入更复杂的AI行为给丧尸AI加入更多状态如“受伤蹒跚”、“呼唤同伴”吸引附近丧尸、“逃跑”当生命值过低时。可以使用行为树Behavior Tree插件如NodeCanvas来更直观、更强大地管理复杂AI逻辑这比手写FSM更易于维护和扩展。5.2 搭建更丰富的游戏系统技能/天赋系统让玩家可以升级获得如“暴击率提升”、“移动速度加快”、“范围攻击”等技能。建造系统允许玩家在场景中特定位置建造防御塔、路障或陷阱这需要处理资源收集、建造预览用半透明材质显示将要建造的物体、建造冷却等逻辑。任务系统设计一些主线或支线任务如“坚守据点5分钟”、“击杀特定变异丧尸”增加游戏目标感。5.3 探索Unity高级特性ScriptableObject数据驱动将丧尸属性生命值、速度、伤害、波次配置、武器数据等全部做成ScriptableObject资产。这样策划或者你自己可以在不修改代码的情况下调整游戏平衡性非常方便。Addressable Asset System实现资源的动态加载与卸载。将不同关卡的美术资源、音频等标记为Addressable实现关卡切换时的流畅加载避免一次性加载所有资源导致内存暴涨和初始加载时间过长。Unity Jobs System Burst Compiler如果你有大量丧尸需要同时进行简单的计算如寻找最近玩家可以尝试使用Job System将计算转移到多线程并用Burst Compiler编译成高性能的本地代码能极大提升计算密集型操作的性能。这对于追求大规模同屏丧尸数量的项目尤其有用。开发这个小项目的整个过程就像在搭一个精致的模型。从最底层的移动和碰撞开始一块块积木往上垒逐渐看到角色动起来丧尸追过来战斗发生UI跳动成就感是循序渐进的。最难的可能不是某个具体技术点而是如何让这么多分散的模块整洁地协同工作。我的经验是动手编码前先在纸上或白板上画一画主要的类图和它们之间的关系想清楚数据怎么流动事件怎么传递哪怕只是一个简单的草图也能在后续开发中帮你省下大量调试和重构的时间。最后享受创造的过程每一个你亲手解决掉的Bug都会让你对引擎的理解更深一分。

相关新闻

Karmem安全最佳实践:防范数据泄露与内存越界的终极指南

Karmem安全最佳实践:防范数据泄露与内存越界的终极指南

Karmem安全最佳实践:防范数据泄露与内存越界的终极指南 【免费下载链接】karmem Karmem is a fast binary serialization format, faster than Google Flatbuffers and optimized for TinyGo and WASM. 项目地址: https://gitcode.com/gh_mirrors/ka/karmem …

2026/10/15 6:14:47 阅读更多 →
KimiK3、Fable5、GPT-5.6sol深度技术评估与工程化集成指南

KimiK3、Fable5、GPT-5.6sol深度技术评估与工程化集成指南

在实际技术选型和模型应用场景中,开发者经常面临一个核心问题:面对层出不穷的新模型和版本,如何快速理解其定位、能力边界并进行有效的技术评估与集成?近期,围绕 KimiK3、Fable5 和 GPT-5.6sol 等模型的讨论热度很高&a…

2026/10/14 12:50:11 阅读更多 →
nvidia/corrdiff-cosmo-era5未来路线图:即将推出的5大功能与改进方向

nvidia/corrdiff-cosmo-era5未来路线图:即将推出的5大功能与改进方向

终极指南:Storybook消息中心与通知组件全解析 【免费下载链接】storybook Storybook是一个独立运行的UI组件开发环境,支持React、Vue、Angular等多种前端框架。它允许开发者在隔离环境中创建、展示和测试UI组件,有助于组件化开发和设计系统的…

2026/10/8 6:19:18 阅读更多 →

最新新闻

UDP广播实战:从原理到跨平台稳定收发的完整指南

UDP广播实战:从原理到跨平台稳定收发的完整指南

1. 项目概述:为什么一个“UDP广播demo”值得花一整天认真写透UDP广播这个概念,听起来像教科书里被翻旧了的一页纸——很多刚学网络编程的人,第一反应是:“不就是发个包,让局域网里所有机器都收到吗?”但真当…

2026/10/15 6:14:42 阅读更多 →
Spring事件机制实战:用ApplicationEventPublisher实现业务解耦

Spring事件机制实战:用ApplicationEventPublisher实现业务解耦

做后端开发的人应该都有过这种经历:一个下单接口,业务代码越堆越多。一开始只是保存订单,后面要扣库存、发短信、发优惠券、加积分、通知财务……新需求一个接一个,每次都要打开核心 Service 往里面塞代码。改到后面,下…

2026/10/15 6:14:42 阅读更多 →
Java工程师24周转型Agent工程师:从LLM基础到多Agent协作实战

Java工程师24周转型Agent工程师:从LLM基础到多Agent协作实战

1. 为什么Java老手转Agent工程师反而有优势这两年Agent Engineer这个岗位火得有点不讲道理。招聘网站上挂出来的JD,薪资区间普遍比同级别的后端开发高出30%到50%,而且很多岗位明确写着“有后端经验者优先”。我身边不少写了五六年Java的朋友都在问同一个…

2026/10/15 6:14:42 阅读更多 →
IDEA+Maven+Tomcat:从零创建JSP Web项目完整实战指南

IDEA+Maven+Tomcat:从零创建JSP Web项目完整实战指南

1. 项目概述:为什么现在还要学JSP,以及你将从这篇文章里得到什么先别急着划走。我知道很多人一看到JSP这仨字母,第一反应是"这不是上个时代的东西了吗?现在不都是前后端分离、Vue/React一把梭吗?"——这话没…

2026/10/15 6:14:42 阅读更多 →
机房UPS备用电源监控实战:电池巡检与告警配置全解析

机房UPS备用电源监控实战:电池巡检与告警配置全解析

说起来有点丢人,我们这套机房UPS备用电源监控系统,是被一次本可以避免的机房掉电事故逼出来的。那会儿机房规模不大,两台某品牌的200kVA主机做11冗余,带大约60多路机柜,负载不算重,约40%左右。当时我们对UP…

2026/10/15 6:14:42 阅读更多 →
对抗样本攻击方法全解析:从FGSM到物理世界攻击

对抗样本攻击方法全解析:从FGSM到物理世界攻击

1. 对抗样本攻击的底层逻辑与整体分类框架搞机器学习安全这块的人,迟早会碰到对抗样本这个绕不开的坎。我第一次接触这个概念是在做一个图像分类的小项目时,模型在测试集上准确率跑到98%以上,结果把一张熊猫照片加上一层肉眼几乎看不出来的噪…

2026/10/15 6:13:42 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →