武器切换和隐藏功能

概述

一个用于管理角色武器装备和收起状态的Unity组件,支持动画驱动的武器切换,能够平滑地在装备和收起状态之间切换。

1754294808072

1754294815940

思路

1. 状态管理

  • 双状态设计:系统维护两个主要状态 - 装备状态(hasWeapon = true)和收起状态(hasWeapon = false
  • 状态同步:武器位置、动画层级都与当前状态保持同步
  • 状态验证:通过 HasWeapon()方法提供状态查询接口

2. 动画驱动

  • 动画优先:所有武器切换操作都通过动画驱动,确保视觉效果的连贯性
  • 动画等待:系统会等待动画播放完成后再执行实际的武器位置切换
  • 防冲突机制:通过 isAnimating标志防止动画播放期间的重复操作

3. 层级管理

  • Combat层级:专门用于战斗动画的动画层级
  • 自动控制:根据武器状态自动启用/禁用Combat层级
  • 权重调节:通过设置层级权重来控制动画混合

4. 武器位置管理

// 装备状态:武器附加到右手骨骼
currentWeapon.transform.SetParent(rightHandBone);
currentWeapon.transform.localPosition = equippedPosition;
currentWeapon.transform.localRotation = equippedRotation;

// 收起状态:武器移动到收起位置
currentWeapon.transform.SetParent(stowedParent);
currentWeapon.transform.localPosition = stowedPosition;
currentWeapon.transform.localEulerAngles = stowedRotation;

实现

1. 初始化流程

void Awake()
{
    // 1. 获取动画控制器
    // 2. 设置Combat层级索引
    // 3. 检查武器当前状态
    // 4. 根据状态设置初始配置
}

2. 武器切换流程

void ToggleWeapon()
{
    if (hasWeapon)
        StartCoroutine(StowWeaponWithAnimation());  // 收起武器
    else
        StartCoroutine(EquipWeaponWithAnimation()); // 装备武器
}

3. 动画协程

IEnumerator EquipWeaponWithAnimation()
{
    isAnimating = true;
    animator.CrossFade(equipWeaponAnimation, animationTransitionTime);
    yield return StartCoroutine(WaitForAnimationComplete(equipWeaponAnimation));
    EquipWeapon();
    isAnimating = false;
}

面板参数

武器设置

  • weaponObject:场景中的武器对象
  • rightHandBone:右手骨骼,武器装备时的父对象

收起设置

  • stowedParent:武器收起时的父对象
  • stowedPosition:武器收起时的本地位置
  • stowedRotation:武器收起时的本地旋转

动画设置

  • combatLayerName:Combat层级名称
  • equipWeaponAnimation:装备武器动画名称
  • stowWeaponAnimation:收起武器动画名称
  • animationTransitionTime:动画过渡时间

待扩展

在进入爬墙和钩爪前自动把武器放到背上

1. 多武器支持

系统可以扩展支持多种武器类型:

  • 添加武器类型枚举
  • 为每种武器设置不同的装备/收起位置
  • 实现武器切换逻辑

2. 动画事件集成

可以通过动画事件进一步优化:

  • 在动画关键帧触发武器位置切换
  • 添加音效和特效
  • 实现更精确的动画同步

3. 性能优化

  • 缓存Transform引用,避免频繁的GetComponent调用
  • 使用协程而不是Update循环来管理动画等待
  • 合理设置动画过渡时间
posted @ 2025-08-04 16:07  EanoJiang  阅读(75)  评论(0)    收藏  举报