<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ZERO开发</title>
  
  <subtitle>一个探索副业的独立开发人博客</subtitle>
  <link href="https://www.zerofc.cn/atom.xml" rel="self"/>
  
  <link href="https://www.zerofc.cn/"/>
  <updated>2026-02-25T11:26:30.554Z</updated>
  <id>https://www.zerofc.cn/</id>
  
  <author>
    <name>北桥苏</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>我的2025年终总结，回归过程</title>
    <link href="https://www.zerofc.cn/2026/02/15/%E6%88%91%E7%9A%842025%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93%EF%BC%8C%E5%9B%9E%E5%BD%92%E8%BF%87%E7%A8%8B/"/>
    <id>https://www.zerofc.cn/2026/02/15/%E6%88%91%E7%9A%842025%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93%EF%BC%8C%E5%9B%9E%E5%BD%92%E8%BF%87%E7%A8%8B/</id>
    <published>2026-02-15T08:13:50.000Z</published>
    <updated>2026-02-25T11:26:30.554Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>和往年一样，又到了年底复盘的时候啦，但有点不同的是：我今年选择是农历的辞旧迎新之际写年终总结。</p><p>原因有几个，一个是回归我们传统的节日性跨年，另一个是整个2025年我其实有点茫然。</p><p>要赶在2026年元旦前更新文章，我还真有点来不及，因为我发现我有点 内容枯竭，不光其他平台断更，公众号上面也就写了8篇文章，创历史最低位。</p><p>影响这个的，我觉得和AI有很大关系，这个我后面再慢慢细讲，虽然断更这么久，但好歹是一年时间，做过的事情，收获的东西，遇到的问题也还是有，所以下面就开始罗列了。</p><h2 id="二、事件"><a href="#二、事件" class="headerlink" title="二、事件"></a>二、事件</h2><p>2025年的完成表和2024年年终文的计划还是有出入的，计划八大纲，完成度只能是算一半一半吧，除了弹幕小玩法没上架和小型单机游戏没做外，其他基本也都实现了。</p><p>1.小丑先生IP衍生的表情包上架，下载789个，转发2178次，打赏2个。</p><p>2.公众号《ZERO开发》发文8篇，视频号《北桥苏》视频更新4个，AI应用相关文章2篇。</p><p>3.小丑先生IP衍生的微信红包封面发布，累计拆红包数20307个，曝光数138196。</p><p>4.微信问一问《ZERO开发》创作分成开通，总发布数116条，曝光量16w，收获关注数410个。</p><p>5.个人资源（源码、资料、教程）整理完毕，免费分享，已完成频道建立。</p><p>6.个人微信服务号《51轻创》完成注册，发布小绿书9篇，暂停重新定位中。</p><h2 id="三、收获"><a href="#三、收获" class="headerlink" title="三、收获"></a>三、收获</h2><p>事情看上去好像并不多，而且数据也不好看，但是真实，也正应我今年的主题 “回归过程”，结果虽然重要，但是AI正在让过程变得更稀缺。</p><p>因为AI本质是一个黑盒的计算函数，没有人能理解他整个的计算过程，但却能在非常短的时间内给出计算结果。他让我们以前写解答式的技术文章变得毫无意义，这也是让我茫然并断更的主要原因。</p><p>我开通公众号到现在已经有十年了，早期的目的就是用于记录我平时在写代码时踩过的坑，既方便自己以后重新查找，也能让其他网友避免踩坑。</p><p>大家都知道计算机这一行有一个非常大的问题，就是迭代太快，必须要保持时刻学习并终生学习的态度。</p><p>为什么会这样呢？计算机科学是建立在确定物理学之上的假设，就是人为编造的，编程根本没有无法修改的东西，信息能记录和模拟万物，谁制定了规则，抢占了市场，那他就是要重新学习的东西。</p><p>而这种基于规则的东西，在AI看来就是洒洒水的事，你写再多再好的代码，写再多的技术性文章都没用。</p><p>同样也是断更的那段时间，偶然我发现微信问一问改版了，以前那种很AI味的回答完全没有流量了，更多的是大家生活中记录的真实感受和照片占据首页。</p><p>AI是“掌管信息的神”，他能取代我们，但我们也不一定非得自己写代码，我们就不能指挥他写吗？我们再把怎么指挥他的整个过程记录下来不是也挺好，今年主打收获一个心态！</p><h2 id="四、计划"><a href="#四、计划" class="headerlink" title="四、计划"></a>四、计划</h2><p>今年的收获和计划不是工业式的List，全是铺屏的文字，这样才有温度嘛，但是要提取成关键点就要拆分咯！</p><p>其实我一点也不怕AI能彻底结算我们这行，因为我们是人，世界那么大，需求也不是一成不变的，就像我们的爱好一样，也是随着时间一直在变。</p><p>就算强大的AI没有出现，我也会对基础物理感兴趣，就像知道了前后端，就会好奇Web的整个运行原理，知道了整个软件又会好奇硬件，后面又会涉及到电子信息和材料相关的学科。</p><p>有时候我也会抽空去逛华强北，了解什么叫实际需求的消费电子，也对整个PCB工艺有初步的概念，于是对PCB设计有了很大兴趣，可能后面会折腾一下电子DIY，当然画板，焊盘，写程序也在更进中。</p><p>当然关于信息类的程序，比如纯Web应用、游戏、编曲等也会支线进行，也会把折腾过程记录并分享出来。</p><h2 id="五、结语"><a href="#五、结语" class="headerlink" title="五、结语"></a>五、结语</h2><p>只能说一年的时间过得真快，世界变得很快，不管上一年计划要做的事完成的怎么样，我们还是要往前看。</p><p>停更的日子里，也非常感谢有小伙伴催更，说实话小伙伴越多，写文章和更视频都有点不好意思做得太水，以前就当个笔记自己看看，现在还是要多考虑内容到底对大家有没有帮助，不说要有多深刻，提供点情绪价值也可以。</p><p>最后要说得就是：AI真的很强，他是人类史上资金投入最多的一个重大工程了，未来我们不必和AI直接竞争，保持身体健康，回归过程，多记录多思考新时代的新机会，一起迎接AI革命后的科技果实。</p>]]></content>
    
    
    <summary type="html">我的2025年终总结，回归过程</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="shell" scheme="https://www.zerofc.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Windows下进程、线程指令合集</title>
    <link href="https://www.zerofc.cn/2025/11/10/Windows%E4%B8%8B%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%8C%87%E4%BB%A4%E5%90%88%E9%9B%86/"/>
    <id>https://www.zerofc.cn/2025/11/10/Windows%E4%B8%8B%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E6%8C%87%E4%BB%A4%E5%90%88%E9%9B%86/</id>
    <published>2025-11-10T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.563Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>为了在本地查看java程序运行后的线程，除了使用cmd命令、还可用到wmic、PowerShell，同时也为了怕被忘记，我就记录一下了。</p><h2 id="二、命令介绍"><a href="#二、命令介绍" class="headerlink" title="二、命令介绍"></a>二、命令介绍</h2><h3 id="1-cmd"><a href="#1-cmd" class="headerlink" title="1.cmd"></a>1.cmd</h3><p>命令提示符是Windows早期版本中的命令行界面，用于执行基本的系统管理任务和文件操作，对于老旧版本的Windows系统，cmd仍然是主要的命令行工具。</p><h3 id="2-wmic"><a href="#2-wmic" class="headerlink" title="2.wmic"></a>2.wmic</h3><p>wmic 是一个用于管理和查询系统资源的命令行工具，基于WMI（Windows Management Instrumentation），可以获取和设置系统硬件、软件、操作系统等的详细信息。</p><p>常用命令包括 wmic process list brief（列出进程）、wmic cpu get loadpercentage（获取CPU负载）、wmic logicaldisk get size,freespace（获取磁盘空间信息）等。</p><p>使用方法是直接在cmd框中输入wmic指令即可。</p><h3 id="3-PowerShell"><a href="#3-PowerShell" class="headerlink" title="3.PowerShell"></a>3.PowerShell</h3><p>PowerShell 是一个功能强大的脚本语言环境，用于管理和自动化系统任务；支持脚本编写、对象操作和高级的系统管理功能；内置了丰富的命令和模块，可以执行几乎所有的系统管理任务。</p><p>功能非常强大，支持复杂的脚本编写和高级的对象操作，提供了大量的内置命令和模块，可以执行几乎所有的系统管理任务。内置在所有较新的Windows版本中（Windows 7 及更高版本），并且在Windows 10和Windows 11中得到了进一步的增强。</p><p>通过win+X，或者右击win图标，选择Windows PowerShell，弹出一个蓝色的框。</p><h2 id="三、命令使用"><a href="#三、命令使用" class="headerlink" title="三、命令使用"></a>三、命令使用</h2><p>下面以程序名开头，获取进程ID，再根据进程ID查询详情（包括状态、线程数等），最后再根据进程ID，查询下面的所有线程并列出线程信息。</p><h3 id="1-根据程序名获取进程"><a href="#1-根据程序名获取进程" class="headerlink" title="1.根据程序名获取进程"></a>1.根据程序名获取进程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tasklist | findstr &quot;java&quot;</span><br></pre></td></tr></table></figure><h3 id="2-根据进程ID查看进程信息"><a href="#2-根据进程ID查看进程信息" class="headerlink" title="2.根据进程ID查看进程信息"></a>2.根据进程ID查看进程信息</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tasklist /FI &quot;PID eq 1234&quot; /V</span><br></pre></td></tr></table></figure><h3 id="3-根据进程ID获取详细信息，线程总数"><a href="#3-根据进程ID获取详细信息，线程总数" class="headerlink" title="3.根据进程ID获取详细信息，线程总数"></a>3.根据进程ID获取详细信息，线程总数</h3><p>这里有有一个需要注意的点是，像Java程序运行后，JVM除了主线程外，还会开启多个子线程用于垃圾回收等操作。所以就算在程序中只开启了一个线程，加上自带的都会有十几个子线程。</p><p>而通过任务管理器，在详细信息中找到的进程，然后右键 “分析等待链”，列出的线程也就展示前两个的线程ID，而通过PowerShell可列出所有线程。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wmic process where processid=1234 get processid,threadcount</span><br></pre></td></tr></table></figure><h3 id="4-根据进程ID列出所有线程"><a href="#4-根据进程ID列出所有线程" class="headerlink" title="4.根据进程ID列出所有线程"></a>4.根据进程ID列出所有线程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Get-Process -Id 1234 | Select-Object -ExpandProperty Threads</span><br></pre></td></tr></table></figure><h3 id="5-直接根据程序名列出所有线程"><a href="#5-直接根据程序名列出所有线程" class="headerlink" title="5.直接根据程序名列出所有线程"></a>5.直接根据程序名列出所有线程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Get-Process -Name notepad | Select-Object -ExpandProperty Threads</span><br></pre></td></tr></table></figure><h2 id="四、写在后面"><a href="#四、写在后面" class="headerlink" title="四、写在后面"></a>四、写在后面</h2><p>在计算机科学中，进程、线程和协程是用于管理和调度任务的基本概念。而进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己的独立地址空间，包括代码、数据和堆栈；进程可以包含一个或多个线程，并且每个进程由操作系统独立管理。</p><p>线程是进程中的执行单元，是操作系统进行调度的基本单位，线程共享进程的资源，如内存空间、文件句柄等，但每个线程有自己的堆栈、程序计数器和局部变量。</p><p>协程是一种用户态轻量级线程，可以暂停和恢复执行，而不像线程那样需要操作系统支持。协程可以理解为在单个线程中交叉执行的函数，作用还是提升单线程的利用率，减少资源占用。</p><p>而且他虽然不是由操作系统调度，但是也不是自己的业务程序分配哪个先哪个后，而是由支持协程的扩展或编程语言的运行时，里面封装调度器进行管理，比如执行到业务中定义的一个有IO操作的协程就会马上切到下一个协程，等上一个IO接触就返回给回调函数。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Windows下进程、线程指令合集</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="shell" scheme="https://www.zerofc.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Audition入门教程：音频降速</title>
    <link href="https://www.zerofc.cn/2025/08/30/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/"/>
    <id>https://www.zerofc.cn/2025/08/30/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/</id>
    <published>2025-08-30T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>游戏被称为人类史上第九大艺术，它融合了文学、雕塑、电影、音乐等前八者造诣之和。所以在游戏创作中，如果是独立开发，在解决了编码、美术外，音乐音效也是一个亟需处理的一环。</p><p>而个人要对音效进行处理就不得不用到Audition了，比如你自己采集的声音，要进行降噪，音量增益等等操作。</p><p>由于我自己用过Adobe的其他产品，对Auditon就是拿来直接上手，折腾过后，为了防止忘记，就整理了一些常用而又比较难找的功能设置方法，那第一个就从音频降速开始。</p><h1 id="二、操作流程"><a href="#二、操作流程" class="headerlink" title="二、操作流程"></a>二、操作流程</h1><h3 id="1-创建多轨"><a href="#1-创建多轨" class="headerlink" title="1.创建多轨"></a>1.创建多轨</h3><p>打开Audition CC后，默认情况下，点击左侧栏中的 “多轨”，填写工程名，模板，采样率，位深度就可以创建多轨项目了。</p><p><img src="/img/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/image-20250910134508870.png" alt="image-20250910134508870"></p><h3 id="2-导入资源"><a href="#2-导入资源" class="headerlink" title="2.导入资源"></a>2.导入资源</h3><p>点击文件栏目中的“文件夹图标”，也可以直接双击，弹出选择资源的框，选中音频文件就能作为资源，然后拖动音频文件到 “多轨编辑器”中就完成导入了。</p><h3 id="3-操作音频"><a href="#3-操作音频" class="headerlink" title="3.操作音频"></a>3.操作音频</h3><p>在编辑器中选中导入的音频文件，可以用菜单里的工具进行简单操作，比如切割，滑动，圈选等，最常用的就是切割，像剪辑视频一样操作。</p><p><img src="/img/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/image-20250910135252472.png" alt="image-20250910135252472"></p><h3 id="4-拉伸模式"><a href="#4-拉伸模式" class="headerlink" title="4.拉伸模式"></a>4.拉伸模式</h3><p>为了好看效果，我切割了一小段移到了第二个轨道，鼠标悬浮到音频片段的边缘一个“小三角形”，淡出淡出按钮旁边，放上去出现一个 “计时表图标”和“伸缩”文字。</p><p>如果没有这些图标，可以点击音频片段右键，找到“伸缩”-&gt;“伸缩模式”，选择 “实时”，最后再重复前面操作。</p><h3 id="5-降速操作"><a href="#5-降速操作" class="headerlink" title="5.降速操作"></a>5.降速操作</h3><p>鼠标悬浮出现“伸缩”时，鼠标向右拖动（大于100%），音频片段就会降速，将相当于对音频片段进行慢放，反之向左（小于100%），音频就会升速，播放时就相当于快进了。</p><p>这个操作常用于对音频的速度对齐，比如唱歌的干音快了几个拍子，就可以通过这种方式能匹配伴奏了，当然音效处理也可以。</p><p><img src="/img/Audition%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%9F%B3%E9%A2%91%E9%99%8D%E9%80%9F/image-20250910140441150.png" alt="image-20250910140441150"></p><h1 id="三、写在后面"><a href="#三、写在后面" class="headerlink" title="三、写在后面"></a>三、写在后面</h1><p>虽然标题是对音频的降速操作，但是这篇文章把基本的项目创建到基本操作也简单介绍了一遍，伸缩操作比较隐蔽所以就单独整理了一篇文章，如果要对音频添加效果，比如降噪、电音效果和混音，我后面再单独更新，要等待一下。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">在Audition CC中如何对音频放慢速度</summary>
    
    
    
    <category term="音频相关" scheme="https://www.zerofc.cn/categories/%E9%9F%B3%E9%A2%91%E7%9B%B8%E5%85%B3/"/>
    
    
    <category term="Audition" scheme="https://www.zerofc.cn/tags/Audition/"/>
    
  </entry>
  
  <entry>
    <title>如何在Unity3D中实现无缝滚动动画？</title>
    <link href="https://www.zerofc.cn/2025/08/29/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/"/>
    <id>https://www.zerofc.cn/2025/08/29/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/</id>
    <published>2025-08-29T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:32.103Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>对于游戏开发的动画，可能大部分是采用第三方的制作工具单独完成，然后导入Unity3D 2020.3中。但是有些组件动画，比如像进度条这种，因为要完成色块移动控制，所以在Unity3D中实现更好。</p><h1 id="二、操作流程"><a href="#二、操作流程" class="headerlink" title="二、操作流程"></a>二、操作流程</h1><h3 id="1-搭建基本结构"><a href="#1-搭建基本结构" class="headerlink" title="1.搭建基本结构"></a>1.搭建基本结构</h3><p>结构主要是先一个空对象，对象下添加Image对象作为进度条背景，与背景同级创建一个带Animation组件的对象，最后在带Animation组件对象下添加两个Image对象。</p><h3 id="2-添加需要组件"><a href="#2-添加需要组件" class="headerlink" title="2.添加需要组件"></a>2.添加需要组件</h3><p>Background添加Image组件；ObjAnima添加Rect Mask 2D组件和Animation组件；Animation01和Animation02添加Image组件。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906191712611.png" alt="image-20250906191712611"></p><h3 id="3-创建Animation文件"><a href="#3-创建Animation文件" class="headerlink" title="3.创建Animation文件"></a>3.创建Animation文件</h3><p>在Assets资源管理中右键-&gt;Create-&gt;Animation，然后双击该文件打开Animation编辑器，点击Create保存到指定位置，文件后缀.anim。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906171304257.png" alt="image-20250906171304257"></p><h3 id="4-Animation编辑"><a href="#4-Animation编辑" class="headerlink" title="4.Animation编辑"></a>4.Animation编辑</h3><p>进入编辑框内，点击“Add Property”，出现弹出小框，会出现当前有Animation下的子级，点击下拉会显示子级的属性，像上下移动就选择Anchored Position就可以。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906174348718.png" alt="image-20250906174348718"></p><h3 id="5-添加关键帧"><a href="#5-添加关键帧" class="headerlink" title="5.添加关键帧"></a>5.添加关键帧</h3><p>为了实现无缝滚动，原理就是遮罩上一个图形往下移动，在视图中的图形往遮罩下面移动。也就只需对图形的Y轴进行操作。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906175000535.png" alt="image-20250906175000535"></p><h3 id="6-匀速动画设置"><a href="#6-匀速动画设置" class="headerlink" title="6.匀速动画设置"></a>6.匀速动画设置</h3><p>设置时间轴默认情况是有缓入缓出的效果，播放的时候就没有无缝滚动的效果，这时候就需要在Curves下设置匀速。<br>按 “shift”选中两个关键帧，右键的时候不要离开关键帧的点，然后选择“Both Tangents‘，再点击 ”Linear“，看到线条变成直线就表示匀速播放了。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E6%97%A0%E7%BC%9D%E6%BB%9A%E5%8A%A8%E5%8A%A8%E7%94%BB%EF%BC%9F/image-20250906175434470.png" alt="image-20250906175434470"></p><h1 id="四、写在后面"><a href="#四、写在后面" class="headerlink" title="四、写在后面"></a>四、写在后面</h1><p>通过上面操作就完成了一个简单的无缝上下滚动的进度条动画效果，并且没有通过脚本控制。还有一个容易忘记的点是，在打开anim文件时，一定要点击挂在该动画的对象上，不然是无法预览动画。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何在Unity3D中实现无缝滚动动画？</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Unity3D" scheme="https://www.zerofc.cn/tags/Unity3D/"/>
    
  </entry>
  
  <entry>
    <title>如何在Unity3D中实现圆角效果？</title>
    <link href="https://www.zerofc.cn/2025/08/28/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/"/>
    <id>https://www.zerofc.cn/2025/08/28/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/</id>
    <published>2025-08-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:32.103Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>有时候在Unity3D中，要实现一些组件的圆角效果，比如进度条，不像普通按钮是静态不动的，可以直接将图片做成圆角。但是进度条是有那种色块流动的效果，如果不做处理，里面的色块会溢出四个角落。</p><h1 id="二、实现前提"><a href="#二、实现前提" class="headerlink" title="二、实现前提"></a>二、实现前提</h1><p>1.须使用Image的UI元素。</p><p>2.父层Image元素须遮罩组件。</p><p>3.父层Image元素图片须有圆角png图。</p><h1 id="三、操作过程"><a href="#三、操作过程" class="headerlink" title="三、操作过程"></a>三、操作过程</h1><p>1.在场景中创建一个Image的UI元素，图片是黑色有圆角的png图片。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/1.jpg" alt="img"></p><p>2.在该Image中添加Mask组件（遮罩）。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/2.jpg" alt="img"></p><p>3.在该Image下添加一个新的Image元素，Source Image选择一个其他颜色图。</p><p><img src="/img/%E5%A6%82%E4%BD%95%E5%9C%A8Unity3D%E4%B8%AD%E5%AE%9E%E7%8E%B0%E5%9C%86%E8%A7%92%E6%95%88%E6%9E%9C%EF%BC%9F/3.jpg" alt="img"></p><p>4.对子级Image的Transform进行上下拖动，填充住父的遮罩就可以看到子级的元素也有圆角。</p><h1 id="四、写在后面"><a href="#四、写在后面" class="headerlink" title="四、写在后面"></a>四、写在后面</h1><p>以上的操作都是在Unity3D 2020.3中实现，除了用遮罩的方式实现圆角效果外，还可以用Shader，在效果上还没有锯齿，弧度更丝滑。后面有时间我再更新，以及如何在Unity3D中实现无缝循环的帧动画效果。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何在Unity3D中实现圆角效果？</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Unity3D" scheme="https://www.zerofc.cn/tags/Unity3D/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：SpringBoot项目搭建</title>
    <link href="https://www.zerofc.cn/2025/07/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/07/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</id>
    <published>2025-07-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>上次在本地简单部署了一个SSM框架的项目，由于非常繁琐的配置，我这次就试一下现在市面上非常火的SpringBoot。该框架基于Spring框架，由于在很多配置上采用了默认方式，所以在java应用程序构建上非常快速敏捷。</p><p>并且它还内嵌了tomcat、Jetty等服务器，使得它能作为一个独立的Jar文件运行，在生产环境上只需要用Nginx用反向代理指向该程序进度。</p><h2 id="二、项目配置"><a href="#二、项目配置" class="headerlink" title="二、项目配置"></a>二、项目配置</h2><p>通过前文关于maven的介绍，这里就跳过了，只按运行流程运行和部署项目。</p><h4 id="1-导入项目"><a href="#1-导入项目" class="headerlink" title="1.导入项目"></a>1.导入项目</h4><p>通过Open导入项目后，IDEA会立刻下载依赖，这时候你也可以去修改pom.xml然后再在Maven中，点击刷新按钮重新下载。</p><p>还有一个要注意的是可以给项目指定JDK版本，点击File-&gt;Project Structure-&gt;Project Settings-&gt;Project，找到Project SDK，然后可以根据框架版本切换JDK版本。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251105174408450.png" alt="image-20251105174408450"></p><h4 id="2-Artifacts设置"><a href="#2-Artifacts设置" class="headerlink" title="2.Artifacts设置"></a>2.Artifacts设置</h4><p>还是上面的Project Structure中，Artifacts中添加一个Web Application: Archive，主要用于项目打包输出。</p><h4 id="3-直接运行"><a href="#3-直接运行" class="headerlink" title="3.直接运行"></a>3.直接运行</h4><p>SpringBoot有内置的服务，所以一般打开项目后，在启动下拉里会自动有一个 “MainApplication”，如果没有出现，点击 “Edit Configurations”然后添加一个 “Spring Boot”,最后在Configuration进行设置即可。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251105180037489.png" alt="image-20251105180037489"></p><h4 id="4-运行访问"><a href="#4-运行访问" class="headerlink" title="4.运行访问"></a>4.运行访问</h4><p>点击运行按钮 “run MainApplication”，就可以启动自身的web服务，然后浏览器通过启动面板里输出的地址进行访问了，URL在源码的controller里对应的控制器名&#x2F;方法名。</p><h2 id="三、打包部署"><a href="#三、打包部署" class="headerlink" title="三、打包部署"></a>三、打包部署</h2><h4 id="1-打包操作"><a href="#1-打包操作" class="headerlink" title="1.打包操作"></a>1.打包操作</h4><p>打开IDEA的Maven，先点击 “Lifecycle” 的 “clean”，然后点击 “package”。等待执行完毕后，项目根目录就会新增 “target”，最外层也会新增一个jar包，这个就是项目的包了。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASpringBoot%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251105190531081.png" alt="image-20251105190531081"></p><h4 id="2-运行部署"><a href="#2-运行部署" class="headerlink" title="2.运行部署"></a>2.运行部署</h4><p>SpringBoot 默认打包方式jar，如果需要在tomcat容器中，可以在pom.xml的packaging修改为war，以及添加对应的依赖包。而对于生产环境部署，执行指令和Nginx可以参考下面配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -jar jesper_seckill.jar</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">server <span class="punctuation">&#123;</span></span><br><span class="line">    listen <span class="number">80</span>;</span><br><span class="line">    server_name yourdomain.com;</span><br><span class="line"></span><br><span class="line">    location / <span class="punctuation">&#123;</span></span><br><span class="line">        proxy_pass http<span class="punctuation">:</span><span class="comment">//127.0.0.1:8080;  </span></span><br><span class="line">        proxy_set_header Host $host;</span><br><span class="line">        proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line">        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line">        proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="四、Tomcat虚拟主机多项目部署"><a href="#四、Tomcat虚拟主机多项目部署" class="headerlink" title="四、Tomcat虚拟主机多项目部署"></a>四、Tomcat虚拟主机多项目部署</h2><p>这里以SSM项目为例，那么先打开Tomcat下conf的server.xml，然后添加一个Host。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Host</span> <span class="attr">name</span>=<span class="string">&quot;www.ssmts.com&quot;</span> <span class="attr">appBase</span>=<span class="string">&quot;webapps&quot;</span> <span class="attr">unpackWARs</span>=<span class="string">&quot;true&quot;</span> <span class="attr">autoDeploy</span>=<span class="string">&quot;true&quot;</span> <span class="attr">xmlValidation</span>=<span class="string">&quot;false&quot;</span> <span class="attr">xmlNamespaceAware</span>=<span class="string">&quot;false&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">Context</span> <span class="attr">docBase</span>=<span class="string">&quot;SSM&quot;</span> <span class="attr">path</span>=<span class="string">&quot;&quot;</span> <span class="attr">reloadable</span>=<span class="string">&quot;true&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">Host</span>&gt;</span></span><br></pre></td></tr></table></figure><p>前提有三个，在host中创建了上面name的域名，docBase中的项目名，在webapps中一定有这个项目，第三个是要注意端口号，也就是Connector里指定的port。</p><p>最后在浏览器中直接输入”http:&#x2F;&#x2F;域名:端口&#x2F;“, 就能直接访问项目了，如果是80端口可以不用指定，还一个是如果把打包的war直接放入webapps中，启动tomcat会直接解压到当前目录中。</p><h2 id="五、其他问题"><a href="#五、其他问题" class="headerlink" title="五、其他问题"></a>五、其他问题</h2><h4 id="1-Tomcat输出中文乱码"><a href="#1-Tomcat输出中文乱码" class="headerlink" title="1.Tomcat输出中文乱码"></a>1.Tomcat输出中文乱码</h4><p>找到Tomcat的conf下logging.properties，将java.util.logging.ConsoleHandler.encoding修改为GBK</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java.util.logging.ConsoleHandler.encoding = GBK</span><br></pre></td></tr></table></figure><h4 id="2-IDEA编辑窗口关闭快捷键"><a href="#2-IDEA编辑窗口关闭快捷键" class="headerlink" title="2.IDEA编辑窗口关闭快捷键"></a>2.IDEA编辑窗口关闭快捷键</h4><p>打开settings-&gt;Keymap，直接搜索 “close”，选择Editor Tabs下的Close，然后右键清理快捷键，新增快捷键，我习惯 “Ctrl+W”，只需要按这两个键就可以，最后OK完成。</p><h4 id="3-Tomcat项目访问"><a href="#3-Tomcat项目访问" class="headerlink" title="3.Tomcat项目访问"></a>3.Tomcat项目访问</h4><p>将编译后的项目复制到webapps中，启动tomcat，通过localhost:端口&#x2F;项目名，可以直接访问对应项目。</p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>如果要让SpringBoot打包后的war在tomcat中使用，不光要移除自带的tomcat和添加依赖外，启动文件也需要做部分修改，不然放入tomcat容器内也无法启动。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：SpringBoot项目搭建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>AI应用开发（二）：Blender建模助手</title>
    <link href="https://www.zerofc.cn/2025/06/28/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/"/>
    <id>https://www.zerofc.cn/2025/06/28/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/</id>
    <published>2025-06-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h1><p>上次简单介绍了一下 MCP，以及如何在 TRAR 中通过 MCP 实现一些 AI 功能，同时我也说过，以后的那些大型工具软件一定会加上自然语言驱动创作模块。</p><p>比如各种 Adobe、Autodask 等等系列软件，但是今天我要讲的一个开源轻量的 3D 建模软件 ——Blender，关于实现一个智能体，完成通过自然语言来控制 Blender 建模、贴图等基本操作。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-89e738656142a7a129cfda063481b855e94.png" alt="img"></p><h1 id="二、环境清单"><a href="#二、环境清单" class="headerlink" title="二、环境清单"></a>二、环境清单</h1><p>TRAE 0.5.7</p><p>Blender 4.0</p><p>Blender MCP</p><p>Python 3.10</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-377f6418d745741b13035134206b42d942f.png" alt="img"></p><h1 id="三、BlenderMCP-介绍"><a href="#三、BlenderMCP-介绍" class="headerlink" title="三、BlenderMCP 介绍"></a>三、BlenderMCP 介绍</h1><p>要想用自然对话的方式在 Blender 中建模，就不得不提到 BlenderMCP 了，全称为 Blender Model Context Protocol，是一个旨在将 Blender 与 AI 模型无缝集成的工具。</p><p>它通过模型上下文协议（MCP）实现 Blender 与 AI 之间的双向通信，让用户能够利用自然语言指令来控制 Blender，从而极大地简化了 3D 建模和场景操作的流程，它主要由两个部分组成：Blender 插件和 MCP 服务器。</p><ol><li><strong>Blender 插件（addon.py）</strong>：该插件运行在 Blender 内部，负责创建 socket 服务器。它接收来自外部的命令，并在 Blender 中执行这些命令。例如，创建对象、修改材质等。插件还会将 Blender 的场景信息或操作结果反馈给外部服务器，实现双向通信。</li><li><strong>MCP 服务器（server.py）</strong>：这是一个独立的 Python 服务器，实现了模型上下文协议（MCP）。它与 Blender 插件基于 TCP sockets 进行通信，接收用户通过 Claude AI 发出的指令，并将这些指令转换为 Blender 能够理解的命令。服务器还会处理 Blender 返回的结果，将其反馈给 Claude AI，形成一个完整的指令处理流程。</li></ol><p><strong>提示：</strong>下载整个项目后，只需要复制根目录下 addon.py (Blender 插件)，用于在 Blender 中插件安装，另一个 Server.py 也可以下载单独部署（最好直接用 TRAE 中 MCP 插件市场的）。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-825b3e3678efce63f6def456d6fb0a9494f.png" alt="img"></p><h1 id="四、工具的交互流程"><a href="#四、工具的交互流程" class="headerlink" title="四、工具的交互流程"></a>四、工具的交互流程</h1><h3 id="1-启动-Blender-TCP-服务"><a href="#1-启动-Blender-TCP-服务" class="headerlink" title="1. 启动 Blender TCP 服务"></a><strong>1. 启动 Blender TCP 服务</strong></h3><p>用户在 Blender 中启用 MCP 插件，插件自动创建基于 TCP Socket 的本地服务器（默认端口 5000），用于接收外部指令。</p><h3 id="2-智能体连接-TCP-服务"><a href="#2-智能体连接-TCP-服务" class="headerlink" title="2. 智能体连接 TCP 服务"></a><strong>2. 智能体连接 TCP 服务</strong></h3><p>第三方智能体（如 Claude、自定义 Agent）通过 TCP&#x2F;IP 协议 连接到 Blender 的 MCP 服务器，建立双向通信通道。</p><h3 id="3-自然语言指令输入与解析"><a href="#3-自然语言指令输入与解析" class="headerlink" title="3. 自然语言指令输入与解析"></a><strong>3. 自然语言指令输入与解析</strong></h3><p>用户向智能体输入自然语言指令（如 “创建一把椅子模型并导入 Blender”），智能体通过 NLP 模型解析意图，判断是否需要调用 Hyper3D Rodin。</p><h3 id="4-MCP-协议转换与指令分发"><a href="#4-MCP-协议转换与指令分发" class="headerlink" title="4. MCP 协议转换与指令分发"></a><strong>4. MCP 协议转换与指令分发</strong></h3><p>智能体将自然语言转换为 JSON 的 MCP 指令，包含操作类型（如 generate_model）、参数（如 text_prompt: “一把椅子”）和目标工具。</p><h3 id="5-调用-Hyper3D-Rodin-API"><a href="#5-调用-Hyper3D-Rodin-API" class="headerlink" title="5. 调用 Hyper3D Rodin API"></a><strong>5. 调用 Hyper3D Rodin API</strong></h3><p>Blender MCP 接收到指令后，通过 HTTP&#x2F;RPC 接口 调用 Hyper3D Rodin 的模型生成服务，传递文本描述或参考图像参数。</p><h3 id="6-模型生成与数据返回"><a href="#6-模型生成与数据返回" class="headerlink" title="6. 模型生成与数据返回"></a><strong>6. 模型生成与数据返回</strong></h3><p>Rodin 的 AI 模型生成带 PBR 材质的 3D 资产，将结果以 .glb 或 .obj 格式 返回至 Blender MCP 的临时存储路径。</p><h3 id="7-模型导入-Blender-场景"><a href="#7-模型导入-Blender-场景" class="headerlink" title="7. 模型导入 Blender 场景"></a><strong>7. 模型导入 Blender 场景</strong></h3><p>Blender MCP 自动执行 bpy.ops.import_scene 等 Python API 命令，将生成的模型导入当前场景，并调整材质、灯光等参数。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-1f829e4f997c16d38d01b60efad0d9fa291.jpg" alt="img"></p><h1 id="五、开始操作"><a href="#五、开始操作" class="headerlink" title="五、开始操作"></a>五、开始操作</h1><h3 id="1-安装-Blender-插件"><a href="#1-安装-Blender-插件" class="headerlink" title="1. 安装 Blender 插件"></a><strong>1. 安装 Blender 插件</strong></h3><p>打开 Blender，点击插件安装，找到前面 BlenderMCP 里复制出来的 addon.py，安装后并启用。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-d6a3861dd8550160567c5bcf5086c6d72ba.png" alt="img"></p><h3 id="2-添加-BlenderMCP-服务"><a href="#2-添加-BlenderMCP-服务" class="headerlink" title="2. 添加 BlenderMCP 服务"></a><strong>2. 添加 BlenderMCP 服务</strong></h3><p>打开 TRAE 编辑器，在 MCP 市场搜索后直接添加，也可以用前面下载的项目里 server.py 本地添加。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-e877c6d356db8d2be4746b374b040a95404.png" alt="img"></p><h3 id="3-TCP-服务启动"><a href="#3-TCP-服务启动" class="headerlink" title="3. TCP 服务启动"></a><strong>3. TCP 服务启动</strong></h3><p>打开 Blender，找到或按快捷键 “N” 找到 BlenderMCP 插件面板，端口 9876 可以自定，勾选 “Use Hyper3D Rodin 3D model generation”，Rodin 选 “hyper3d.ai”，API Key 使用免费测试的，点击 “Set Free Trial API Key”。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-273b61c72cbc931116fe1eeaa8cec147a7a.png" alt="img"></p><h3 id="4-创建-“Blender-助手”-智能体"><a href="#4-创建-“Blender-助手”-智能体" class="headerlink" title="4. 创建 “Blender 助手” 智能体"></a><strong>4. 创建 “Blender 助手” 智能体</strong></h3><p>打开 TRAE 的智能体，自定义名字，工具勾选 “blender”，提示词可以参考我下面的。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">## 角色：</span><br><span class="line">你是一名Blender智能建模助手，擅长将自然语言指令转化为精准的Blender操作（建模/材质/动画）</span><br><span class="line"></span><br><span class="line">## 交互协议：</span><br><span class="line">- 用户输入自然语言描述（如：“创建一个带纹理的科幻飞船”）</span><br><span class="line">- 系统自动解析为Blender操作队列并执行</span><br><span class="line">- 支持多轮迭代修改（例：“将船翼延长50%并添加推进器”）</span><br><span class="line"></span><br><span class="line">## 技能</span><br><span class="line">### 技能 1：建模能力</span><br><span class="line">- 基础几何体：创建立方体/球体/柱体及参数化变形。</span><br><span class="line">- 高级建模：布尔运算、表面细分、挤压、倒角、曲线建模</span><br><span class="line">- 场景构建：排列物体、生成地形、建筑结构生成</span><br><span class="line"></span><br><span class="line">### 技能 2：材质与渲染</span><br><span class="line">- 自动分配基础材质（金属/玻璃/塑料）</span><br><span class="line">- 支持UV映射指令（“为飞船添加锈迹贴图”）</span><br><span class="line">- 基础光照设置（HDR环境光/点光源定位）</span><br><span class="line"></span><br><span class="line">### 技能 3：动画基础</span><br><span class="line">- 关键帧动画（“让立方体在5秒内旋转360度”）</span><br><span class="line">- 路径动画（“沿曲线轨迹移动相机”）</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## 注意事项：</span><br><span class="line">### 指令精度要求</span><br><span class="line">- 明确参数：“创建半径2m的球体”</span><br><span class="line">- 模糊描述：“做个大一点的球”</span><br><span class="line"></span><br><span class="line">### 能力边界声明：</span><br><span class="line">- 不支持：角色骨骼绑定/流体模拟/复杂粒子系统</span><br><span class="line">- 有限支持：有机生物模型（需分步指令）</span><br><span class="line"></span><br><span class="line">### 容错机制：</span><br><span class="line">- 当指令歧义时主动询问（“请指定圆柱体的细分段数”）</span><br><span class="line">- 复杂操作分步确认（“即将执行20个操作，是否继续？”）</span><br></pre></td></tr></table></figure><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-186fd399fb2382a163b916d751f293d3965.png" alt="img"></p><h3 id="5-连接-TCP-服务"><a href="#5-连接-TCP-服务" class="headerlink" title="5. 连接 TCP 服务"></a><strong>5. 连接 TCP 服务</strong></h3><p>在 Blender 开启服务后，我们可以用 windows 指令监听端口。</p><p>还有查看 TRAE 中 MCP 的 blender 是否可使用，如果是绿勾，表示已经连接上了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">// 查看端口</span><br><span class="line">netstat -ano | findstr &quot;9876&quot;</span><br><span class="line"></span><br><span class="line">// 查看进程</span><br><span class="line">tasklist | findstr &quot;3780&quot;</span><br></pre></td></tr></table></figure><h3 id="6-开始建模"><a href="#6-开始建模" class="headerlink" title="6. 开始建模"></a><strong>6. 开始建模</strong></h3><p>打开 TRAE，开始用 前面创建 “Blender 小助手” 智能体对话，直接输入 “创建一把椅子”，随后就会在 Blender 创建了椅子的 3D 模型。</p><p><img src="/img/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9ABlender%E5%BB%BA%E6%A8%A1%E5%8A%A9%E6%89%8B/up-459c31942a10170bf4c89838cc11b84d3c9.png" alt="img"></p><h1 id="六、写在后面"><a href="#六、写在后面" class="headerlink" title="六、写在后面"></a>六、写在后面</h1><p>更多的如材质与颜色添加、动画调整、游戏引擎导入、TCP 交互的 Json 串，以后我再更新。</p><p>其实目前看，不管是 AI 通过文本或图片生成的 3D 模型都存在布线不规整的问题，就像上面这把椅子，顶点和面都上万，而且还是三角面，如果用来做动画或导入游戏，二次修改和性能都是很大问题。</p><p>既然有痛点，自然也就有方案，市场上不光有很多降低面数、三角面转四角面教程，还有很多重拓扑的插件，都能提升现阶段让 AI 建模的可行性。</p><p>但是，随着 AI 的意图理解和生成精度不断提高，BlenderMCP 的未来发展前景还是非常广阔，一定能在游戏创作、建筑设计、工业设计上实现更高级的建模操作。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">AI应用开发（二）：Blender建模助手</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="AI应用开发" scheme="https://www.zerofc.cn/tags/AI%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：SSM项目搭建</title>
    <link href="https://www.zerofc.cn/2025/06/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/06/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</id>
    <published>2025-06-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>SSM是一个Java EE框架，也是一个Java企业级开发解决方案，它集成了Spring、Spring MVC和MyBatis三个核心框架。</p><p>下面我主要在IDEA中，怎么配置Maven，Tomcat，修改设置运行一套现有的SSM源代码。</p><h2 id="二、Maven配置"><a href="#二、Maven配置" class="headerlink" title="二、Maven配置"></a>二、Maven配置</h2><p>这里的配置，是将前面单独安装和设置好了的Maven放入到IDEA中，让其在编辑器里构建项目时不会走默认的设置。</p><p>就比如之前将Jar包更换了默认下载位置，如果不在IDEA中指定还会下载到系统盘中，甚至还会又下载一个新的Maven。</p><h4 id="1-导入项目"><a href="#1-导入项目" class="headerlink" title="1.导入项目"></a>1.导入项目</h4><p>因为我是已经把源码下载到了本地，所以直接点击Open，然后找到项目地址，点击OK就导入进来了。</p><h4 id="2-IDEA设置"><a href="#2-IDEA设置" class="headerlink" title="2.IDEA设置"></a>2.IDEA设置</h4><p>找到File-&gt;Settins-&gt;Build,Execution,Deployment-&gt;Build Tools-&gt;Maven，打开后，主要对Maven Home Directory、User Settins file、Local repository这三个进行修改。</p><p>第一个指定maven安装位置的bin目录，第二个就是自己maven的配置文件，第三个是指定jar的下载位置。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104111346970.png" alt="image-20251104111346970"></p><h4 id="3-验证设置结果"><a href="#3-验证设置结果" class="headerlink" title="3.验证设置结果"></a>3.验证设置结果</h4><p>设置完毕后，找到IDEA的Terminal，输入mvn -version，查看版本号是否和之前安装的一致就可以了。</p><h4 id="4-下载依赖"><a href="#4-下载依赖" class="headerlink" title="4.下载依赖"></a>4.下载依赖</h4><p>找到IDEA的最右侧，有一个折叠的Database、Maven、Ant栏目，点击Maven就会展开，再点击一个循环的图标，就会对项目的pom.xml文件里需要的依赖jar全部下载到本地仓库。</p><p>然后可以看项目的External Libraries和Maven栏目下的Dependencies，是否有加载到依赖，也可以进入本地依赖库查看是否多了那些jar包。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104112808569.png" alt="image-20251104112808569"></p><h2 id="三、Tomcat配置"><a href="#三、Tomcat配置" class="headerlink" title="三、Tomcat配置"></a>三、Tomcat配置</h2><h4 id="1-下载地址"><a href="#1-下载地址" class="headerlink" title="1.下载地址"></a>1.下载地址</h4><p>浏览器t直接搜索Tomcat官方网站，但需要注意一下版本，也就是jdk的版本和tomcat的版本是有对应关系的。</p><h4 id="2-jdk和Tomcat版本关系"><a href="#2-jdk和Tomcat版本关系" class="headerlink" title="2.jdk和Tomcat版本关系"></a>2.jdk和Tomcat版本关系</h4><table><thead><tr><th>Tomcat 版本</th><th>支持的 JDK 版本</th></tr></thead><tbody><tr><td>Tomcat 10</td><td>JDK 11 及以上</td></tr><tr><td>Tomcat 9</td><td>JDK 8 及以上</td></tr><tr><td>Tomcat 8.5</td><td>JDK 7 及以上</td></tr><tr><td>Tomcat 8</td><td>JDK 7 及以上</td></tr><tr><td>Tomcat 7</td><td>JDK 6 及以上</td></tr><tr><td>Tomcat 6</td><td>JDK 5 及以上</td></tr></tbody></table><h4 id="3-Tomcat安装"><a href="#3-Tomcat安装" class="headerlink" title="3.Tomcat安装"></a>3.Tomcat安装</h4><p>下载后点击安装，然后找到安装后的文件夹，复制其绝对路径，打开电脑的环境变量，添加一个变量名CATALINA_HOME，值为tomcat的路径。</p><p>然后找到path，新增一个，将 %CATALINA_HOME%\bin 复制在里面。</p><h4 id="4-启动测试"><a href="#4-启动测试" class="headerlink" title="4.启动测试"></a>4.启动测试</h4><p>找到tomcat的bin目录下的startup.bat，点击启动，然后再在浏览器输入localhost:8080访问，出现tomcat的LOGO表示成功安装。</p><h4 id="5-IDEA配置Tomcat"><a href="#5-IDEA配置Tomcat" class="headerlink" title="5.IDEA配置Tomcat"></a>5.IDEA配置Tomcat</h4><p>找到IDEA上面有一个锤子图标的右边，有个下拉，点击Edit Configurations，进入后点击+号，添加一个Tomcat Server。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104114839858.png" alt="image-20251104114839858"></p><p>点击Tomcat 7详情进行编辑，找到Application server，选择Tomcat的安装位置，下面的默认浏览器启动，端口号设置，地址等等就看自己了。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104115137565.png" alt="image-20251104115137565"></p><h2 id="四、项目运行"><a href="#四、项目运行" class="headerlink" title="四、项目运行"></a>四、项目运行</h2><p>依赖包已经下载好了，tomcat也配置了，接下来就是运行项目了。</p><h4 id="1-修改配置"><a href="#1-修改配置" class="headerlink" title="1.修改配置"></a>1.修改配置</h4><p>数据库导入还原就跳过了，在项目中主要是修改数据库的连接配置，找到src-&gt;main下的resources中jdbc.properties，对参数进行修改即可。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104115704418.png" alt="image-20251104115704418"></p><h4 id="2-项目编译"><a href="#2-项目编译" class="headerlink" title="2.项目编译"></a>2.项目编译</h4><p>在IDEA中，找到那个锤子图标，然后点击Build Project，也可以在命令窗口输入，mvn clean，然后mvn compile，这样就会把源码编译成class了。</p><p>编译成功后在项目根目录会出现一个target，里面就是编译后的class文件了。</p><h4 id="3-项目运行"><a href="#3-项目运行" class="headerlink" title="3.项目运行"></a>3.项目运行</h4><p>项目运行，点击锤子图标的右边的一排图标，其中有一个三角形播放状的图标，点击后就可以在IDEA中通过Tomcat运行了。</p><h4 id="4-访问项目地址"><a href="#4-访问项目地址" class="headerlink" title="4.访问项目地址"></a>4.访问项目地址</h4><p>有些项目入口文件没有页面指向，这时我们可以找到SpringMVC的配置文件，在resources的spring-web.xml中，可以看到相关开放的访问地址。</p><p>第二个可以在controller文件中，找到@RequestMapping(“&#x2F;backend”)，控制器外层的是控制器名，里面的方法是方法名，然后在URL里输入localhost:8080&#x2F;控制器名&#x2F;方法名，就可以进入指定地址了。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSM%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251104131410388.png" alt="image-20251104131410388"></p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>除了SSM框架外，还有更早期的SSH（Spring+Struts2+Hibernate），以及现在非常流行的SpringBoot，后面我也会再更新~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：SSM项目搭建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Blender快捷键合集（一）</title>
    <link href="https://www.zerofc.cn/2025/06/20/Blender%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%90%88%E9%9B%86%EF%BC%88%E4%B8%80%EF%BC%89/"/>
    <id>https://www.zerofc.cn/2025/06/20/Blender%E5%BF%AB%E6%8D%B7%E9%94%AE%E5%90%88%E9%9B%86%EF%BC%88%E4%B8%80%EF%BC%89/</id>
    <published>2025-06-20T02:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h4 id="这里只是我个人平时练习总结的，佛系更新"><a href="#这里只是我个人平时练习总结的，佛系更新" class="headerlink" title="这里只是我个人平时练习总结的，佛系更新~"></a>这里只是我个人平时练习总结的，佛系更新~</h4><h2 id="关于合并"><a href="#关于合并" class="headerlink" title="关于合并"></a>关于合并</h2><p>如果shift选中两个模型，最后点击的是激活状态，那就是前一个合并到后一个，合并后的物体原点在最后一个物体上。</p><h2 id="父级设置和骨骼绑定"><a href="#父级设置和骨骼绑定" class="headerlink" title="父级设置和骨骼绑定"></a>父级设置和骨骼绑定</h2><p>如果shift选中两个模型，最后点击的是激活状态，那就是最后一个是父级，前一个会在最后一个模型下面作为子级，在大纲视图里可以通过shift拖动查看。</p><h2 id="快捷键列表"><a href="#快捷键列表" class="headerlink" title="快捷键列表"></a>快捷键列表</h2><table><thead><tr><th>快捷键</th><th align="left">说明</th></tr></thead><tbody><tr><td>ctrl+p</td><td align="left">给模型设置父级，绑定自动权重的骨骼</td></tr><tr><td>alt+p</td><td align="left">给骨骼拆除链接，可以随意拖动</td></tr><tr><td>shift+d</td><td align="left">快捷复制模型</td></tr><tr><td>~</td><td align="left">视角选择</td></tr><tr><td>ctrl+7</td><td align="left">输入对应数字切换对应视角</td></tr><tr><td>ctrl+j</td><td align="left">选中多个模型合并成一个</td></tr><tr><td>E</td><td align="left">选中一个骨骼后，在此上挤出一个子级骨骼</td></tr></tbody></table><h2 id="常用插件"><a href="#常用插件" class="headerlink" title="常用插件"></a>常用插件</h2><table><thead><tr><th>DragonFF</th><th>侠盗猎车.dff模型导入导出插件</th></tr></thead><tbody><tr><td>VRM_Addon_for_Blender</td><td>VRM格式模型导入导出插件</td></tr><tr><td>cats-blender-plugin</td><td>骨骼快捷绑定插件</td></tr><tr><td>speedRetopo</td><td>模型重拓扑插件</td></tr></tbody></table><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Blender快捷键合集。</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Blender" scheme="https://www.zerofc.cn/tags/Blender/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：SSH项目搭建</title>
    <link href="https://www.zerofc.cn/2025/05/29/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/05/29/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/</id>
    <published>2025-05-29T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>在 Java 企业级开发中，SSH 通常指的是 <strong>Struts2 + Spring + Hibernate</strong> 的组合。这个组合是一套常用的框架，用于构建 Web 应用程序。</p><p>其中Struts2用于处理 Web 请求和响应，实现 MVC（Model-View-Controller）模式；Spring用于实现依赖注入（Dependency Injection）和面向切面编程（Aspect-Oriented Programming）；Hibernate用于实现对象关系映射（Object-Relational Mapping, ORM），简化数据库操作。</p><p>早期这三个框架整合需要单独下载jar包的，现在使用Maven的话，只需要在pom中配置好依赖版本，编译的时候就可以自动构建了，下面就以一个简单的maven版SSH项目演示运行一下。</p><h2 id="二、项目配置"><a href="#二、项目配置" class="headerlink" title="二、项目配置"></a>二、项目配置</h2><p>导入这个项目后发现使用了jetty-maven-plugin，pom中也已经添加了struts、spring、hibernate的依赖，点击刷新依赖按钮就等待下载。</p><h4 id="1-配置-Struts2"><a href="#1-配置-Struts2" class="headerlink" title="1.配置 Struts2"></a>1.配置 Struts2</h4><p>在src的项目包下，找到webapp&#x2F;WEB-INF下面，没有就新建web.xml，配置 Struts2 过滤器；在resources中创建struts.xml，配置 Struts2 的动作映射和其他相关配置，页面怎么跳转就看那里了。</p><h4 id="2-配置-Spring"><a href="#2-配置-Spring" class="headerlink" title="2.配置 Spring"></a>2.配置 Spring</h4><p>在 src&#x2F;main&#x2F;resources 目录下创建 Spring 的配置文件，如 applicationContext.xml，配置 Spring 的 bean。</p><p>在 web.xml 中配置 Spring 的监听器来初始化 Spring 容器。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251106203608987.png" alt="image-20251106203608987"></p><h4 id="3-配置-Hibernate"><a href="#3-配置-Hibernate" class="headerlink" title="3.配置 Hibernate"></a>3.配置 Hibernate</h4><p>在 src&#x2F;main&#x2F;resources 目录下创建 Hibernate 的配置文件，如 hibernate.cfg.xml 或使用 Java 注解，配置数据库连接信息。</p><h2 id="三、项目构建"><a href="#三、项目构建" class="headerlink" title="三、项目构建"></a>三、项目构建</h2><p>在Java的SSH（Struts2 + Spring + Hibernate）项目中，通常会按照MVC（Model-View-Controller）架构和分层设计原则来组织代码，这有助于项目的维护和扩展。</p><h4 id="1-创建Action目录"><a href="#1-创建Action目录" class="headerlink" title="1.创建Action目录"></a>1.创建Action目录</h4><p>Action是Struts2框架中的组件，它作为MVC架构中的控制器（Controller）。Action负责接收用户请求，处理用户输入，调用相应的服务逻辑，并决定返回哪个视图（页面）给用户。</p><p>具体功能：通常会处理表单提交、页面导航等用户交互操作，是前端请求和后端处理之间的桥梁。</p><h4 id="2-创建Bean目录"><a href="#2-创建Bean目录" class="headerlink" title="2.创建Bean目录"></a>2.创建Bean目录</h4><p>Bean一般指的是Java中的实体类（也称为POJO，Plain Old Java Object），在SSH项目中，它们通常用于表示数据库中的表记录或者业务中的数据对象。</p><p>具体功能：Bean负责数据的封装，提供getter和setter方法来访问和修改数据属性。它们可以是模型（Model）的一部分，也可以是表单数据的载体。</p><p><img src="/img/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9ASSH%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/image-20251107095157060.png" alt="image-20251107095157060"></p><h4 id="3-创建Core目录"><a href="#3-创建Core目录" class="headerlink" title="3.创建Core目录"></a>3.创建Core目录</h4><p>Core层通常指的是项目的核心模块，包含了核心业务逻辑和基础的功能实现。</p><p>具体功能：这个层可能包含一些通用的工具类、配置类等，是项目的核心逻辑所在，确保项目的稳定性和可维护性。</p><h4 id="4-创建DAO目录"><a href="#4-创建DAO目录" class="headerlink" title="4.创建DAO目录"></a>4.创建DAO目录</h4><p>DAO（Data Access Object），DAO层是数据访问层，负责与数据库进行交互，封装了底层的数据访问逻辑。</p><p>具体功能：DAO层通常实现对数据库的CRUD（创建、读取、更新、删除）操作。通过使用Hibernate等ORM（对象关系映射）工具，可以简化数据访问的代码，提高开发效率。</p><h4 id="5-创建Service目录"><a href="#5-创建Service目录" class="headerlink" title="5.创建Service目录"></a>5.创建Service目录</h4><p>Service层是业务逻辑层，负责实现具体的业务逻辑处理。</p><p>具体功能：Service层会调用DAO层来获取数据，然后根据业务需求对数据进行处理和操作，最后可能还需要将处理后的数据返回给Action层。Service层的一个重要作用是封装业务逻辑，并提供给其他层调用。</p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>通过这种分层的设计，SSH项目可以更好地组织代码，使得每一层的职责更加明确，便于开发和维护。每一层都相对独立，降低了模块间的耦合度，提高了项目的可扩展性和灵活性。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：SSH项目搭建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：项目构建</title>
    <link href="https://www.zerofc.cn/2025/05/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/05/28/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E6%9E%84%E5%BB%BA/</id>
    <published>2025-05-28T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>上次简单记录了一下Java的单个文件的练习例子，从Hello World的打印到变量声明、数据类型、流程控制等简单的示例。</p><p>但是项目往往都是由多个文件组合强关联的，所以基于构建器来创建项目就很有必要了，下面我还是新手视角，用Maven创建Java项目做一个详细的入门总结。</p><h2 id="二、Maven安装"><a href="#二、Maven安装" class="headerlink" title="二、Maven安装"></a>二、Maven安装</h2><h4 id="1-下载"><a href="#1-下载" class="headerlink" title="1.下载"></a>1.下载</h4><p><a href="https://maven.apache.org/download.cgi">https://maven.apache.org/download.cgi</a></p><h4 id="2-maven版本指南"><a href="#2-maven版本指南" class="headerlink" title="2.maven版本指南"></a>2.maven版本指南</h4><p>因为Java版本和maven版本有关系，比如maven4.x以上的版本必须java 17及以上的，所以我罗列一下这些常用的版本对应关系。</p><table><thead><tr><th>maven版本</th><th>Java版本</th></tr></thead><tbody><tr><td>Maven 3.8.6</td><td>Java 8以上</td></tr><tr><td>Maven 3.5.4</td><td>Java 7以上</td></tr><tr><td>Maven 3.0.5</td><td>Java 1.6或以上</td></tr><tr><td>Maven 4.x</td><td>Java 17或以上</td></tr></tbody></table><h4 id="3-安装"><a href="#3-安装" class="headerlink" title="3.安装"></a>3.安装</h4><p>解压到电脑下的指定位置，然后找到Maven根目录下的conf文件夹下settings.xml，打开编辑，找到mirrors，添加国内的淘宝镜像，这样可以更快速构建项目。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">mirrors</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">mirror</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">id</span>&gt;</span>aliyun<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">name</span>&gt;</span>Aliyun Maven<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">       <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://maven.aliyun.com/repository/public<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">mirrorOf</span>&gt;</span>central<span class="tag">&lt;/<span class="name">mirrorOf</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">mirror</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">mirrors</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="4-添加环境变量"><a href="#4-添加环境变量" class="headerlink" title="4.添加环境变量"></a>4.添加环境变量</h4><p>还是在Maven根目录找到bin，然后复制那个文件夹的绝对路径，在电脑的环境变量中的path添加maven的bin路径，比如我的 “D:\1setsoft\1dev\apache-maven-3.8.9\bin”。</p><h4 id="5-验证"><a href="#5-验证" class="headerlink" title="5.验证"></a>5.验证</h4><p>cmd输入mvn -v查看版本号，表示成功。</p><h2 id="三、项目创建"><a href="#三、项目创建" class="headerlink" title="三、项目创建"></a>三、项目创建</h2><h4 id="1-maven构建项目"><a href="#1-maven构建项目" class="headerlink" title="1.maven构建项目"></a>1.maven构建项目</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn archetype:generate -DgroupId=com.example -DartifactId=02_mysql_example -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">mvn archetype:generate: 这是Maven的命令，用于生成新的项目。</span><br><span class="line"></span><br><span class="line">archetype:generate是Maven的原型插件的一个目标，表示要生成一个项目。</span><br><span class="line"></span><br><span class="line">-DgroupId=com.example: 这是指定项目的groupId。</span><br><span class="line"></span><br><span class="line">groupId通常是项目的组织或团队名称，使用反向域名的格式。在这个例子中，com.example是项目的groupId。 </span><br><span class="line"></span><br><span class="line">-DartifactId=02_mysql_example: 这是指定项目的artifactId。</span><br><span class="line"></span><br><span class="line">artifactId是项目的唯一标识符，通常是项目的名称。在这个例子中，02_mysql_example是项目的artifactId。 </span><br><span class="line"></span><br><span class="line">-DarchetypeArtifactId=maven-archetype-quickstart: 这是指定要使用的原型的artifactId。</span><br><span class="line"></span><br><span class="line">Maven原型是一个模板项目，用于快速生成符合Maven规范的项目结构。在这个例子中，maven-archetype-quickstart是一个基本的Java项目原型。</span><br><span class="line"></span><br><span class="line">-DinteractiveMode=false: 这个参数用于指定Maven在生成项目时是否采用交互模式。false表示非交互模式，即Maven会直接使用命令行中提供的参数来生成项目，而不会提示用户输入。</span><br><span class="line"></span><br><span class="line">如果设置为true，Maven会提示用户输入所需的参数。在这个例子中，Maven将不会进行交互式提示，而是直接使用已经提供的参数来生成项目。</span><br></pre></td></tr></table></figure><h4 id="2-项目配置"><a href="#2-项目配置" class="headerlink" title="2.项目配置"></a>2.项目配置</h4><p>在项目编译前，对模板项目的pom.xml进行修改，指定项目运行的主类。打开项目的pom.xml，只需要找到文件的根节点，然后添加下面代码。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">build</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.codehaus.mojo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>exec-maven-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.6.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">executions</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">execution</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">goals</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">goal</span>&gt;</span>java<span class="tag">&lt;/<span class="name">goal</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">goals</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">execution</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">executions</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">mainClass</span>&gt;</span>com.example.App<span class="tag">&lt;/<span class="name">mainClass</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">plugins</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">build</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>节点说明</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&lt;groupid&gt;（插件级别）：插件的唯一标识符。</span><br><span class="line">&lt;artifactid&gt;（插件级别）：插件的基本名称。</span><br><span class="line">&lt;version&gt;（插件级别）：插件的版本号。</span><br><span class="line">&lt;executions&gt;：定义插件的执行配置。</span><br><span class="line">&lt;execution&gt;：定义单个插件执行的详细信息。</span><br><span class="line">&lt;goals&gt;：定义插件执行的目标列表。</span><br><span class="line">&lt;goal&gt;：定义单个插件执行的目标。</span><br><span class="line">&lt;configuration&gt;：定义插件的配置参数。</span><br><span class="line">&lt;mainclass&gt;：定义项目的主类。</span><br><span class="line">通过这些标签，您可以详细配置项目的构建过程，包括使用的插件及其行为。</span><br></pre></td></tr></table></figure><h4 id="3-编译运行"><a href="#3-编译运行" class="headerlink" title="3.编译运行"></a>3.编译运行</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn compile</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn exec:java</span><br></pre></td></tr></table></figure><h2 id="四、如何修改Maven本地仓库位置"><a href="#四、如何修改Maven本地仓库位置" class="headerlink" title="四、如何修改Maven本地仓库位置"></a>四、如何修改Maven本地仓库位置</h2><p>默认情况下，maven会自动将项目的依赖下载到系统盘的.m2下，如果C盘空间告急的情况，可以通过对maven的配置将本地仓库位置放到指定位置。</p><p>找到maven下conf的settins.xml，在settings标签下添加：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">localRepository</span>&gt;</span>D:\1setsoft\1dev\apache-maven-3.8.9\Repository<span class="tag">&lt;/<span class="name">localRepository</span>&gt;</span></span><br></pre></td></tr></table></figure><p>其实在那个文件里有被注释掉的关于本地仓库的配置和说明，然后再次mvn compile编译时就会把依赖下载到新的位置了。</p><h2 id="五、MySQL增删改查案例"><a href="#五、MySQL增删改查案例" class="headerlink" title="五、MySQL增删改查案例"></a>五、MySQL增删改查案例</h2><h4 id="1-pom配置"><a href="#1-pom配置" class="headerlink" title="1.pom配置"></a>1.pom配置</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">&quot;http://maven.apache.org/POM/4.0.0&quot;</span> <span class="attr">xmlns:xsi</span>=<span class="string">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span></span></span><br><span class="line"><span class="tag">  <span class="attr">xsi:schemaLocation</span>=<span class="string">&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">modelVersion</span>&gt;</span>4.0.0<span class="tag">&lt;/<span class="name">modelVersion</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>com.example<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>02_mysql_example<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">packaging</span>&gt;</span>jar<span class="tag">&lt;/<span class="name">packaging</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">version</span>&gt;</span>1.0-SNAPSHOT<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">name</span>&gt;</span>02_mysql_example<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">url</span>&gt;</span>http://maven.apache.org<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dependencies</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.8.1<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">scope</span>&gt;</span>test<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">&lt;!-- MySQL Connector/J --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>mysql<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>mysql-connector-java<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">version</span>&gt;</span>8.0.26<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- JUnit for testing --&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>junit<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">version</span>&gt;</span>4.12<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">scope</span>&gt;</span>test<span class="tag">&lt;/<span class="name">scope</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;/<span class="name">dependencies</span>&gt;</span></span><br><span class="line"></span><br><span class="line">  <span class="tag">&lt;<span class="name">build</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line">    </span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.codehaus.mojo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>exec-maven-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.6.2<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">executions</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">execution</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">goals</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">goal</span>&gt;</span>java<span class="tag">&lt;/<span class="name">goal</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">goals</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">execution</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">executions</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">mainClass</span>&gt;</span>com.example.App<span class="tag">&lt;/<span class="name">mainClass</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.apache.maven.plugins<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>maven-compiler-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.8.1<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">source</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">source</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">target</span>&gt;</span>1.8<span class="tag">&lt;/<span class="name">target</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">encoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">encoding</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;/<span class="name">plugins</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">build</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">project</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-表格创建"><a href="#2-表格创建" class="headerlink" title="2.表格创建"></a>2.表格创建</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> DATABASE testdb;</span><br><span class="line"></span><br><span class="line">USE testdb;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> users (</span><br><span class="line">    id <span class="type">INT</span> AUTO_INCREMENT <span class="keyword">PRIMARY</span> KEY,</span><br><span class="line">    name <span class="type">VARCHAR</span>(<span class="number">100</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line">    email <span class="type">VARCHAR</span>(<span class="number">100</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h4 id="3-业务逻辑"><a href="#3-业务逻辑" class="headerlink" title="3.业务逻辑"></a>3.业务逻辑</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example;</span><br><span class="line"><span class="keyword">import</span> java.sql.Connection;</span><br><span class="line"><span class="keyword">import</span> java.sql.DriverManager;</span><br><span class="line"><span class="keyword">import</span> java.sql.PreparedStatement;</span><br><span class="line"><span class="keyword">import</span> java.sql.ResultSet;</span><br><span class="line"><span class="keyword">import</span> java.sql.SQLException;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 数据库连接</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">App</span> </span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 数据库连接信息</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JDBC_URL</span> <span class="operator">=</span> <span class="string">&quot;jdbc:mysql://localhost:3306/game&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JDBC_USER</span> <span class="operator">=</span> <span class="string">&quot;root&quot;</span>;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">JDBC_PASSWORD</span> <span class="operator">=</span> <span class="string">&quot;root&quot;</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">( String[] args )</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 连接数据库</span></span><br><span class="line">        <span class="keyword">try</span> (<span class="type">Connection</span> <span class="variable">connection</span> <span class="operator">=</span> DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) &#123;</span><br><span class="line">            <span class="comment">// 插入数据</span></span><br><span class="line">            insertUser(connection, <span class="string">&quot;Alice&quot;</span>, <span class="string">&quot;alice@example.com&quot;</span>);</span><br><span class="line">            insertUser(connection, <span class="string">&quot;Bob&quot;</span>, <span class="string">&quot;bob@example.com&quot;</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据</span></span><br><span class="line">            List&lt;User&gt; users = selectUsers(connection);</span><br><span class="line">            System.out.println(<span class="string">&quot;查询到的用户:&quot;</span>);</span><br><span class="line">            <span class="keyword">for</span> (User user : users) &#123;</span><br><span class="line">                System.out.println(user);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 更新数据</span></span><br><span class="line">            updateUser(connection, <span class="number">1</span>, <span class="string">&quot;Alice Smith&quot;</span>, <span class="string">&quot;alice.smith@example.com&quot;</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据（更新后）</span></span><br><span class="line">            users = selectUsers(connection);</span><br><span class="line">            System.out.println(<span class="string">&quot;更新后的用户:&quot;</span>);</span><br><span class="line">            <span class="keyword">for</span> (User user : users) &#123;</span><br><span class="line">                System.out.println(user);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 删除数据</span></span><br><span class="line">            deleteUser(connection, <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 查询数据（删除后）</span></span><br><span class="line">            users = selectUsers(connection);</span><br><span class="line">            System.out.println(<span class="string">&quot;删除后的用户:&quot;</span>);</span><br><span class="line">            <span class="keyword">for</span> (User user : users) &#123;</span><br><span class="line">                System.out.println(user);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">catch</span> (SQLException e) &#123;</span><br><span class="line">            e.printStackTrace();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 插入用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">insertUser</span><span class="params">(Connection connection, String name, String email)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;INSERT INTO users (name, email) VALUES (?, ?)&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql)) &#123;</span><br><span class="line">            pstmt.setString(<span class="number">1</span>, name);</span><br><span class="line">            pstmt.setString(<span class="number">2</span>, email);</span><br><span class="line">            pstmt.executeUpdate();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 查询用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> List&lt;User&gt; <span class="title function_">selectUsers</span><span class="params">(Connection connection)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        List&lt;User&gt; users = <span class="keyword">new</span> <span class="title class_">ArrayList</span>&lt;&gt;();</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;SELECT id, name, email FROM users&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql);</span><br><span class="line">             <span class="type">ResultSet</span> <span class="variable">rs</span> <span class="operator">=</span> pstmt.executeQuery()) &#123;</span><br><span class="line">            <span class="keyword">while</span> (rs.next()) &#123;</span><br><span class="line">                <span class="type">int</span> <span class="variable">id</span> <span class="operator">=</span> rs.getInt(<span class="string">&quot;id&quot;</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> rs.getString(<span class="string">&quot;name&quot;</span>);</span><br><span class="line">                <span class="type">String</span> <span class="variable">email</span> <span class="operator">=</span> rs.getString(<span class="string">&quot;email&quot;</span>);</span><br><span class="line">                users.add(<span class="keyword">new</span> <span class="title class_">User</span>(id, name, email));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> users;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 更新用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">updateUser</span><span class="params">(Connection connection, <span class="type">int</span> id, String name, String email)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;UPDATE users SET name = ?, email = ? WHERE id = ?&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql)) &#123;</span><br><span class="line">            pstmt.setString(<span class="number">1</span>, name);</span><br><span class="line">            pstmt.setString(<span class="number">2</span>, email);</span><br><span class="line">            pstmt.setInt(<span class="number">3</span>, id);</span><br><span class="line">            pstmt.executeUpdate();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 删除用户</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">deleteUser</span><span class="params">(Connection connection, <span class="type">int</span> id)</span> <span class="keyword">throws</span> SQLException &#123;</span><br><span class="line">        <span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">&quot;DELETE FROM users WHERE id = ?&quot;</span>;</span><br><span class="line">        <span class="keyword">try</span> (<span class="type">PreparedStatement</span> <span class="variable">pstmt</span> <span class="operator">=</span> connection.prepareStatement(sql)) &#123;</span><br><span class="line">            pstmt.setInt(<span class="number">1</span>, id);</span><br><span class="line">            pstmt.executeUpdate();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">User</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> id;</span><br><span class="line">    <span class="keyword">private</span> String name;</span><br><span class="line">    <span class="keyword">private</span> String email;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">User</span><span class="params">(<span class="type">int</span> id, String name, String email)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.id = id;</span><br><span class="line">        <span class="built_in">this</span>.name = name;</span><br><span class="line">        <span class="built_in">this</span>.email = email;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;User&#123;&quot;</span> +</span><br><span class="line">                <span class="string">&quot;id=&quot;</span> + id +</span><br><span class="line">                <span class="string">&quot;, name=&#x27;&quot;</span> + name + <span class="string">&#x27;\&#x27;&#x27;</span> +</span><br><span class="line">                <span class="string">&quot;, email=&#x27;&quot;</span> + email + <span class="string">&#x27;\&#x27;&#x27;</span> +</span><br><span class="line">                <span class="string">&#x27;&#125;&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="六、写在后面"><a href="#六、写在后面" class="headerlink" title="六、写在后面"></a>六、写在后面</h2><p>以上就完成了一个简答的Java项目构建，但是对于真正的项目多数还是会使用市面上成熟的框架，所以下次就是基于框架进行简单实战了，待更新~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：项目构建</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>C语言入门：内存修改器</title>
    <link href="https://www.zerofc.cn/2025/05/26/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8/"/>
    <id>https://www.zerofc.cn/2025/05/26/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8/</id>
    <published>2025-05-26T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>在我们平时玩单机游戏卡关时，常常会在社区或群里找各种修改器或开挂软件。用来给血条蓝条加量，或者修改技能或武器，而这些工具其实都是通过修改游戏运行时的内存实现的。</p><p>所以，既为了学习C语言，也为了玩一下CE修改器，就本地用visual studio跑一个内存修改的程序。以java常驻内存为例，然后用CE扫描该java进程中指定值的内存地址，最后运行C程序修改内存的值。</p><h2 id="二、开始操作"><a href="#二、开始操作" class="headerlink" title="二、开始操作"></a>二、开始操作</h2><h4 id="1-Java代码"><a href="#1-Java代码" class="headerlink" title="1.Java代码"></a>1.Java代码</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MemoryOpera</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">String</span> <span class="variable">playerName</span> <span class="operator">=</span> <span class="string">&quot;InitialName&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// D5AF8E9C   -- D5AF8ECC  D5AF8F14</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="variable">playerHealth</span> <span class="operator">=</span> <span class="number">3598797</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception &#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 1730CF14   -- 1744CED4</span></span><br><span class="line"><span class="type">int</span> <span class="variable">currentHealth</span> <span class="operator">=</span> <span class="number">7891</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">Uitls</span> <span class="variable">tools</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Uitls</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 0327F238 02BFF1B8</span></span><br><span class="line"><span class="type">int</span> <span class="variable">num</span> <span class="operator">=</span> tools.computerData();</span><br><span class="line"></span><br><span class="line"><span class="comment">// System.out.println(&quot;Process ID: &quot; + ProcessHandle.current().pid());</span></span><br><span class="line"></span><br><span class="line">System.out.println(<span class="string">&quot;Player: &quot;</span> + playerName + <span class="string">&quot;, Health: &quot;</span> + playerHealth + <span class="string">&quot;, CurHealth:&quot;</span> + num);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 保持程序运行，等待 Cheat Engine 附加和修改</span></span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">Thread.sleep(<span class="number">1000</span>);</span><br><span class="line"><span class="comment">// 在这里通过 Cheat Engine 修改 playerName 或 playerHealth 后，会看到输出变化</span></span><br><span class="line">System.out.println(<span class="string">&quot;[Running] Player: &quot;</span> + playerName + <span class="string">&quot;, Health: &quot;</span> + playerHealth + <span class="string">&quot;, CurHealth:&quot;</span> + num);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// Get-Process -Id 4792 | Select-Object -ExpandProperty Threads</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Uitls</span> </span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 数据计算</span></span><br><span class="line"><span class="keyword">public</span> <span class="type">int</span> <span class="title function_">computerData</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 17980848  - 17330848</span></span><br><span class="line"><span class="type">int</span> <span class="variable">startNum</span> <span class="operator">=</span> <span class="number">3598200</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 17980850  - 17330850</span></span><br><span class="line"><span class="type">int</span> <span class="variable">endNum</span> <span class="operator">=</span> <span class="number">3598202</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="variable">totalNum</span> <span class="operator">=</span> startNum + endNum;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> totalNum;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-编译Java程序"><a href="#2-编译Java程序" class="headerlink" title="2.编译Java程序"></a>2.编译Java程序</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">javac -encoding UTF-8 MemoryOpera.java</span><br></pre></td></tr></table></figure><h4 id="3-运行Java程序"><a href="#3-运行Java程序" class="headerlink" title="3.运行Java程序"></a>3.运行Java程序</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java MemoryOpera</span><br></pre></td></tr></table></figure><h4 id="4-查看程序进程ID"><a href="#4-查看程序进程ID" class="headerlink" title="4.查看程序进程ID"></a>4.查看程序进程ID</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tasklist | findstr &quot;java&quot;</span><br></pre></td></tr></table></figure><h4 id="5-Cheat-Engine打开Java进程"><a href="#5-Cheat-Engine打开Java进程" class="headerlink" title="5.Cheat Engine打开Java进程"></a>5.Cheat Engine打开Java进程</h4><p>如果在进程列表中不好找，可以右键，选择 “手动输入PID” 或者过滤器，前者就把上面的进程ID放进去，后者就输入程序名，都可以筛选，最后打开。</p><p><img src="/img/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8/image-20251128172412019.png" alt="image-20251128172412019"></p><h4 id="6-查找内存地址"><a href="#6-查找内存地址" class="headerlink" title="6.查找内存地址"></a>6.查找内存地址</h4><p>这里主要把程序运行后输出展示的数值粘贴进去，然后点击扫描就可以在结果中看到值对应的地址，最后把内存地址复制出来，当然在CE修改器中也能直接改。</p><p><img src="/img/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8/image-20251128172823142.png" alt="image-20251128172823142"></p><h4 id="7-创建C程序"><a href="#7-创建C程序" class="headerlink" title="7.创建C程序"></a>7.创建C程序</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;windows.h&gt;</span></span></span><br><span class="line"></span><br><span class="line">BOOL <span class="title function_">write_process_memory</span><span class="params">(HANDLE process, LPVOID address, LPCVOID data, SIZE_T size)</span> &#123;</span><br><span class="line"></span><br><span class="line">    SIZE_T bytes_written;</span><br><span class="line"></span><br><span class="line">    BOOL success = WriteProcessMemory(</span><br><span class="line">        process,          <span class="comment">// 目标进程句柄</span></span><br><span class="line">        address,          <span class="comment">// 要写入的地址</span></span><br><span class="line">        data,             <span class="comment">// 要写入的数据</span></span><br><span class="line">        size,             <span class="comment">// 数据大小</span></span><br><span class="line">        &amp;bytes_written    <span class="comment">// 实际写入的字节数</span></span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (success &amp;&amp; bytes_written == size) &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;成功写入 %zu 字节到地址 %p\n&quot;</span>, bytes_written, address);</span><br><span class="line">        <span class="keyword">return</span> TRUE;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;写入失败! 错误代码: %lu\n&quot;</span>, GetLastError());</span><br><span class="line">        <span class="keyword">return</span> FALSE;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">example_windows</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="comment">// 假设我们有一个目标进程ID和要修改的地址</span></span><br><span class="line">    DWORD target_pid = <span class="number">10712</span>;  <span class="comment">// 替换为实际进程ID</span></span><br><span class="line">    <span class="type">uintptr_t</span> target_address = <span class="number">0x027BF448</span>;  <span class="comment">// 替换为实际内存地址</span></span><br><span class="line">    <span class="type">int</span> new_value = <span class="number">9999</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 打开目标进程</span></span><br><span class="line">    HANDLE hProcess = OpenProcess(</span><br><span class="line">        PROCESS_VM_WRITE | PROCESS_VM_OPERATION,</span><br><span class="line">        FALSE,</span><br><span class="line">        target_pid</span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (hProcess == <span class="literal">NULL</span>) &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;无法打开进程! 错误代码: %lu\n&quot;</span>, GetLastError());</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 写入内存</span></span><br><span class="line">    write_process_memory(hProcess, (LPVOID)target_address, &amp;new_value, <span class="keyword">sizeof</span>(new_value));</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 关闭句柄</span></span><br><span class="line">    CloseHandle(hProcess);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> &#123;</span><br><span class="line">    example_windows();</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="8-运行程序"><a href="#8-运行程序" class="headerlink" title="8.运行程序"></a>8.运行程序</h4><p>在visual studio中创建的C++控制台程序，把上面代码复制过来，然后修改里面的进程ID，内存地址，修改值，最后点击运行按钮就直接编译运行了。</p><p><img src="/img/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E5%86%85%E5%AD%98%E4%BF%AE%E6%94%B9%E5%99%A8/image-20251128174722047.png" alt="image-20251128174722047"></p><p>最后再回到Java运行的控制面板，发现里面不断输出的那个数值就被修改了。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">C语言入门：环境安装</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="C语言" scheme="https://www.zerofc.cn/tags/C%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>AI编程（一）：TRAE提示词指南</title>
    <link href="https://www.zerofc.cn/2025/05/25/AI%E7%BC%96%E7%A8%8B%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9ATRAE%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%8C%87%E5%8D%97/"/>
    <id>https://www.zerofc.cn/2025/05/25/AI%E7%BC%96%E7%A8%8B%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9ATRAE%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%8C%87%E5%8D%97/</id>
    <published>2025-05-25T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>TRAE是字节跳动推出的一款AI编程的得力助手，他可以作为插件安装在VSCode中，也可以作为编辑器独立使用。</p><p>分国内和国际版，国内版本可以选择豆包、DeepSeek等模型作为智能对话引擎，还能对接MCP Server等功能。</p><p>编程上可以直接通过自然语言对话，然后编辑器分解成自动化任务，自动执行，还是非常方便，我也是刚玩这个IDE，顺便整理了几个提示词，仅供参考。</p><h2 id="二、写-MCP-Server"><a href="#二、写-MCP-Server" class="headerlink" title="二、写 MCP Server"></a>二、写 MCP Server</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">我想写一个Go语言的计算器MCP Server，具体需求如下：</span><br><span class="line"></span><br><span class="line">使用场景：能配置在Trae编辑器的本地MCP Servers中</span><br><span class="line"></span><br><span class="line">已有环境：</span><br><span class="line">1. Go 1.23.3</span><br><span class="line">2. Trae CN 0.5.7</span><br><span class="line"></span><br><span class="line">技术要求：</span><br><span class="line">1. 使用mcp-go库，基于SSE模式</span><br><span class="line">2. 该MCP Server中要添加工具、资源、提示词</span><br><span class="line">3. 本地开启的端口是8090</span><br><span class="line"></span><br><span class="line">请提供完整的代码实现，并可能配置到Trae中，不能让他启动时报错。</span><br></pre></td></tr></table></figure><h2 id="三、写豆瓣电影爬虫"><a href="#三、写豆瓣电影爬虫" class="headerlink" title="三、写豆瓣电影爬虫"></a>三、写豆瓣电影爬虫</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">我想写一个Python爬虫来爬取豆瓣电影Top250的信息，具体需求如下：</span><br><span class="line"></span><br><span class="line">目标网站：https://movie.douban.com/top250</span><br><span class="line"></span><br><span class="line">需要爬取的信息：</span><br><span class="line">1. 电影排名</span><br><span class="line">2. 电影名称（中文名+外文名）</span><br><span class="line">3. 导演</span><br><span class="line">4. 主演（最多3个）</span><br><span class="line">5. 上映年份</span><br><span class="line">6. 制片国家/地区</span><br><span class="line">7. 电影类型</span><br><span class="line">8. 豆瓣评分</span><br><span class="line">9. 评价人数</span><br><span class="line">10. 一句话简介</span><br><span class="line">11. 电影海报图片链接</span><br><span class="line"></span><br><span class="line">技术要求：</span><br><span class="line">1. 使用 requests + BeautifulSoup 进行爬取</span><br><span class="line">2. 添加合理的请求头，模拟正常浏览器访问</span><br><span class="line">3. 设置随机延时（1-3秒），避免请求过快</span><br><span class="line">4. 处理可能的反爬措施（如需要登录、验证码等）</span><br><span class="line">5. 使用 logging 记录爬取进度</span><br><span class="line">6. 异常处理：网络错误、解析错误等</span><br><span class="line"></span><br><span class="line">数据存储：</span><br><span class="line">1. 爬取的数据保存为 CSV 文件</span><br><span class="line">2. 同时保存为 JSON 文件，方便后续处理</span><br><span class="line">3. 图片链接单独保存在一个文本文件中</span><br><span class="line">4. 使用 pandas 对数据进行简单清洗</span><br><span class="line"></span><br><span class="line">额外功能：</span><br><span class="line">1. 支持断点续爬（如果中途中断，下次可以继续）</span><br><span class="line">2. 爬取完成后，生成简单的数据分析：</span><br><span class="line">   - 各年代电影数量分布</span><br><span class="line">   - 各国家/地区电影数量</span><br><span class="line">   - 评分分布直方图</span><br><span class="line">   - 导演作品数量排行（前10）</span><br><span class="line"></span><br><span class="line">3. 生成一个 HTML 报告，展示爬取结果的统计信息</span><br><span class="line"></span><br><span class="line">代码规范：</span><br><span class="line">- 使用类来组织代码</span><br><span class="line">- 添加详细的中文注释</span><br><span class="line">- 遵循 PEP 8 编码规范</span><br><span class="line">- 提供使用说明和依赖库列表</span><br><span class="line"></span><br><span class="line">请提供完整的代码实现，并说明如何处理可能遇到的反爬问题。</span><br></pre></td></tr></table></figure><h2 id="四、写轮播图组件"><a href="#四、写轮播图组件" class="headerlink" title="四、写轮播图组件"></a>四、写轮播图组件</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">帮我写一个轮播图组件，要求如下：</span><br><span class="line"></span><br><span class="line">使用场景：电商网站首页的商品推荐轮播</span><br><span class="line"></span><br><span class="line">具体需求：</span><br><span class="line">1. 基础功能：</span><br><span class="line">   - 自动播放，每3秒切换一次</span><br><span class="line">   - 鼠标悬停时暂停播放</span><br><span class="line">   - 支持左右箭头切换</span><br><span class="line">   - 底部有小圆点指示器</span><br><span class="line">   - 支持手机端的左右滑动</span><br><span class="line"></span><br><span class="line">2. 样式设计：</span><br><span class="line">   - 轮播图尺寸：宽度100%，高度400px（PC端）/ 200px（移动端）</span><br><span class="line">   - 图片要保持16:9比例，多余部分裁切</span><br><span class="line">   - 左右箭头：半透明白色背景，hover时不透明度增加</span><br><span class="line">   - 指示器：白色圆点，当前项为主题色 #ff6b6b</span><br><span class="line">   - 切换动画：淡入淡出效果，持续时间300ms</span><br><span class="line"></span><br><span class="line">3. 技术要求：</span><br><span class="line">   - 使用 Vue 3 的 Composition API</span><br><span class="line">   - 不依赖第三方轮播库，原生实现</span><br><span class="line">   - 支持 TypeScript</span><br><span class="line">   - 样式使用 CSS Module</span><br><span class="line"></span><br><span class="line">4. 数据结构：</span><br><span class="line">   传入的图片数组格式：</span><br><span class="line">   [&#123;</span><br><span class="line">     id: 1,</span><br><span class="line">     url: &#x27;图片地址&#x27;,</span><br><span class="line">     title: &#x27;图片标题&#x27;,</span><br><span class="line">     link: &#x27;点击跳转链接&#x27;</span><br><span class="line">   &#125;]</span><br><span class="line"></span><br><span class="line">5. 额外功能：</span><br><span class="line">   - 图片懒加载</span><br><span class="line">   - 支持传入自定义切换时间</span><br><span class="line">   - 暴露切换方法供父组件调用</span><br><span class="line">   - 切换时触发 change 事件</span><br><span class="line"></span><br><span class="line">请提供完整的 Vue 组件代码，包括详细的注释说明。</span><br></pre></td></tr></table></figure><h2 id="五、写瀑布流页面"><a href="#五、写瀑布流页面" class="headerlink" title="五、写瀑布流页面"></a>五、写瀑布流页面</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">我想做一个仿小红书的瀑布流图片展示页面，具体需求如下：</span><br><span class="line"></span><br><span class="line">技术栈：</span><br><span class="line">- 使用 React 18 + TypeScript</span><br><span class="line">- 样式使用 Tailwind CSS</span><br><span class="line">- 状态管理用 Zustand</span><br><span class="line">- 图片懒加载使用 react-lazyload</span><br><span class="line"></span><br><span class="line">页面结构：</span><br><span class="line">1. 顶部搜索栏：</span><br><span class="line">   - 左侧logo（文字&quot;小蓝书&quot;）</span><br><span class="line">   - 中间搜索框，带搜索图标，placeholder&quot;搜索你感兴趣的内容&quot;</span><br><span class="line">   - 右侧发布按钮</span><br><span class="line"></span><br><span class="line">2. 瀑布流主体：</span><br><span class="line">   - 两列布局（移动端），三列布局（平板），四列布局（桌面端）</span><br><span class="line">   - 每个卡片包含：</span><br><span class="line">     * 图片（宽度100%，高度自适应）</span><br><span class="line">     * 标题（最多两行，超出显示...）</span><br><span class="line">     * 作者头像（圆形，24px）和昵称</span><br><span class="line">     * 点赞数（红心图标+数字）</span><br><span class="line">   - 卡片hover效果：轻微上浮，阴影加深</span><br><span class="line">   - 点击卡片有按压效果</span><br><span class="line"></span><br><span class="line">3. 数据加载：</span><br><span class="line">   - 首次加载20条数据</span><br><span class="line">   - 滚动到底部自动加载更多</span><br><span class="line">   - 加载时显示 loading 动画</span><br><span class="line">   - 使用 mock 数据，包含不同高度的图片</span><br><span class="line"></span><br><span class="line">样式要求：</span><br><span class="line">- 整体风格清新简洁</span><br><span class="line">- 主色调：#fe2c55（小红书红）</span><br><span class="line">- 背景色：#f5f5f5</span><br><span class="line">- 卡片背景：纯白，圆角 8px</span><br><span class="line">- 适配 iPhone 12 及以上机型</span><br><span class="line"></span><br><span class="line">交互效果：</span><br><span class="line">- 下拉刷新功能</span><br><span class="line">- 图片加载失败显示默认图</span><br><span class="line">- 点赞动画：点击后红心放大再缩小</span><br><span class="line">- 页面切换使用渐入效果</span><br><span class="line"></span><br><span class="line">请生成完整的代码，包括组件拆分、样式处理和数据 mock。</span><br></pre></td></tr></table></figure><h2 id="六、写在后面"><a href="#六、写在后面" class="headerlink" title="六、写在后面"></a>六、写在后面</h2><p>当然，这些提示词你也可以放到其他大模型下使用，下次我再整理一下自定义MCP Server的实践实例，敬请期待~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">AI编程（一）：TRAE提示词指南</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="AI编程" scheme="https://www.zerofc.cn/tags/AI%E7%BC%96%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>C语言入门：环境安装</title>
    <link href="https://www.zerofc.cn/2025/05/25/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/"/>
    <id>https://www.zerofc.cn/2025/05/25/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/</id>
    <published>2025-05-25T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>最近下了一个开源的游戏模拟器源码，准备想要修改的，但发现是用C++写的，奈何我之前没学过C，没得办法，就从零开始系统学习一下，于是就从环境搭建开始吧。</p><p>在windows下，有几种环境配置的方法，其中我觉得比较方便的是VSCode+MinGW方式，一个是编辑器中的扩展，一个是编译器。</p><h2 id="二、安装"><a href="#二、安装" class="headerlink" title="二、安装"></a>二、安装</h2><h4 id="1-MinGW下载"><a href="#1-MinGW下载" class="headerlink" title="1.MinGW下载"></a>1.MinGW下载</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://sourceforge.net/projects/mingw-w64/</span><br></pre></td></tr></table></figure><h4 id="2-安装"><a href="#2-安装" class="headerlink" title="2.安装"></a>2.安装</h4><p>选择一个版本，我这里是8.1解压后放到指定位置，将文件夹bin放到系统环境变量path中。</p><h4 id="3-验证"><a href="#3-验证" class="headerlink" title="3.验证"></a>3.验证</h4><p>cmd输入g++ –version查看版本号，其中gcc常用于编译C语言、g++编译C++。</p><h4 id="4-编译指令"><a href="#4-编译指令" class="headerlink" title="4.编译指令"></a>4.编译指令</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gcc main.c -o main</span><br></pre></td></tr></table></figure><p>通过将main.c文件编译成main.exe，本地可以直接在命令总运行，可以查看程序的打印结果。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./main.exe</span><br></pre></td></tr></table></figure><h2 id="三、VSCode配置"><a href="#三、VSCode配置" class="headerlink" title="三、VSCode配置"></a>三、VSCode配置</h2><h4 id="1-安装C-C-扩展"><a href="#1-安装C-C-扩展" class="headerlink" title="1.安装C&#x2F;C++扩展"></a>1.安装C&#x2F;C++扩展</h4><p>打开VSCode，点击左侧活动栏的扩展图标（四个方块组成的图标），再搜索 “C&#x2F;C++”，找到由Microsoft提供的 “C&#x2F;C++”扩展并点击安装。</p><h4 id="2-创建C项目"><a href="#2-创建C项目" class="headerlink" title="2.创建C项目"></a>2.创建C项目</h4><p>添加一个C语言文件，比如main.c 。</p><h4 id="3-配置任务"><a href="#3-配置任务" class="headerlink" title="3.配置任务"></a>3.配置任务</h4><p>点击左侧活动栏的调试图标（一个带虫子的图标），然后点击 “Run and Debug”，选择 “C&#x2F;C++: gcc.exe build and debug active file‘，项目根目录的.vscode中会自动生成task.json，laugch.json并运行程序。</p><p>VSCode下TERMINAL也就是控制台自动显示程序执行的打印，还一种运行程序的方式是，当打开指定文件时，点击窗口的右上角的运行按钮（三角标）也可以执行。</p><p><img src="/img/C%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E7%8E%AF%E5%A2%83%E5%AE%89%E8%A3%85/image-20251126221110828.png" alt="image-20251126221110828"></p><h2 id="四、其他"><a href="#四、其他" class="headerlink" title="四、其他"></a>四、其他</h2><h4 id="1-cmd控制台乱码"><a href="#1-cmd控制台乱码" class="headerlink" title="1.cmd控制台乱码"></a>1.cmd控制台乱码</h4><p>当代码中有中文打印时，在cmd中显示乱码，主要原因是源码是UTF-8编码，而电脑是中文lang，cmd默认编码GBK，所以解决方法就是让源码和控制台的编码保持一致就行。</p><p>我的做法就是修改控制台的编码方式，首先通过下面命令查看代码页，936代表是GBK，65001代表UTF-8</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chcp</span><br></pre></td></tr></table></figure><table><thead><tr><th align="left">代码页</th><th align="left">编码标准</th><th align="left">主要用途</th></tr></thead><tbody><tr><td align="left"><strong>936</strong></td><td align="left"><strong>GBK</strong></td><td align="left">简体中文Windows系统默认</td></tr><tr><td align="left">65001</td><td align="left">UTF-8</td><td align="left">国际统一编码</td></tr><tr><td align="left">437</td><td align="left">IBM ASCII</td><td align="left">英文DOS</td></tr><tr><td align="left">950</td><td align="left">Big5</td><td align="left">繁体中文</td></tr><tr><td align="left"><strong>936</strong></td><td align="left"><strong>GBK</strong></td><td align="left">简体中文</td></tr><tr><td align="left"><strong>950</strong></td><td align="left"><strong>Big5</strong></td><td align="left">繁体中文</td></tr><tr><td align="left">54936</td><td align="left">GB18030</td><td align="left">最新中文标准</td></tr><tr><td align="left">1200</td><td align="left">UTF-16LE</td><td align="left">Unicode小端序</td></tr></tbody></table><p>如果要修改成一个指定编码，比如UTF-8的，可以执行下面命令，最后再.&#x2F;name.exe就可以看到中文打印了。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chcp 65001</span><br></pre></td></tr></table></figure><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">C语言入门：环境安装</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="C语言" scheme="https://www.zerofc.cn/tags/C%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Java语言入门：项目运行</title>
    <link href="https://www.zerofc.cn/2025/05/25/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/"/>
    <id>https://www.zerofc.cn/2025/05/25/Java%E8%AF%AD%E8%A8%80%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/</id>
    <published>2025-05-25T08:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>我有个习惯，学习任何一门编程语言都不喜欢上来就各种重型IDE、项目管理工具。所以，放到Java上，我还是喜欢直接用javac编译，然后直接运行。</p><h2 id="二、安装"><a href="#二、安装" class="headerlink" title="二、安装"></a>二、安装</h2><h4 id="1-安装包"><a href="#1-安装包" class="headerlink" title="1.安装包"></a>1.安装包</h4><p>下载JDK并安装到本地。</p><h4 id="2-操作"><a href="#2-操作" class="headerlink" title="2.操作"></a>2.操作</h4><p>E:\2setsoft\1dev\jdk1.8.0_77添加到环境变量，改名为JAVA_HOME</p><h4 id="3-验证"><a href="#3-验证" class="headerlink" title="3.验证"></a>3.验证</h4><p>cmd输入javac -version查看版本号，表示成功。</p><h2 id="三、项目创建"><a href="#三、项目创建" class="headerlink" title="三、项目创建"></a>三、项目创建</h2><h4 id="1-创建java单文件"><a href="#1-创建java单文件" class="headerlink" title="1.创建java单文件"></a>1.创建java单文件</h4><p>比如Hello.java文件。</p><h4 id="2-添加打印代码"><a href="#2-添加打印代码" class="headerlink" title="2.添加打印代码"></a>2.添加打印代码</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">public class HelloWorld &#123;</span><br><span class="line"></span><br><span class="line">    public static void main(String[] args) &#123;</span><br><span class="line">    </span><br><span class="line">        System.out.println(&quot;Hello  World! 2025-10-14 13:50&quot;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="3-编译代码"><a href="#3-编译代码" class="headerlink" title="3.编译代码"></a>3.编译代码</h4><p>将上面的HelloWorld类编译成class</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">javac -encoding UTF-8 HelloWorld.java</span><br></pre></td></tr></table></figure><p>运行成功后在当前文件夹下会生成 HelloWorld.class</p><h4 id="4-运行代码"><a href="#4-运行代码" class="headerlink" title="4.运行代码"></a>4.运行代码</h4><p>在当前文件夹下，找到生成的class，然后命令输入。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java HelloWorld</span><br></pre></td></tr></table></figure><h4 id="6-打包成jar"><a href="#6-打包成jar" class="headerlink" title="6.打包成jar"></a>6.打包成jar</h4><p>前面也是要先将程序编译成class，然后运行下面代码。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jar cvf Calculator.jar  Calculator.class</span><br></pre></td></tr></table></figure><h2 id="四、附加"><a href="#四、附加" class="headerlink" title="四、附加"></a>四、附加</h2><h4 id="1-java版计算器程序"><a href="#1-java版计算器程序" class="headerlink" title="1.java版计算器程序"></a>1.java版计算器程序</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Scanner; </span><br><span class="line"><span class="keyword">import</span> java.util.ArrayDeque; </span><br><span class="line"><span class="keyword">import</span> java.util.Deque; </span><br><span class="line"> </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Calculator</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line"></span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">scanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in); </span><br><span class="line">        System.out.println(<span class="string">&quot;🧮  Java 控制台计算器&quot;</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot;════════════════════&quot;</span>); </span><br><span class="line">        System.out.println(<span class="string">&quot; 支持操作: +, -, *, /&quot;</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot; 输入格式: 数字 运算符 数字 (如: 2 + 3 * 4)&quot;</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot; 输入 &#x27;exit&#x27; 退出程序&quot;</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot;════════════════════&quot;</span>); </span><br><span class="line"> </span><br><span class="line">        <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">            System.out.print(<span class="string">&quot;➤  输入表达式: &quot;</span>);</span><br><span class="line">            <span class="type">String</span> <span class="variable">input</span> <span class="operator">=</span> scanner.nextLine().trim(); </span><br><span class="line">            </span><br><span class="line">            <span class="keyword">if</span> (input.equalsIgnoreCase(<span class="string">&quot;exit&quot;</span>))  &#123;</span><br><span class="line">                System.out.println(<span class="string">&quot;🛑  程序已退出&quot;</span>);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">if</span> (input.isEmpty())  &#123;</span><br><span class="line">                System.out.println(<span class="string">&quot;⚠️  错误：输入不能为空&quot;</span>);</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="type">double</span> <span class="variable">result</span> <span class="operator">=</span> evaluateExpression(input);</span><br><span class="line">                System.out.printf(<span class="string">&quot;✅  计算结果: %s = %.2f\n\n&quot;</span>, input, result);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                System.out.println(<span class="string">&quot;❌  错误: &quot;</span> + e.getMessage()); </span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        scanner.close(); </span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 计算表达式值（支持运算符优先级）</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> expression 数学表达式 </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 计算结果</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> IllegalArgumentException 非法输入时抛出异常 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">double</span> <span class="title function_">evaluateExpression</span><span class="params">(String expression)</span> &#123;</span><br><span class="line">        <span class="comment">// 移除所有空格</span></span><br><span class="line">        <span class="type">String</span> <span class="variable">expr</span> <span class="operator">=</span> expression.replaceAll(<span class="string">&quot;\\s+&quot;</span>,  <span class="string">&quot;&quot;</span>);</span><br><span class="line">        </span><br><span class="line">        <span class="comment">// 检查非法字符</span></span><br><span class="line">        <span class="keyword">if</span> (!expr.matches(<span class="string">&quot;[\\d.+\\-*/]+&quot;</span>)) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;包含非法字符&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        Deque&lt;Double&gt; numbers = <span class="keyword">new</span> <span class="title class_">ArrayDeque</span>&lt;&gt;();</span><br><span class="line">        Deque&lt;Character&gt; operators = <span class="keyword">new</span> <span class="title class_">ArrayDeque</span>&lt;&gt;();</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i &lt; expr.length();  i++) &#123;</span><br><span class="line">            <span class="type">char</span> <span class="variable">c</span> <span class="operator">=</span> expr.charAt(i); </span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 处理数字（包括小数）</span></span><br><span class="line">            <span class="keyword">if</span> (Character.isDigit(c)  || c == <span class="string">&#x27;.&#x27;</span>) &#123;</span><br><span class="line">                <span class="type">StringBuilder</span> <span class="variable">numBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line">                <span class="keyword">while</span> (i &lt; expr.length()  &amp;&amp; </span><br><span class="line">                      (Character.isDigit(expr.charAt(i)) || expr.charAt(i) == <span class="string">&#x27;.&#x27;</span>)) &#123;</span><br><span class="line">                    numBuilder.append(expr.charAt(i++)); </span><br><span class="line">                &#125;</span><br><span class="line">                i--; <span class="comment">// 回退一步 </span></span><br><span class="line">                </span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="type">double</span> <span class="variable">number</span> <span class="operator">=</span> Double.parseDouble(numBuilder.toString()); </span><br><span class="line">                    numbers.push(number); </span><br><span class="line">                &#125; <span class="keyword">catch</span> (NumberFormatException e) &#123;</span><br><span class="line">                    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;无效数字格式: &quot;</span> + numBuilder);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125; </span><br><span class="line">            </span><br><span class="line"><span class="comment">// 处理运算符 </span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (isOperator(c)) &#123;</span><br><span class="line">                <span class="keyword">while</span> (!operators.isEmpty()  &amp;&amp; </span><br><span class="line">                      hasPrecedence(c, operators.peek()))  &#123;</span><br><span class="line">                    calculateTop(numbers, operators);</span><br><span class="line">                &#125;</span><br><span class="line">                operators.push(c); </span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;无效字符: &quot;</span> + c);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        </span><br><span class="line">        <span class="comment">// 计算剩余操作 </span></span><br><span class="line">        <span class="keyword">while</span> (!operators.isEmpty())  &#123;</span><br><span class="line">            calculateTop(numbers, operators);</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> (numbers.size()  != <span class="number">1</span> || !operators.isEmpty())  &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;无效表达式格式&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">return</span> numbers.pop(); </span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 执行栈顶运算 </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">calculateTop</span><span class="params">(Deque&lt;Double&gt; numbers, Deque&lt;Character&gt; operators)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (numbers.size()  &lt; <span class="number">2</span> || operators.isEmpty())  &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;运算符缺失&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="type">double</span> <span class="variable">b</span> <span class="operator">=</span> numbers.pop(); </span><br><span class="line">        <span class="type">double</span> <span class="variable">a</span> <span class="operator">=</span> numbers.pop(); </span><br><span class="line">        <span class="type">char</span> <span class="variable">op</span> <span class="operator">=</span> operators.pop(); </span><br><span class="line">        </span><br><span class="line">        <span class="keyword">switch</span> (op) &#123;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&#x27;+&#x27;</span>: numbers.push(a  + b); <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&#x27;-&#x27;</span>: numbers.push(a  - b); <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&#x27;*&#x27;</span>: numbers.push(a  * b); <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&#x27;/&#x27;</span>: </span><br><span class="line">                <span class="keyword">if</span> (b == <span class="number">0</span>) <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ArithmeticException</span>(<span class="string">&quot;除零错误&quot;</span>);</span><br><span class="line">                numbers.push(a  / b); </span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">default</span>: <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">&quot;不支持的操作符: &quot;</span> + op);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 检查运算符优先级 </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> current 当前运算符 </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> previous 栈顶运算符 </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> 当前运算符是否优先级较低或相等</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">hasPrecedence</span><span class="params">(<span class="type">char</span> current, <span class="type">char</span> previous)</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (previous == <span class="string">&#x27;(&#x27;</span> || previous == <span class="string">&#x27;)&#x27;</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">return</span> (current != <span class="string">&#x27;*&#x27;</span> &amp;&amp; current != <span class="string">&#x27;/&#x27;</span>) || </span><br><span class="line">               (previous != <span class="string">&#x27;+&#x27;</span> &amp;&amp; previous != <span class="string">&#x27;-&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">isOperator</span><span class="params">(<span class="type">char</span> c)</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> c == <span class="string">&#x27;+&#x27;</span> || c == <span class="string">&#x27;-&#x27;</span> || c == <span class="string">&#x27;*&#x27;</span> || c == <span class="string">&#x27;/&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>基本的单demo文件练习结束后，熟悉了程序编译和运行，但是对java的基础语法还是需要认真研究一下，虽然和C#类似，待更新~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">Java语言入门：项目运行</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="Java语言" scheme="https://www.zerofc.cn/tags/Java%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Blender入门教程（四）：动画制作</title>
    <link href="https://www.zerofc.cn/2025/05/08/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/"/>
    <id>https://www.zerofc.cn/2025/05/08/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/</id>
    <published>2025-05-08T02:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>在从一个模型到，完成贴图，完成蒙皮（骨骼绑定）后，已经算是一阶段的任务完成了，因为这样既可以拿去做Mod，也可以直接导入动作源完成动画。但是对于独立游戏，为了差异化，有些动作还是要自己制作的，所以就有了下面的这个3D模型的动画制作过程，最后也会演示一下如何导入CocosCreator等游戏引擎中。</p><h2 id="二、动画制作"><a href="#二、动画制作" class="headerlink" title="二、动画制作"></a>二、动画制作</h2><h3 id="1-打开时间线"><a href="#1-打开时间线" class="headerlink" title="1.打开时间线"></a>1.打开时间线</h3><p>记得是在姿势模式下，然后在Blender底部把 “时间线” 拉高一点，折叠的 “汇总” 也点击展开来。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/image-20250508113742306.png" alt="image-20250508113742306"></p><h3 id="2-开始K帧"><a href="#2-开始K帧" class="headerlink" title="2.开始K帧"></a>2.开始K帧</h3><p>点亮 “自动插帧” 按钮，将关键帧放到0帧位置，开始对某个骨骼进行变换，旋转，移动等，然后再移动到指定关键帧位置再变换，播放一下就可以看到动画了。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/image-20250508114350091.png" alt="image-20250508114350091"></p><h2 id="三、多组动画"><a href="#三、多组动画" class="headerlink" title="三、多组动画"></a>三、多组动画</h2><p>在游戏引擎中导入模型时，一个模型往往会制作多组动画，比如待机、攻击、死亡、大招等不同的动作，开发只需要在开发时添加控制器，不同的时候播放对应的动画即可。</p><h3 id="1-动画摄影表"><a href="#1-动画摄影表" class="headerlink" title="1.动画摄影表"></a>1.动画摄影表</h3><p>从 “时间线” 切换到 “动画摄影表”，然后再选择 “动作编辑器”，点击 “新建动作”，然后还是和前面一样，在指定帧数位置做变换。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/image-20250508131402641.png" alt="image-20250508131402641"></p><h3 id="2-切换动作"><a href="#2-切换动作" class="headerlink" title="2.切换动作"></a>2.切换动作</h3><p>在编辑了多组动作后，大纲里只会显示一个动作，要想查看需要切换，为了好记，在新建动作时可以重命名，然后在 “浏览要关联的动作” 的地方进行切换。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/image-20250508131737899.png" alt="image-20250508131737899"></p><h2 id="四、游戏引擎中使用"><a href="#四、游戏引擎中使用" class="headerlink" title="四、游戏引擎中使用"></a>四、游戏引擎中使用</h2><p>我这里为了方便，就没用这个机械臂了，直接拿之前已经导进去的Fbx做示例了。</p><h3 id="1-导入CocosCreator"><a href="#1-导入CocosCreator" class="headerlink" title="1.导入CocosCreator"></a>1.导入CocosCreator</h3><p>首先将有动画的模型导出为Fbx，然后将其复制到CocosCreator项目的assets下的某个位置。</p><h3 id="2-拖入模型"><a href="#2-拖入模型" class="headerlink" title="2.拖入模型"></a>2.拖入模型</h3><p>在游戏场景下，先创建一个空节点，然后把已经放到项目资源目录下的Fbx，拖入在该节点下。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/image-20250508134320920.png" alt="image-20250508134320920"></p><h3 id="3-创建脚本"><a href="#3-创建脚本" class="headerlink" title="3.创建脚本"></a>3.创建脚本</h3><p>给新建的空节点绑定一个脚本，脚本接收一个SkeletalAnimation属性，也就是带动画的Fbx，就是空节点下的整个目录拖入。</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; _decorator, <span class="title class_">Component</span>, <span class="title class_">SkeletalAnimation</span>, input, <span class="title class_">Input</span>, <span class="title class_">EventMouse</span>, <span class="title class_">Vec3</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;cc&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> &#123; ccclass, property &#125; = _decorator;</span><br><span class="line"></span><br><span class="line"><span class="meta">@ccclass</span>(<span class="string">&#x27;MyPlayController&#x27;</span>)</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">class</span> <span class="title class_">PlayController</span> <span class="keyword">extends</span> <span class="title class_ inherited__">Component</span> &#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@property</span>(&#123; <span class="attr">type</span>: <span class="title class_">SkeletalAnimation</span> &#125;)</span><br><span class="line">    <span class="keyword">public</span> <span class="title class_">CocosAnim</span>: <span class="title class_">SkeletalAnimation</span> | <span class="literal">null</span> = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">start</span>(<span class="params"></span>) &#123;</span><br><span class="line"><span class="variable language_">this</span>.<span class="property">CocosAnim</span>.<span class="title function_">play</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">onMouseMove</span>(<span class="params">event: EventMouse</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(event);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">update</span>(<span class="params">deltaTime: <span class="built_in">number</span></span>) &#123;</span><br><span class="line">        </span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">onStartButtonClicked</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">CocosAnim</span>.<span class="title function_">play</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">onStopButtonClicked</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">CocosAnim</span>.<span class="title function_">stop</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="4-开始运行"><a href="#4-开始运行" class="headerlink" title="4.开始运行"></a>4.开始运行</h3><p>这个只要是启动就自动播放，而且Fbx只有一个时间线的默认动画，没有多动作组，其实也差不多，就只是对指定动作进行播放。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E5%8A%A8%E7%94%BB%E5%88%B6%E4%BD%9C/image-20250508135414690.png" alt="image-20250508135414690"></p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>如果只是制作游戏，到这里就完全够用了，但如果是影视后期的话，还有渲染部分，因为在制作完模型还要放到实拍场景中，目前这个我也还不会，等后面学习了我再总结一下了。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何用Blender制作动画。</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Blender" scheme="https://www.zerofc.cn/tags/Blender/"/>
    
  </entry>
  
  <entry>
    <title>Blender入门教程（三）：骨骼绑定</title>
    <link href="https://www.zerofc.cn/2025/05/07/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/"/>
    <id>https://www.zerofc.cn/2025/05/07/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/</id>
    <published>2025-05-07T02:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>不知道大家有没有玩过一些单机游戏的Mod，比如《侠盗猎车》里主角变成奥特曼，各种新能源汽车乱入等等。这些都是别人对原有模型就行修改换皮，并重新绑定骨骼完成的，所以如果会了骨骼绑定后，你也就可以自己制作一些模型到单机游戏里，当然还要一些解包封包的技巧，这个有时间聊，那下面开始Blender的骨骼绑定实操了。</p><h2 id="二、模型准备"><a href="#二、模型准备" class="headerlink" title="二、模型准备"></a>二、模型准备</h2><h3 id="1-创建模型"><a href="#1-创建模型" class="headerlink" title="1.创建模型"></a>1.创建模型</h3><p>我这里以一个机械臂为例，先添加一个立方体变形成长方体，然后添加一个圆柱体，添加时设置顶点为8。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507165800868.png" alt="image-20250507165800868"></p><h3 id="2-快速复制"><a href="#2-快速复制" class="headerlink" title="2.快速复制"></a>2.快速复制</h3><p>为了让骨骼绑定的效果更明显，我们要做一个两个节点的机械波，可以对前面的部分进行快速复制（Shift+D）到指定位置，然后按快捷键 ~ 进行视角切换，用来对齐前面的组合。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507174252103.png" alt="image-20250507174252103"></p><h2 id="三、骨骼设置"><a href="#三、骨骼设置" class="headerlink" title="三、骨骼设置"></a>三、骨骼设置</h2><h3 id="1-添加骨骼"><a href="#1-添加骨骼" class="headerlink" title="1.添加骨骼"></a>1.添加骨骼</h3><p>点击添加-&gt;骨架-&gt;单段骨骼，一开始他会被模型挡住，这时候找到属性的 “物体” -&gt;视图显示，勾选 “在前面”，还可以把名称显示出来。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507175558694.png" alt="image-20250507175558694"></p><h3 id="2-骨骼挤出"><a href="#2-骨骼挤出" class="headerlink" title="2.骨骼挤出"></a>2.骨骼挤出</h3><p>点击骨骼，进入 “编辑模式”，再点击骨骼头部的小圆点，工具栏选择 “挤出” 或按快捷键 “E”，然后朝着需要的方向拖动就能在上一个骨骼上创建一个子骨骼。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507192209091.png" alt="image-20250507192209091"></p><h3 id="3-断开骨骼链接"><a href="#3-断开骨骼链接" class="headerlink" title="3.断开骨骼链接"></a>3.断开骨骼链接</h3><p>我这里要做的是第一个骨骼是根骨骼，而他下面的子骨骼要放到模型的内部去。所以就需要和根骨骼进行断开，然后移动子骨骼到指定位置。</p><p>首先点击框选，选中两个骨骼，然后按快捷键 “Alt+P”，</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507192627301.png" alt="image-20250507192627301"></p><h2 id="四、骨骼绑定"><a href="#四、骨骼绑定" class="headerlink" title="四、骨骼绑定"></a>四、骨骼绑定</h2><h3 id="1-模型绑定"><a href="#1-模型绑定" class="headerlink" title="1.模型绑定"></a>1.模型绑定</h3><p>切换到物体模式，Shift 选中所有的模型和骨骼(一定要最后选骨骼)，快捷键 “Ctrl+P”，然后选择 “附带自动权重”。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507201707775.png" alt="image-20250507201707775"></p><h3 id="2-姿势模式"><a href="#2-姿势模式" class="headerlink" title="2.姿势模式"></a>2.姿势模式</h3><p>点击骨骼，进入姿势模式（只有骨骼物体特有），选中一个骨骼，然后在工具栏选择 旋转，可以发现旋转或移动骨骼，模型也会相应的变换，但还是有个问题，因为是自动权重，有时候后面的骨骼会影响到前面的模型变形，这时候就要我们手动刷一下权重了。</p><p><img src="E:\4work\23md笔记\1_Hexo博客备份\Blender入门教程：骨骼绑定\img\Blender入门教程：骨骼绑定\image-20250508100712867.png" alt="image-20250508100712867"></p><ol start="3"><li><h3 id="顶点组"><a href="#顶点组" class="headerlink" title="顶点组"></a>顶点组</h3></li></ol><p>还一个看是否绑定成功的方法：进入物体模式，点击一个模型，然后在属性视图找到 “数据”-&gt;“顶点组”，里面就是当前模型能被哪些骨骼影响，如果要删除绑定，在顶点组里移除就可以。</p><p><img src="E:\4work\23md笔记\1_Hexo博客备份\Blender入门教程：骨骼绑定\img\Blender入门教程：骨骼绑定\image-20250508101003681.png" alt="image-20250508101003681"></p><h2 id="五、重刷权重"><a href="#五、重刷权重" class="headerlink" title="五、重刷权重"></a>五、重刷权重</h2><h3 id="1-进入权重绘制"><a href="#1-进入权重绘制" class="headerlink" title="1.进入权重绘制"></a>1.进入权重绘制</h3><p>先切到物体模式，然后选中一个模型，再选择 “权重绘制”，还是找到 属性-&gt;数据-&gt;顶点组，里面某一个骨骼都有对当前模型的权重。</p><p>红色到蓝色，接近等于红色权重越高，而越接近蓝色等于蓝色权重越低，为了让对应骨骼能有效控制对应的模型部分，所以就单独进行修改了。</p><p><img src="E:\4work\23md笔记\1_Hexo博客备份\Blender入门教程：骨骼绑定\img\Blender入门教程：骨骼绑定\image-20250508103501511.png" alt="image-20250508103501511"></p><h3 id="2-修改权重"><a href="#2-修改权重" class="headerlink" title="2.修改权重"></a>2.修改权重</h3><p>在能准备修改权重时，最好是能知道顶点组里的每个名称是对应哪个骨骼，在对模型上颜色（权重值）进行修改时，有几个选项，如下：</p><ul><li>F Add (加法)：用于增加选中的权重值。</li><li>F Darken (变暗)：减少选中的权重值，使其变得更暗或更接近0。</li><li>F Draw (绘制)：直接设置选中的权重值，覆盖原有的权重值。</li><li>F Lighten (变亮)：增加选中的权重值，使其变得更亮或更接近1。</li><li>F Mix (混合)：以一种混合的方式结合新绘制的权重值与原有权重值。通常会根据新旧权重值的比例进行混合。</li><li>F Multiply (乘法)：将新绘制的权重值与原有权重值相乘，这通常会使权重值变得更小。</li><li>F Subtract (减法)：从原有权重值中减去新绘制的权重值，降低该区域的权重。</li></ul><p><img src="E:\4work\23md笔记\1_Hexo博客备份\Blender入门教程：骨骼绑定\img\Blender入门教程：骨骼绑定\image-20250508104336512.png" alt="image-20250508104336512"></p><h2 id="六、其他"><a href="#六、其他" class="headerlink" title="六、其他"></a>六、其他</h2><h3 id="1-设置模型关系"><a href="#1-设置模型关系" class="headerlink" title="1.设置模型关系"></a>1.设置模型关系</h3><p>设置模型关系就是父子关系，如果将一个模型作为一个模型的子级，那父级移动旋转他也会移动旋转，在相对规则的动画下可以用这种方式代替骨骼绑定。</p><p>而操作方法有两种：一个是在 “大纲视图”选中一个模型，将其移到另一个模型下，那他就是这个模型的子级了；另一个方法是Shift选中两个模型，“Ctrl+P” 后选择 “物体”，后面就可以看到两个模型间有根虚线。</p><p><img src="E:\4work\23md笔记\1_Hexo博客备份\Blender入门教程：骨骼绑定\img\Blender入门教程：骨骼绑定\image-20250508095131490.png" alt="image-20250508095131490"></p><h3 id="2-模型合并"><a href="#2-模型合并" class="headerlink" title="2.模型合并"></a>2.模型合并</h3><p>为了能后面对模型进行权重绘制，最好对这四个模型合并，不然就是每个都绘制一遍权重。先在物体模式下，Shift 选中四个模型，然后按快捷键 “Ctrl+J”；</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E9%AA%A8%E9%AA%BC%E7%BB%91%E5%AE%9A/image-20250507201415939.png" alt="image-20250507201415939"></p><h2 id="七、写在后面"><a href="#七、写在后面" class="headerlink" title="七、写在后面"></a>七、写在后面</h2><p>权重重新修改后，就可以进入姿势模式看效果，旋转一下刚刚超出控制范围的骨骼，如果没有之前那种大范围变形，且比较符合你的预期。</p><p>那么，后面就可以开始用这个骨架进行动画制作了，和Spine类似，在时间轴上做不同的变换，当然里面很多细节性的技巧也有，那下一篇就开始了。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何用Blender对模型进行骨骼绑定。</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Blender" scheme="https://www.zerofc.cn/tags/Blender/"/>
    
  </entry>
  
  <entry>
    <title>Blender入门教程（二）：纹理绘制</title>
    <link href="https://www.zerofc.cn/2025/05/06/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/"/>
    <id>https://www.zerofc.cn/2025/05/06/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/</id>
    <published>2025-05-06T05:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>通过上一篇文章的简单介绍，我们就可以独立完成模型的创建，但还只是一些灰溜溜的轮廓，少了鲜艳的表皮。所以，这篇文章就开始介绍如何制作皮肤，就是给模型着色，下面就用一个立方体做示例了。</p><h2 id="二、UV编辑"><a href="#二、UV编辑" class="headerlink" title="二、UV编辑"></a>二、UV编辑</h2><h3 id="1-标记缝合边"><a href="#1-标记缝合边" class="headerlink" title="1.标记缝合边"></a>1.标记缝合边</h3><p>选中物体，进入编辑模式后，选择 “边选择模式”，点击物体的一个边，按 “shift” 选中了多个边。怎么选择看你自己对物体剖开的边，UV编辑就是相当于对一个立方体的空包装盒展开平铺。</p><p>选择了多个边后，右键选择 “标记缝合边”，此时的这几条边会加粗显示，代表成功标记，然后打开导航栏的 “UV编辑”。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507144014979.png" alt="image-20250507144014979"></p><h3 id="2-UV展开"><a href="#2-UV展开" class="headerlink" title="2.UV展开"></a>2.UV展开</h3><p>进入UV编辑后，会有两个窗口，一般左边是展开的样子，右边是模型的样子。但是刚开始左边是没有UV的，这时候我们在右边的模型的全选，可以直接快捷键 “A”，也可以点击 “选择”-&gt; “全部”，然后左边就可以看到展开后的样子了。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507144418331.png" alt="image-20250507144418331"></p><h2 id="三、着色编辑"><a href="#三、着色编辑" class="headerlink" title="三、着色编辑"></a>三、着色编辑</h2><h3 id="1-进入着色器编辑"><a href="#1-进入着色器编辑" class="headerlink" title="1.进入着色器编辑"></a>1.进入着色器编辑</h3><p>进入着色器编辑有两种方式，一种是回到导航栏的 “布局”，在下面部分，时间轴点击 “编辑器类型”（回放的左边），然后选择 “着色器编辑器”。另一个就直接点击导航栏的 “着色”。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507144928988.png" alt="image-20250507144928988"></p><h3 id="2-添加纹理"><a href="#2-添加纹理" class="headerlink" title="2.添加纹理"></a>2.添加纹理</h3><p>进入着色编辑器后，点击 “添加”-&gt;“纹理”-&gt;“图像纹理”，然后将新弹出的纹理的 “颜色” 连接到“原理化BSDF”的 “基础色”。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507145448757.png" alt="image-20250507145448757"></p><h3 id="3-新建图像"><a href="#3-新建图像" class="headerlink" title="3.新建图像"></a>3.新建图像</h3><p>新建图像就是给UV上色后的一张图片，也就是模型导出后的皮肤图。找到刚刚添加的那个图像纹理，然后点击 “新建”，输入名称，其他的默认就可以，最后点击确定。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507145913297.png" alt="image-20250507145913297"></p><h2 id="四、纹理绘制"><a href="#四、纹理绘制" class="headerlink" title="四、纹理绘制"></a>四、纹理绘制</h2><h3 id="1-进入纹理绘制"><a href="#1-进入纹理绘制" class="headerlink" title="1.进入纹理绘制"></a>1.进入纹理绘制</h3><p>找到导航栏里的 “纹理绘制”，一般也有有两个窗口，左边是UV展开，右边是模型，一开始都是黑色的。不过要先确认一下左边UV展开窗口上面，是不是显示图像绘制，关联的图像是不是你新建图像的名称。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507150451703.png" alt="image-20250507150451703"></p><h3 id="2-开始绘制"><a href="#2-开始绘制" class="headerlink" title="2.开始绘制"></a>2.开始绘制</h3><p>绘制就在右边窗口，可以旋转角度的上色，我这里是直接填充蓝色，然后再切换到自由线（画笔），在一个面上涂上绿色，用作区别。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507150901683.png" alt="image-20250507150901683"></p><h3 id="3-保存图像"><a href="#3-保存图像" class="headerlink" title="3.保存图像"></a>3.保存图像</h3><p>绘制完毕后，在左边UV展开窗口上面，找到 “图像”，然后保存，这样就把绘制的皮肤存下来的，后面如果你导出模型出来，要和这张图一起发给别人。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507151346938.png" alt="image-20250507151346938"></p><h2 id="五、预览和导出"><a href="#五、预览和导出" class="headerlink" title="五、预览和导出"></a>五、预览和导出</h2><h3 id="1-预览"><a href="#1-预览" class="headerlink" title="1.预览"></a>1.预览</h3><p>绘制和保存图像后，如果我们要先整体预览一下，可以回到导航栏的 “布局” 或者 “建模”，只需要把着色方式改成 “材质预览” 就可以了。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507151718388.png" alt="image-20250507151718388"></p><h3 id="2-导出"><a href="#2-导出" class="headerlink" title="2.导出"></a>2.导出</h3><p>导出的格式有很多，我就以常用的FBX为例，但需要注意的是，纹理有两种，一种是分开为单独的图片，另一种是纹理直接内嵌到FBX中。</p><p>点击导出，选择FBX，弹出的窗口，路径模式，如果是内嵌式纹理，要选择 “复制”，然后把右边的小图标打开，最后导出就可以了。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E7%BA%B9%E7%90%86%E7%BB%98%E5%88%B6/image-20250507152424356.png" alt="image-20250507152424356"></p><h2 id="六、写在后面"><a href="#六、写在后面" class="headerlink" title="六、写在后面"></a>六、写在后面</h2><p>经过这一顿操作，就可以结合布线，拿现有的模型就行调整了，比如换皮肤加一些装饰等等。但只是静态的，要想在游戏中使用或者对游戏改Mod，还需要做骨骼绑定，制作动画，所以接下来就是Blender这方面的实操了，敬请期待~</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何用Blender对模型进行贴图绘制。</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Blender" scheme="https://www.zerofc.cn/tags/Blender/"/>
    
  </entry>
  
  <entry>
    <title>Blender入门教程（一）：模型创建</title>
    <link href="https://www.zerofc.cn/2025/05/06/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/"/>
    <id>https://www.zerofc.cn/2025/05/06/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/</id>
    <published>2025-05-06T03:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>大家都知道，现在AIGC领域日新月异，今天AI大模型能生成粗糙的3D模型，明天就能做成商业级的3D模型，但是如果想要一些细节上也有的，还是需要自己手动对模型的布线进行调整，然后再蒙皮等等。</p><p>所以，AI大模型强大的当下，如果我们是独立开发者或建模爱好者，还是有必要再系统性学习一下基础的建模流程。因为这个世界每当有新技术出现，且能大幅提升生产力的同时，还会继续保有手工的余地的。</p><p>再回到主题，我这个Blender入门教程，其实并不很系统，都是我零零散散实践后总结的。一是给自己做的建模备忘录笔记，二是给同样是作为开发者（非专业建模）的同学，用来快速入门作参考。因为我们职业类似，视角应该也差不多，直接看专业的教程可能比较晦涩，我的虽然粗糙但是浅显易懂呀。</p><h2 id="二、操作"><a href="#二、操作" class="headerlink" title="二、操作"></a>二、操作</h2><h3 id="1-新建项目"><a href="#1-新建项目" class="headerlink" title="1.新建项目"></a>1.新建项目</h3><p>打开Blender软件，点击常规。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506154809955.png" alt="image-20250506154809955"></p><h3 id="2-添加网格"><a href="#2-添加网格" class="headerlink" title="2.添加网格"></a>2.添加网格</h3><p>进入窗口后，默认有三个物体，分别是：摄像头、灯光、立方体网格，第一次玩的话，可以先不管这些，直接添加一个新的网格，点击 “添加-&gt;网格-&gt;立方体”。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506160226880.png" alt="image-20250506160226880"></p><h3 id="3-编辑模式"><a href="#3-编辑模式" class="headerlink" title="3.编辑模式"></a>3.编辑模式</h3><p>在对网格编辑前，可以先了解一下物体的几个交互模式： 物体模式、编辑模式、雕刻模式、顶点绘制、权重绘制、纹理绘制、姿态模式。</p><p>因为物体有分很多种，比如上面的摄像头网格外，还有骨架、文本等等，而不同的物体就有不同的交互模式，像骨架就没有什么权重绘制什么的。</p><p>网格的就比较多，要对他进行修改，就要选择 “编辑模式”，切换后，左侧工具栏就会多了很多像：挤出选取、环切、倒角、切割等等工具。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506161624710.png" alt="image-20250506161624710"></p><h3 id="4-移动快捷键"><a href="#4-移动快捷键" class="headerlink" title="4.移动快捷键"></a>4.移动快捷键</h3><p>这个是我自己总结的叫法，分别是旋转视图和移动视图，因为在对模型修改时特别常用，所以快捷键用起来很方便。</p><p>旋转视图（拖动时可以查看模型的各个角度的面）：鼠标中键盘，移动视图（拖动时平移窗口）：shift+鼠标中键，缩放视图：滚轮滚动。</p><h3 id="5-模型环切"><a href="#5-模型环切" class="headerlink" title="5.模型环切"></a>5.模型环切</h3><p>选择网格，进入编辑模式，选中网格体，然后工具栏选 “环切”，对每个面添加切线，也可以用快捷键 “Ctrl+R” 按住不放再滚动滚轮，能快速切分网格， 如下图（正&#x2F;上: 4x3，侧: 3x3）。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506192431444.png" alt="image-20250506192431444"></p><h3 id="6-模型挤出面"><a href="#6-模型挤出面" class="headerlink" title="6.模型挤出面"></a>6.模型挤出面</h3><p>点击 选择模式的 “面选择”，然后点击两侧的一个面，用来延伸出类似手臂的挤出面。选中面后点击工具栏的 “挤出选区”，拖出来就可以了。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506192744183.png" alt="image-20250506192744183"></p><h3 id="7-添加镜像生成器"><a href="#7-添加镜像生成器" class="headerlink" title="7.添加镜像生成器"></a>7.添加镜像生成器</h3><p>视图着色方式选择 “线框显示”，工具栏选择 “框选”，然后框选左侧一边后删除顶点。找到属性栏的修改器，添加修改器-&gt;生成-&gt;镜像，因为我们是以Z轴切的，所以对称是Y轴，添加后就可以看到下面图形了。</p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506193316943.png" alt="image-20250506193316943"></p><p><img src="/img/Blender%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%9A%E6%A8%A1%E5%9E%8B%E5%88%9B%E5%BB%BA/image-20250506193626337.png" alt="image-20250506193626337"></p><h3 id="8-挤出头部和腿部"><a href="#8-挤出头部和腿部" class="headerlink" title="8.挤出头部和腿部"></a>8.挤出头部和腿部</h3><p>用同样的方法，将头部和腿部用模型挤出面实现，最后我们一个人形的简单模型就创建成功了。当然要建人物模型，这种方法是不对的，我这里只是演示了一下基本创建和变形的用法。</p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>模型创建只是演示，其实我们最主要目的是熟悉布线的基本方法后，用来对AI生成的、别人做好的模型进行修改。而对模型的修改，布线只是小部分调整，最主要还是修改皮肤，然后重新做动画，所以我后面就是纹理绘制和蒙皮、动画了。</p><p><img src="https://www.zerofc.cn/img/PHP%E5%A6%82%E4%BD%95%E5%9C%A8Windows%E4%B8%AD%E5%AE%9A%E4%B9%89CMD%E5%91%BD%E4%BB%A4/image-20240805201033707.png" alt="image-20250408192801332"></p>]]></content>
    
    
    <summary type="html">如何用Blender创建第一个模型。</summary>
    
    
    
    <category term="游戏开发" scheme="https://www.zerofc.cn/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Blender" scheme="https://www.zerofc.cn/tags/Blender/"/>
    
  </entry>
  
  <entry>
    <title>DotNet入门：项目运行</title>
    <link href="https://www.zerofc.cn/2025/04/28/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/"/>
    <id>https://www.zerofc.cn/2025/04/28/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/</id>
    <published>2025-04-28T06:13:50.000Z</published>
    <updated>2026-02-25T06:38:31.553Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h2><p>.Net是一个集合了丰富的类库和工具的开发平台，由于他几大主要的组件，使他支持C#、VB、F#等多种编程语言，同时能开发Web应用、桌面应用、控制台应用、移动应用、游戏开发、嵌入式物联网应用、云和微服务等多种类型的应用程序。</p><p>之前只是记录了.Net的环境的搭建，这次将通过一个简单的控制台应用，介绍一下.Net项目的创建，其中包括Visual Studio工具配置、依赖安装、项目创建、项目运行等。</p><h2 id="二、创建项目"><a href="#二、创建项目" class="headerlink" title="二、创建项目"></a>二、创建项目</h2><p>点击 文件-&gt;新建-&gt;项目，在弹出的窗口中，搜索模板：“控制台应用” 或者 ”Console App“。然后选择目标框架：.Net Core 或 .Net Framework （注.高版本如.Net 6已经部分整合了.Net Core和.Net Framework），最后输入项目名，保存。</p><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428154033858.png" alt="image-20250428154033858"></p><h2 id="三、依赖安装"><a href="#三、依赖安装" class="headerlink" title="三、依赖安装"></a>三、依赖安装</h2><p>由于我的项目是一个别人写的游戏后台服务，里面有MySql.Data的依赖，所以在运行代码前需要先安装。这里有个小Tips，就是对依赖安装位置的修改，如果不修改，以后下载的都在C盘了。</p><h4 id="1-修改依赖位置"><a href="#1-修改依赖位置" class="headerlink" title="1.修改依赖位置"></a>1.修改依赖位置</h4><p>打开visual studio，工具-&gt;NuGet包管理器-&gt;程序包管理器设置-&gt;NuGet包管理器-&gt;配置文件，然后打开三个文件中的NuGet.Config，添加下面代码（注. globalPackagesFolder位置）。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;</span><br><span class="line">&lt;configuration&gt;</span><br><span class="line">  &lt;packageSources&gt;</span><br><span class="line">    &lt;add key=&quot;nuget.org&quot; value=&quot;https://api.nuget.org/v3/index.json&quot; protocolVersion=&quot;3&quot; /&gt;</span><br><span class="line">  &lt;/packageSources&gt;</span><br><span class="line">  &lt;config&gt;</span><br><span class="line">&lt;add key=&quot;globalPackagesFolder&quot; value=&quot;E:/2setsoft/4other/visual-studio-nuget&quot; /&gt;</span><br><span class="line">  &lt;/config&gt;</span><br><span class="line">&lt;/configuration&gt;</span><br></pre></td></tr></table></figure><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428155148289.png" alt="image-20250428155148289"></p><h4 id="2-下载依赖"><a href="#2-下载依赖" class="headerlink" title="2.下载依赖"></a>2.下载依赖</h4><p>继续从工具里找到 ”管理解决方案的 NuGet 程序包“。</p><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428155602050.png" alt="image-20250428155602050"></p><p>点击进去后，点击 ”浏览“，搜索 需要的包，找到后点击安装。</p><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428160043916.png" alt="image-20250428160043916"></p><h4 id="3-检查是否引用"><a href="#3-检查是否引用" class="headerlink" title="3.检查是否引用"></a>3.检查是否引用</h4><p>安装完毕后，进入”解决方案资源管理器“，展开 ”引用“，是否有安装的包。</p><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428160500906.png" alt="image-20250428160500906"></p><p>如果在引用中没有看到安装的包，或者有感叹号，可以对项目进行清理。点击菜单下 生成-&gt;清理解决方案，然后再 ”重新生成解决方案“。</p><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428160721793.png" alt="image-20250428160721793"></p><h2 id="四、运行程序"><a href="#四、运行程序" class="headerlink" title="四、运行程序"></a>四、运行程序</h2><p>安装依赖后，项目根目录会生成一个packages.config，入口文件一般是Mian.cs或Program.cs。然后点击 调试-&gt;开始执行，随后就会弹出一个控制台窗口，同时项目根目录的bin文件夹也会生成exe文件。</p><p><img src="/img/DotNet%E5%85%A5%E9%97%A8%EF%BC%9A%E9%A1%B9%E7%9B%AE%E8%BF%90%E8%A1%8C/image-20250428162633319.png" alt="image-20250428162633319"></p><h2 id="五、写在后面"><a href="#五、写在后面" class="headerlink" title="五、写在后面"></a>五、写在后面</h2><p>在几个开发平台间，再结合市场和我个人，我还是觉得用.Net更适合一点。首先如果是用的Unity3D引擎，C#语言就是无缝衔接，而且在Visual Studio中有直接和Unity联调的选项，在帧同步网络框架也有很多，比如GDNet、ENet-C#等等。</p><p><img src="https://www.zerofc.cn/img/Spine%E5%8A%A8%E7%94%BB%E6%95%99%E7%A8%8B%EF%BC%9A%E5%89%AA%E8%A3%81%E7%9A%84%E5%BA%94%E7%94%A8/image-20240805201033707.png" alt="image-20250408165643830"></p>]]></content>
    
    
    <summary type="html">DotNet入门：项目运行</summary>
    
    
    
    <category term="其他编程" scheme="https://www.zerofc.cn/categories/%E5%85%B6%E4%BB%96%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="DotNet" scheme="https://www.zerofc.cn/tags/DotNet/"/>
    
  </entry>
  
</feed>
