103
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2501_CS_SE_FZU |
|---|---|
| 这个作业要求在哪里 | 团队作业——站立式会议+α冲刺 |
| 这个作业的目标 | α冲刺Day3 |
| 其他参考文献 | 《构建之法》、Google Style Guides |


| 成员角色 | 昨日至今日日站立会安排 | 存在的问题 / 遇到的困难 | 心得体会 | 今日至明日站立会安排 |
|---|---|---|---|---|
| 陈志豪(敌人模块) | 1. 优化掉落物生成位置,添加随机偏移(5f 范围内);2. 调整击退抗性公式,测试并确定合理参数;3. 编写敌人 AI 行为优化(E-004)的基础逻辑。 | 多敌人同时死亡时,掉落物生成位置重叠,导致玩家拾取判定混乱;敌人击退抗性参数调试未达预期,击退距离过短,与设计效果不符。 | 这次做敌人死亡处理和掉落系统,最大的体会是 “细节决定体验”。之前没考虑多敌人同时死亡的情况,直接在敌人坐标生成掉落物,结果全堆在一起,玩家根本没法正常拾取。后来加了随机偏移才解决,这让我意识到多对象并发场景下,必须提前预判交互冲突。另外调试击退抗性参数时,一开始只按固定值设置,发现大体积敌人和小敌人击退效果一样,完全不符合逻辑,现在才明白参数设计要结合对象属性(比如体型、等级)动态调整,不能一刀切。 | 1. 开发敌人 “攻击前摇 / 后摇” 逻辑(任务 E-004),为不同敌人设置差异化动作时长(普通敌人前摇 0.5s,精英敌人前摇 0.8s);2. 测试并优化敌人 AI 追击范围,避免 “追击过远脱离战斗区域” 问题;3. 联调敌人死亡与玩家拾取系统,确保掉落物被拾取后敌人尸体资源正常清理。 |
| 胡定赟 (UI/UX 设计) | 1. 为血条添加数值平滑过渡算法(Lerp 插值);2. 优化 UI 适配锚点,确保 720p-2K 分辨率下正常显示;3. 开发死亡 UI(任务 U-006)的基础框架。 | 背包 UI 在 720p 低分辨率设备上显示不全,适配未覆盖小屏场景;血条在玩家快速连续受击时,仍存在轻微数值跳变,平滑过渡效果需进一步优化。 | 做血条和背包 UI 最大的收获是 “适配和流畅度是 UI 的生命线”。之前血条用直接赋值更新,玩家快速受击时数字跳得特别突兀,加了 Lerp 插值后平滑多了,但低分辨率下背包槽位还是会挤在一起 —— 原来我只测了 1080p,没考虑 720p 设备。这提醒我,UI 设计不能只看 “好看”,必须覆盖多分辨率场景,还要站在玩家操作角度想问题,比如按钮间距、文字大小,哪怕差 1px 都可能影响体验。 | 1. 完成死亡 UI 开发(任务 U-006):添加 “死亡提示文字”“3 秒重生倒计时”“返回主菜单按钮”,并绑定重生 / 返回逻辑;2. 优化背包 UI 在 720p 分辨率下的显示,调整槽位布局为 “3 列 4 行”,确保无遮挡;3. 为技能栏 UI 添加 “按键提示图标”(如 U/I/O/L 键标识),提升操作指引性。 |
| 阮航宇 (地图与资源设计) | 1. 批量检查并修正 Tile 碰撞层(Ground 层设为不可穿透);2. 优化宝箱交互逻辑,同步动画与掉落物生成;3. 添加地图装饰元素(任务 M-008),如岩石、火把。 | 部分 Tile(如洞穴边缘、障碍物)未正确设置碰撞层属性,导致玩家可穿透墙壁或卡在地形缝隙中,需逐一校验 Tile 的Ground层标记。 | 地图构建让我明白 “玩法逻辑要优先于视觉效果”。一开始为了场景好看,在洞穴通道加了很多装饰性 Tile,结果没设置碰撞层,玩家直接穿过去了。后来逐块检查碰撞属性,才发现漏了近 10 个关键地形块。另外宝箱交互延迟的问题,原本是动画播完才生成掉落物,玩家点击后没反应还以为是 bug,调整时序后体验立刻顺畅了。现在我做地图时,会先把碰撞、交互逻辑跑通,再补视觉细节,避免本末倒置。 | 1. 开发 “恢复泉水” 可交互物逻辑:玩家靠近后每 2 秒恢复 10% 生命值 / MP,添加泉水粒子特效与恢复数值飘字;2. 补全地图边缘装饰元素(岩石、火把),确保场景视觉无割裂;3. 测试地图全区域碰撞,重点排查 “地形缝隙卡角色” 问题,补充遗漏的碰撞体。 |
| 张天荣 (攻击模块) | 1. 添加攻击冷却锁(0.5 秒),避免动作叠加;2. 优化攻击盒检测逻辑,增加 SphereCast 范围检测补全判定;3. 调整暴击数字字号(普通 14 号→暴击 16 号)与偏移量(向上偏移 50px);4. 集成元素攻击效果(火 / 冰)与攻击判定联动(任务 C-002)。 | 攻击盒偶尔无法检测到近距离敌人,存在判定盲区;暴击伤害数字与普通伤害数字显示位置重叠,视觉区分度不足。 | 攻击系统开发让我对 “手感” 有了更深的理解。一开始攻击盒半径设 0.3f,玩家贴脸攻击都打不中,调大到 0.4f 才刚好;后来又遇到快速按 J 键动作叠加的问题,加了冷却锁才解决。最意外的是暴击数字,原本和普通数字一样大,玩家反馈分不清,调大字号、改红色再加偏移后,视觉反馈立刻清晰了。现在我觉得,攻击系统不只是 “打不打得中”,更要让玩家通过判定、动画、数字反馈,直观感受到 “击中了”“暴击了”,这样才会有爽感。 | 1. 集成元素攻击效果与攻击判定联动(任务 C-002):实现 “火攻击点燃敌人”“冰攻击冻结敌人” 逻辑,绑定元素效果与伤害判定时序;2. 修复攻击盒近距离判定盲区,在原碰撞检测基础上增加 “SphereCast” 球形检测(半径 0.2f),覆盖贴脸攻击场景;3. 测试不同攻击角度下的判定准确性,调整攻击盒朝向跟随角色面朝方向同步翻转。 |
| 汪涛(测试与性能优化、玩家模块) | 1. 修复重生后物理碰撞失效问题;2. 完成玩家受击处理(任务 P-008),添加击退效果与无敌帧;3. 提交代码并同步至主分支。 | 重生后偶尔出现物理碰撞失效,需手动重新激活Rigidbody2D组件;死亡动画播放结束后与重生逻辑衔接存在 0.5 秒卡顿,影响体验流畅度。 | 兼顾玩家模块开发和测试,最大的体会是 “提前暴露问题比事后修复更高效”。玩家重生后碰撞失效,一开始以为是组件没激活,后来测试时发现是重生逻辑里没重置isKinematic属性,早测早发现就能少走弯路。性能优化方面,Update()里的FindObjectOfType是个大坑,之前没注意,测的时候发现每帧都在查对象,帧率直接掉了 10 帧,移到Start()缓存后立刻好了。现在我写代码时,会主动想 “这个逻辑会不会有性能问题”“有没有边界场景没考虑到”,而不是等测试出问题再改。 | 1. 优化玩家重生与死亡动画的衔接:将死亡动画播放时长(1.5s)与重生倒计时绑定,避免 “动画没播完就重生” 的卡顿;2. 执行 “玩家 - 敌人 - 攻击 - 技能” 全流程测试,记录 “技能释放后攻击无响应”“重生后技能 CD 未重置” 等问题;3. 优化玩家移动手感,调整 “空中移动加速度” 从 10f 降至 8f,减少空中 “滑步” 感。 |
| 莫馥玮(技能模块) | 1. 修正投射体碰撞层 Mask,仅检测 Enemy 层;2. 完成近战技能 DashStab(任务 S-002)的位移与伤害判定;3. 同步技能 UI 与逻辑的事件绑定(任务 S-004)。 | 投射体碰撞层配置错误、技能冷却 UI 与实际 CD 不同步、近战技能位移与碰撞判定冲突、技能 MP 消耗计算异常 | 技能模块开发让我明白 “模块联动要靠事件,不能靠硬引用”。一开始火球术投射体穿透敌人,是因为碰撞层Mask设成了 “所有层”,没过滤地形;后来冷却 UI 不同步,是因为 UI 只在Update()里查 CD,没监听技能的OnCDEnd事件。这两个问题让我意识到,技能系统不是孤立的,和碰撞、UI、资源都要联动,用事件总线统一管理交互,比每个模块单独查状态更可靠。另外做DashStab技能时,提前规划好 “位移中检测碰撞” 的逻辑,避免了后续返工,也让我学会了先设计时序再写代码。 | 1. 完成近战技能 DashStab(冲刺突刺)开发:实现 “向前冲刺 2 米 + 沿途攻击判定”,冲刺过程中忽略非敌人碰撞,避免卡地形;2. 修复技能 MP 消耗计算异常,添加 “等级系数”(MP 消耗 = 基础消耗 ×(1+0.1× 技能等级)),确保高等级技能消耗符合设计;3. 为技能释放添加 “MP 不足提示”(UI 弹窗 + 音效),避免玩家误触无反馈。 |
玩家模块
private void OnRespawn()
{
if (rb != null)
{
rb.isKinematic = false;
rb.velocity = Vector2.zero;
Debug.Log("重生后重新激活Rigidbody2D");
}
isGrounded = true;
doubleJumpUsed = false;
enabled = true; // 重新启用控制器
}
敌人模块
private void SpawnLoot()
{
if (lootTable == null) return;
Vector2 randomOffset = new Vector2(Random.Range(-0.5f, 0.5f), Random.Range(-0.5f, 0.5f));
GameObject loot = Instantiate(lootTable.GetRandomLoot(), transform.position + (Vector3)randomOffset, Quaternion.identity);
Debug.Log($"生成掉落物:{loot.name},位置偏移:{randomOffset}");
}
攻击模块
// 攻击冷却锁逻辑,避免动作叠加
public void PerformAttack()
{
if (Time.time < lastAttackTime + attackCooldown)
{
Debug.Log("攻击冷却中,无法触发攻击");
return;
}
// 攻击逻辑执行...
lastAttackTime = Time.time; // 更新上次攻击时间
}
// 暴击数字样式设置
private void ShowDamageText(int damage, bool isCrit)
{
DamageText text = Instantiate(damageTextPrefab, transform.position + Vector3.up, Quaternion.identity);
text.SetText(damage.ToString());
text.SetColor(isCrit ? Color.red : Color.white);
text.SetFontSize(isCrit ? 16 : 14); // 暴击字号放大
text.SetOffset(isCrit ? new Vector2(0, 50f) : Vector2.zero); // 暴击向上偏移
}
技能模块
// Fireball投射体碰撞逻辑,修正碰撞层
private void OnTriggerEnter2D(Collider2D other)
{
if (((1 << other.gameObject.layer) & enemyLayer) == 0) return; // 仅检测敌人层
// 伤害触发逻辑...
Destroy(gameObject); // 命中后销毁投射体
}
// 技能冷却UI同步
private void UpdateSkillCDUI()
{
if (skillCDImage != null)
{
float cdPercent = Mathf.Clamp01((skillCD - (Time.time - lastCastTime)) / skillCD);
skillCDImage.fillAmount = cdPercent;
}
}
UI/UX 设计
// 血条平滑过渡逻辑,使用Lerp插值
public void UpdateHealth(float currentHealth, float maxHealth)
{
targetHealthPercent = currentHealth / maxHealth;
}
private void Update()
{
currentHealthPercent = Mathf.Lerp(currentHealthPercent, targetHealthPercent, Time.deltaTime * 5f);
healthBar.fillAmount = currentHealthPercent;
healthText.text = $"{Mathf.Round(currentHealthPercent * 100)}%";
}
地图模块:
