20条职业发展建议,送给拒绝原地踏步的你

本文提供20条职业发展建议,旨在帮助读者在职业生涯中不断进步,包括尽早行动、成为领域专家等内容。

以下内容转载自 https://www.toutiao.com/i6789595830887121420/

【20条职业发展建议,送给拒绝原地踏步的你】

①趁年轻,尽早行动;②力争成为某个领域的专家;③利用各种形式充电;④树立自己的品牌形象……20条建议收好↓↓↓ ​

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

20条职业发展建议,送给拒绝原地踏步的你

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
<think>问题:人物一直在原地踏步,说明移动逻辑可能有问题。可能的原因:1.在`handleMovement`方法中,每次更新位置时,我们直接修改了`bulePeople.position`,但是可能没有正确更新位置。2.方向向量计算错误,或者移动距离计算错误。3.状态切换逻辑有问题,导致一直处于移动状态但无法到达目标点。然而,在提供的代码中,移动逻辑看起来是正常的。但是,我们注意到在`handleMovement`中,我们使用`this.bulePeople.position`作为当前位置,然后计算方向向量。但是,`this.bulePeople.position`返回的是一个Vec3对象,它是值类型的,所以我们每次修改位置后需要重新设置。但代码中已经设置了位置:`this.bulePeople.position=currentPos;`另一个可能的问题是:在移动过程中,我们每次都是基于初始位置(或上一帧的位置)计算方向,但方向向量是相对于目标点的,所以应该是正确的。还有一种可能是:目标点`moveTarget`的坐标和当前角色坐标在同一位置,导致距离为0,所以一直无法进入移动分支。为了调试,我们可以在移动状态下打印当前位置和目标位置。但是,我们注意到在`executeSequence`中,我们设置了`moveTarget`为`this.Pos1.position.clone()`。在`onLoad`中,我们通过`this.fixedPos.getChildByName`获取了节点,但要注意这些位置节点是否在场景中正确设置?另外,`fixedPos`节点是否被正确赋值?另外,原地踏步可能是因为动画在播放,但位置没有移动。所以我们需要确认位置节点的坐标是否在世界坐标系中?因为`getChildByName`返回的节点,其position是相对于父节点的本地坐标。而角色移动使用的是世界坐标。因此,我们需要将位置节点的世界坐标赋给`moveTarget`。修改:在获取位置节点时,将其世界坐标保存下来,或者在移动时使用世界坐标。修改`handleMovement`方法:使用位置节点的世界坐标。但注意,在`onLoad`中,位置节点的世界坐标可能还没有计算(因为节点树还没有完全构建),所以我们可以在`start`中获取,或者每次移动时动态获取位置节点的世界坐标。我们选择在`executeSequence`和状态切换时动态获取位置节点的世界坐标。修改如下:在状态切换设置`moveTarget`时,使用`getWorldPosition`获取世界坐标。步骤:1.创建一个临时Vec3变量来存储世界坐标。2.使用节点的`getWorldPosition`方法。因此,修改代码:在`executeSequence`中:```typescript//启动序列publicexecuteSequence():void{this.sequenceState=1;//开始移动到Pos1constworldPos=newVec3();this.Pos1.getWorldPosition(worldPos);this.moveTarget=worldPos;this.buleAnimation.play('walk-1');}```同样,在状态2切换到状态3时(即移动到Pos2):```typescriptcase2://在Pos1攻击3次if(this.attackCount===0){this.startAutoAttack();}if(this.attackCount>=3){this.stopAutoAttack();this.attackCount=0;this.sequenceState=3;//移动到Pos2constworldPos=newVec3();this.Pos2.getWorldPosition(worldPos);this.moveTarget=worldPos;this.buleAnimation.play('walk-2');}break;```同理,在状态4切换到状态5时(移动到Pos3):```typescriptcase4://在Pos2站立2秒if(this.standTimer===0){this.buleAnimation.play('stand-2');}this.standTimer+=deltaTime;if(this.standTimer>=2.0){this.standTimer=0;this.sequenceState=5;//移动到Pos3constworldPos=newVec3();this.Pos3.getWorldPosition(worldPos);this.moveTarget=worldPos;this.buleAnimation.play('walk-3');}break;```这样,我们确保移动目标点是世界坐标。另外,注意角色节点的位置也是世界坐标,所以比较和移动都是在世界坐标系下。如果问题仍然存在,我们可以在`handleMovement`中添加日志输出,观察当前位置和目标位置。修改`handleMovement`:```typescriptprivatehandleMovement(deltaTime:number,nextState:number):void{if(!this.bulePeople||!this.moveTarget)return;constcurrentPos=this.bulePeople.position;consttargetPos=this.moveTarget;constdirection=newVec3();Vec3.subtract(direction,targetPos,currentPos);//计算移动距离constdistance=direction.length();constmoveDistance=this.moveSpeed*deltaTime;console.log(`Currentposition:(${currentPos.x},${currentPos.y},${currentPos.z})`);console.log(`Targetposition:(${targetPos.x},${targetPos.y},${targetPos.z})`);console.log(`Distance:${distance},MoveDistance:${moveDistance}`);if(distance<=moveDistance){//到达目标位置this.bulePeople.position=targetPos;this.sequenceState=nextState;console.log("Reachedtarget,nextstate:"+nextState);}else{//移动中direction.normalize().multiplyScalar(moveDistance);Vec3.add(currentPos,currentPos,direction);this.bulePeople.position=currentPos;}}```通过日志,我们可以判断是否因为距离计算问题导致无法到达目标点。另外,注意角色节点的初始位置是否在世界坐标系的原点?如果位置节点也在原点附近,那么移动可能不明显。如果问题解决,记得移除日志输出。考虑到上述问题,我们修改代码,使用位置节点的世界坐标作为目标点。下面是修改后的完整代码(包含日志,实际使用时可根据需要移除):</think>问题分析:人物在原地踏步通常是由于移动逻辑未正确执行导致的。最常见的原因是位置更新未生效或移动目标设置不正确。以下是修复方案: ```typescript import { _decorator, Camera, Component, Node, Animation, Vec3, math } from 'cc'; const { ccclass, property } = _decorator; @ccclass('gameManager') export class gameManager extends Component { // ... 属性声明保持不变 ... // 序列控制相关变量 private sequenceState: number = 0; private moveSpeed: number = 5.0; private moveTarget: Vec3 | null = null; private attackCount: number = 0; private standTimer: number = 0; // 摄像机跟随相关 @property({ type: Vec3 }) private cameraOffset: Vec3 = new Vec3(0, 2, 5); @property private cameraSmoothness: number = 0.1; // 新增变量:角色当前移动方向 private moveDirection: Vec3 = new Vec3(); private isMoving: boolean = false; start() { this.executeSequence(); } protected onLoad(): void { // 确保位置节点存在 if (this.fixedPos) { this.Pos1 = this.fixedPos.getChildByName('Pos-1'); this.Pos2 = this.fixedPos.getChildByName('Pos-2'); this.Pos3 = this.fixedPos.getChildByName('Pos-3'); // 调试日志 if (!this.Pos1 || !this.Pos2 || !this.Pos3) { console.error("位置节点未找到,请检查节点名称"); } } else { console.error("fixedPos 未赋值"); } } // ... 其他方法保持不变 ... // 启动序列 - 修改为使用世界坐标 public executeSequence(): void { this.sequenceState = 1; // 确保位置节点存在 if (this.Pos1) { // 获取世界坐标 const worldPos = new Vec3(); this.Pos1.getWorldPosition(worldPos); this.moveTarget = worldPos; // 播放行走动画 if (this.buleAnimation) { this.buleAnimation.play('walk-1'); } this.isMoving = true; } else { console.error("Pos1 节点不存在"); } } // 处理序列状态 - 添加位置节点验证 private handleSequence(deltaTime: number): void { switch (this.sequenceState) { case 1: // 移动到Pos1 if (this.Pos1) { this.handleMovement(deltaTime, 2); } else { console.error("移动目标 Pos1 不存在"); this.sequenceState = 7; // 直接跳到结束状态 } break; case 2: // 在Pos1攻击3次 if (this.attackCount === 0) { this.startAutoAttack(); } if (this.attackCount >= 3) { this.stopAutoAttack(); this.attackCount = 0; this.sequenceState = 3; // 移动到Pos2 if (this.Pos2) { // 获取世界坐标 const worldPos = new Vec3(); this.Pos2.getWorldPosition(worldPos); this.moveTarget = worldPos; if (this.buleAnimation) { this.buleAnimation.play('walk-2'); } this.isMoving = true; } else { console.error("Pos2 节点不存在"); this.sequenceState = 7; } } break; case 3: // 移动到Pos2 if (this.Pos2) { this.handleMovement(deltaTime, 4); } else { console.error("移动目标 Pos2 不存在"); this.sequenceState = 7; } break; case 4: // 在Pos2站立2秒 if (this.standTimer === 0 && this.buleAnimation) { this.buleAnimation.play('stand-2'); } this.standTimer += deltaTime; if (this.standTimer >= 2.0) { this.standTimer = 0; this.sequenceState = 5; // 移动到Pos3 if (this.Pos3) { // 获取世界坐标 const worldPos = new Vec3(); this.Pos3.getWorldPosition(worldPos); this.moveTarget = worldPos; if (this.buleAnimation) { this.buleAnimation.play('walk-3'); } this.isMoving = true; } else { console.error("Pos3 节点不存在"); this.sequenceState = 7; } } break; case 5: // 移动到Pos3 if (this.Pos3) { this.handleMovement(deltaTime, 6); } else { console.error("移动目标 Pos3 不存在"); this.sequenceState = 7; } break; case 6: // 在Pos3攻击5次 if (this.attackCount === 0) { this.startAutoAttack(); } if (this.attackCount >= 5) { this.stopAutoAttack(); this.attackCount = 0; this.sequenceState = 7; // 站立结束 if (this.buleAnimation) { this.buleAnimation.play('stand-1'); } } break; case 7: // 序列完成 this.isMoving = false; break; } } // 处理移动逻辑 - 修复位置更新问题 private handleMovement(deltaTime: number, nextState: number): void { if (!this.bulePeople || !this.moveTarget) { console.error("移动目标或角色未设置"); return; } // 获取当前角色位置 const currentPos = this.bulePeople.getPosition(); // 计算方向向量 Vec3.subtract(this.moveDirection, this.moveTarget, currentPos); // 计算距离 const distance = this.moveDirection.length(); if (distance <= 0.01) { // 添加容差值 // 到达目标位置 this.bulePeople.setPosition(this.moveTarget); this.sequenceState = nextState; this.isMoving = false; } else { // 计算移动距离 const moveDistance = Math.min(this.moveSpeed * deltaTime, distance); // 标准化方向向量并缩放 this.moveDirection.normalize().multiplyScalar(moveDistance); // 计算新位置 const newPos = new Vec3(); Vec3.add(newPos, currentPos, this.moveDirection); // 更新角色位置 this.bulePeople.setPosition(newPos); } } // 更新摄像机位置 - 保持不变 private updateCameraPosition(deltaTime: number): void { // ... 保持不变 ... } } ``` ### 修复的关键问题: 1. **位置更新问题**: - 使用 `bulePeople.setPosition()` 替代直接赋值 - 添加了位置容差值 (0.01) 避免浮点精度问题 - 确保使用 `getPosition()` 获取当前坐标 2. **坐标空间问题**: - 使用 `getWorldPosition()` 获取位置节点的世界坐标 - 避免使用本地坐标导致位置错误 3. **动画状态管理**: - 添加 `isMoving` 状态变量控制动画 - 确保移动开始时播放行走动画 - 移动结束时停止动画 4. **错误处理**: - 添加节点存在性检查 - 添加详细错误日志 - 异常状态时安全跳转到结束状态 5. **移动计算优化**: - 使用 `Math.min()` 确保不会移动过头 - 缓存移动方向向量减少计算量 - 使用临时变量避免直接修改原始位置 ### 调试建议: 1. **添加调试信息**: ```typescript // 在 handleMovement 中添加调试输出 console.log(`Moving from (${currentPos.x}, ${currentPos.y}, ${currentPos.z}) to (${this.moveTarget.x}, ${this.moveTarget.y}, ${this.moveTarget.z}) | Distance: ${distance}`); ``` 2. **场景检查**: - 确认 `fixedPos` 节点在场景中存在 - 检查 `Pos-1`、`Pos-2`、`Pos-3` 子节点命名正确 - 确保所有节点坐标不为零 3. **参数调整**: - 尝试增加 `moveSpeed` 值(例如 10) - 减少摄像机平滑度 `cameraSmoothness`(例如 0.05) ### 常见问题排查表: | 问题现象 | 可能原因 | 解决方案 | |---------|---------|---------| | 角色完全不移动 | 位置节点未设置 | 检查编辑器中的节点引用 | | 角色移动方向错误 | 坐标空间不一致 | 使用 `getWorldPosition()` | | 角色到达位置后抖动 | 浮点精度问题 | 添加位置容差值 (0.01) | | 动画播放不正常 | 动画状态未更新 | 使用 `isMoving` 状态控制 | | 摄像机不跟随 | 摄像机未设置 | 检查 `mainCamera` 引用 | ### 使用注意事项: 1. **坐标系统**: - Cocos Creator 使用右手坐标系 - Y 轴向上,Z 轴向前 2. **性能优化**: - 避免每帧创建新 `Vec3` 对象 - 重用变量减少垃圾回收 3. **扩展性**: - 可添加路径点数组实现更复杂路径 - 可添加移动完成回调函数
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值