除去大公司的光环,你还剩点啥?

本文探讨了在大型科技公司工作的程序员面临的现实与挑战。虽然大公司提供了优厚的待遇和良好的职业背书,但程序员们也可能面临成长瓶颈,难以获得全面的技术经验。文章强调了个人核心竞争力的重要性,鼓励技术人员建立个人品牌。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大公司工资高,福利好,制度和流程完善,是很多程序员的向往之地。

在大公司工作,说起来光鲜亮丽,亲戚朋友聊起来,也会说:“奥,是在腾讯/阿里/百度/京东/今日头条/..... 工作啊,真厉害!”   如果是在国外的Google, Fackbook, 微软......那就更加牛气了,高人一头。

当然也会遇到尴尬的情况:“你在IBM啊,IBM不是被联想收购了吗?”

人往高处走,大家都会努力地进入大公司去工作。

有人问我:我真的很焦虑/真的没有目标/真的不知道该学什么......   我就会说: 如果实在没有目标,那就把进入大公司作为目标吧。  事实上,这确实是一个不错的目标。

进入大公司以后,会是什么样子呢?我们来看看:

你经过了一番奋斗,经历了面试的鏖战,终于进入了大公司,心情愉快,感觉良好,头上似乎笼罩起光环了!

看看我们的项目,这么大的流量,这么多用户,这么多的数据......这些都是我,不,是我们组,嗯... 应该是我们部门一起做的。

你也许会感到沮丧:我自己都干了点啥? 无非就是修修补补,不断地改需求,不断地维护。这不就是面试造航母,工作拧螺丝吗?

你试图等待新项目、新系统,这样就可以大展宏图,从头开始大干一番,但实际上,这样的机会很少,碰上了是你的运气,遇不上是正常情况。

子柳在《淘宝技术这十年》中讲了淘宝技术的演进过程,从PHP到重量级的EJB, 再到轻量级的Java框架,从LAMP到Java EE.....  如果有程序员能够随着这套技术演进下来,那绝对是极为幸福的。但是有这样机会的人,又能有多少呢?

你虽然在做一个高并发的系统,但是如果有个朋友创业,请你去从头设计一个类似的系统,你能不能搞定呢?也许你会打退堂鼓: 我个人负责的只是一小块,看不到全局啊,估计是搞不了吧。

或许还有朋友让你去带个团队,去完成一个项目,你又打起来退堂鼓: 不行不行, 我管不了这么多人。

大公司的光环似乎要消散了......

啰嗦了这么多,其实想表达的核心意思就是:不能把大公司的光环,大公司平台赋予的能力当做自己的能力。  是因为公司牛,项目牛,才显得自己比较牛, 反过来则不一定。 也许除去了大公司的光环,自己也剩不下什么了。甚至还比不上小公司那些独挡一面的朋友。

更要命的是,如果公司形势不好,要裁员,对于年龄大的同学是很大的压力。

我们经常谈“核心竞争力”, 也应该剥离公司和平台的属性,这样才真的是自己的能力。

基于自己的核心竞争力,再建立起个人品牌, 这样才能立于不败之地,到了35岁以后,就不是你去找工作,而是工作或者猎头来找你了。

(完)

640?wx_fmt=png

<think>我们正在设计一个游戏系统,其中玩家可以拾取地面上的Buff,这些Buff会根据当前武器的类型(近战或远程)动态添加不同的效果(如攻击加成、射程加成等)。下面我将分别介绍Unity和Unreal引擎的实现方案。 ### 核心设计思路 1. **Buff类型区分**:每个Buff定义其适用武器类型(近战、远程或通用) 2. **拾取检测**:玩家角色与地面Buff物品碰撞时触发拾取逻辑 3. **效果应用**:根据当前装备的武器类型应用对应效果 4. **效果管理**:处理Buff持续时间、叠加效果和移除逻辑 --- ## Unity实现方案 ### 1. 定义Buff基类(ScriptableObject) ```csharp public enum WeaponType { Melee, Ranged } [CreateAssetMenu(menuName = "Buffs/Buff Data")] public abstract class BuffData : ScriptableObject { [Header("基本信息")] public string buffName; public Sprite icon; [Header("适用性设置")] public WeaponType applicableWeaponType; // 适用武器类型 [Header("持续时间")] public float duration = 10f; // 持续秒数 // 应用Buff到武器 public abstract void Apply(Weapon weapon); // 移除Buff public abstract void Remove(Weapon weapon); } ``` ### 2. 实现具体Buff效果 #### 近战攻击加成Buff ```csharp [CreateAssetMenu(menuName = "Buffs/Melee Attack Buff")] public class MeleeAttackBuff : BuffData { [Range(0, 2)] public float damageMultiplier = 1.5f; private float originalDamage; public override void Apply(Weapon weapon) { // 仅对近战武器生效 if (weapon.weaponType != WeaponType.Melee) return; // 保存原始伤害并应用加成 originalDamage = weapon.baseDamage; weapon.baseDamage *= damageMultiplier; } public override void Remove(Weapon weapon) { if (weapon.weaponType != WeaponType.Melee) return; weapon.baseDamage = originalDamage; // 恢复原始伤害 } } ``` #### 远程射程加成Buff ```csharp [CreateAssetMenu(menuName = "Buffs/Ranged Range Buff")] public class RangedRangeBuff : BuffData { public float rangeAddition = 5f; private float originalRange; public override void Apply(Weapon weapon) { // 仅对远程武器生效 if (weapon.weaponType != WeaponType.Ranged) return; originalRange = weapon.range; weapon.range += rangeAddition; } public override void Remove(Weapon weapon) { if (weapon.weaponType != WeaponType.Ranged) return; weapon.range = originalRange; } } ``` ### 3. 武器系统实现 ```csharp public abstract class Weapon : MonoBehaviour { public WeaponType weaponType; public float baseDamage; // 基础伤害值 public float range; // 武器射程/攻击范围 // 当前激活的Buff列表 public List<ActiveBuff> activeBuffs = new List<ActiveBuff>(); // 添加Buff public void AddBuff(BuffData buffData) { // 创建激活的Buff实例 ActiveBuff newBuff = new ActiveBuff(buffData); activeBuffs.Add(newBuff); // 应用效果 buffData.Apply(this); // 启动计时器 StartCoroutine(BuffCountdown(newBuff)); } // Buff倒计时协程 private IEnumerator BuffCountdown(ActiveBuff buff) { yield return new WaitForSeconds(buff.data.duration); buff.data.Remove(this); activeBuffs.Remove(buff); } } // 激活的Buff实例 public class ActiveBuff { public BuffData data; public float remainingTime; public ActiveBuff(BuffData data) { this.data = data; this.remainingTime = data.duration; } } ``` ### 4. 拾取系统实现 ```csharp public class BuffPickup : MonoBehaviour { public BuffData buffData; // 配置的Buff数据 private void OnTriggerEnter(Collider other) { if (other.CompareTag("Player")) { PlayerWeaponController weaponController = other.GetComponent<PlayerWeaponController>(); // 获取当前武器并应用Buff Weapon currentWeapon = weaponController.GetCurrentWeapon(); currentWeapon.AddBuff(buffData); // 销毁拾取物 Destroy(gameObject); } } } ``` ### 5. 玩家武器控制器 ```csharp public class PlayerWeaponController : MonoBehaviour { public Weapon currentWeapon; // 当前装备的武器 public Weapon GetCurrentWeapon() { return currentWeapon; } // 切换武器时处理Buff public void SwitchWeapon(Weapon newWeapon) { // 移除当前武器的所有Buff foreach (var buff in currentWeapon.activeBuffs.ToList()) { buff.data.Remove(currentWeapon); } currentWeapon.activeBuffs.Clear(); // 切换武器 currentWeapon = newWeapon; } } ``` --- ## Unreal实现方案(C++/蓝图) ### 1. 定义Buff基类(UCLASS) ```cpp UENUM(BlueprintType) enum class EWeaponType : uint8 { Melee, Ranged }; UCLASS(Abstract, Blueprintable) class UBuffData : public UObject { GENERATED_BODY() public: UPROPERTY(EditDefaultsOnly, Category = "Buff") FText BuffName; UPROPERTY(EditDefaultsOnly, Category = "Buff") EWeaponType ApplicableWeaponType; UPROPERTY(EditDefaultsOnly, Category = "Buff") float Duration = 10.0f; UFUNCTION(BlueprintNativeEvent, Category = "Buff") void Apply(AWeapon* Weapon); UFUNCTION(BlueprintNativeEvent, Category = "Buff") void Remove(AWeapon* Weapon); }; ``` ### 2. 实现具体Buff效果(C++) #### 近战攻击加成Buff ```cpp UCLASS() class UMeleeAttackBuff : public UBuffData { GENERATED_BODY() public: UPROPERTY(EditDefaultsOnly, Category = "Buff") float DamageMultiplier = 1.5f; virtual void Apply_Implementation(AWeapon* Weapon) override { if (Weapon->GetWeaponType() != EWeaponType::Melee) return; OriginalDamage = Weapon->GetBaseDamage(); Weapon->SetBaseDamage(OriginalDamage * DamageMultiplier); } virtual void Remove_Implementation(AWeapon* Weapon) override { if (Weapon->GetWeaponType() != EWeaponType::Melee) return; Weapon->SetBaseDamage(OriginalDamage); } private: float OriginalDamage; }; ``` ### 3. 武器系统实现(C++) ```cpp UCLASS() class AWeapon : public AActor { GENERATED_BODY() public: EWeaponType GetWeaponType() const { return WeaponType; } float GetBaseDamage() const { return BaseDamage; } void SetBaseDamage(float NewDamage) { BaseDamage = NewDamage; } void AddBuff(UBuffData* BuffData) { if (!BuffData) return; // 创建激活的Buff实例 FActiveBuff NewBuff; NewBuff.BuffData = BuffData; NewBuff.RemainingTime = BuffData->Duration; ActiveBuffs.Add(NewBuff); // 应用效果 BuffData->Apply(this); // 设置定时器 GetWorld()->GetTimerManager().SetTimer( NewBuff.TimerHandle, [this, BuffData]() { RemoveBuff(BuffData); }, BuffData->Duration, false ); } void RemoveBuff(UBuffData* BuffData) { BuffData->Remove(this); ActiveBuffs.RemoveAll([BuffData](const FActiveBuff& Buff) { return Buff.BuffData == BuffData; }); } private: UPROPERTY(EditAnywhere, Category = "Weapon") EWeaponType WeaponType; UPROPERTY(EditAnywhere, Category = "Weapon") float BaseDamage; struct FActiveBuff { UBuffData* BuffData; float RemainingTime; FTimerHandle TimerHandle; }; TArray<FActiveBuff> ActiveBuffs; }; ``` ### 4. 拾取系统实现(蓝图) 1. 创建`BP_BuffPickup`蓝图类 2. 添加碰撞盒组件(Sphere Collision) 3. 事件图表: ``` Event BeginPlay: -> Set Collision Preset to OverlapOnlyPawn Event OnComponentBeginOverlap (Collision Box): if OtherActor is PlayerPawn: Get PlayerWeaponController component Get CurrentWeapon Call "AddBuff" on CurrentWeapon with configured BuffData Destroy Actor ``` ### 5. 玩家武器控制器(C++) ```cpp UCLASS() class APlayerCharacter : public ACharacter { GENERATED_BODY() public: UFUNCTION(BlueprintCallable, Category = "Weapon") void SwitchWeapon(TSubclassOf<AWeapon> NewWeaponClass) { // 移除当前武器的Buff if (CurrentWeapon) { for (auto& Buff : CurrentWeapon->GetActiveBuffs()) { Buff.BuffData->Remove(CurrentWeapon); } CurrentWeapon->ClearBuffs(); } // 生成新武器 CurrentWeapon = GetWorld()->SpawnActor<AWeapon>(NewWeaponClass); // ... 附加到角色等逻辑 } private: AWeapon* CurrentWeapon; }; ``` --- ## 关键设计要 ### 1. 武器类型识别 - 在武器基类中明确设置`WeaponType`枚举值 - 在Buff应用时检查武器类型: ```csharp if (weapon.weaponType != requiredType) return; ``` ### 2. Buff生命周期管理 - **应用时**:修改武器属性或添加特殊效果 - **持续期间**:通过计时器管理 - **移除时**:恢复武器原始属性 ### 3. 武器切换处理 - 切换武器时自动移除所有当前Buff - 新武器不会继承旧武器的Buff效果(除非设计需要) ### 4. 效果叠加处理 若需要支持叠加: ```csharp // 在Weapon类中添加 public void AddBuff(BuffData buffData) { // 查找同类型Buff ActiveBuff existing = activeBuffs.Find(b => b.data.GetType() == buffData.GetType()); if (existing != null) { // 刷新持续时间 existing.remainingTime = buffData.duration; } else { // 创建新Buff实例 ActiveBuff newBuff = new ActiveBuff(buffData); activeBuffs.Add(newBuff); buffData.Apply(this); StartCoroutine(BuffCountdown(newBuff)); } } ``` ### 5. 可视化反馈 - 在UI上显示当前激活的Buff图标和余时间 - 武器模型添加特效(如近战武器发光,远程武器能量环绕) --- ## 数学公式应用 ### 1. 近战伤害计算 $$ \text{最终伤害} = \text{基础伤害} \times \prod_{i=1}^{n}(1 + \text{伤害加成系数}_i) $$ ### 2. 远程射程衰减 $$ \text{实际伤害} = \begin{cases} \text{基础伤害} & \text{距离} \leq \text{最佳射程} \\ \text{基础伤害} \times e^{-k(\text{距离}-\text{最佳射程})} & \text{距离} > \text{最佳射程} \end{cases} $$ ### 3. Buff持续时间叠加 采用最持续时间策略: $$ T_{\text{new}} = \max(T_{\text{current}}, T_{\text{added}}) $$ --- ## 性能优化建议 1. **对象池管理**:对Buff拾取物使用对象池避免频繁实例化 2. **事件驱动**:使用事件系统代替每帧检查: ```csharp // Buff移除时发布事件 public class BuffEvent : UnityEvent<BuffData> {} public static BuffEvent OnBuffRemoved = new BuffEvent(); ``` 3. **数据导向设计**:使用Struct存储Buff状态数据减少类开销 --- ## 相关问题 §§相关问题§§ 1. 如何实现不同品质Buff的效果叠加(如普通/稀有/史诗)? 2. 怎样设计Buff的图标和余时间在UI上的显示? 3. 如何处理武器切换时Buff效果的平滑过渡? 4. 如何实现区域效果(AOE)Buff同时影响多个武器? 5. 怎样设计网络多人游戏中的Buff同步系统?</think>以下是一个完整的Unity/Unreal实现方案,用于角色拾取地面Buff后根据武器类型动态添加攻击加成或射程加成效果: ### 核心系统设计 ```mermaid graph TD A[玩家拾取Buff物品] --> B{Buff类型判断} B -->|近战Buff| C[应用近战效果] B -->|远程Buff| D[应用远程效果] C --> E[武器系统更新] D --> E E --> F[效果可视化] ``` ### Unity 实现方案 #### 1. Buff类型定义(ScriptableObject) ```csharp // 武器类型枚举 public enum WeaponType { Melee, Ranged } // Buff基类 public abstract class BuffData : ScriptableObject { public string buffName; public Sprite icon; public WeaponType applicableType; public float duration = 10f; public abstract void Apply(Weapon weapon); public abstract void Remove(Weapon weapon); } // 近战攻击加成Buff [CreateAssetMenu(menuName = "Buffs/MeleeAttackBuff")] public class MeleeAttackBuff : BuffData { [Range(1f, 3f)] public float damageMultiplier = 1.5f; private float originalDamage; public override void Apply(Weapon weapon) { if(weapon.weaponType != WeaponType.Melee) return; originalDamage = weapon.baseDamage; weapon.baseDamage *= damageMultiplier; Debug.Log($"近战武器伤害提升至{weapon.baseDamage}"); } public override void Remove(Weapon weapon) { if(weapon.weaponType != WeaponType.Melee) return; weapon.baseDamage = originalDamage; } } // 远程射程加成Buff [CreateAssetMenu(menuName = "Buffs/RangedRangeBuff")] public class RangedRangeBuff : BuffData { public float rangeAddition = 5f; private float originalRange; public override void Apply(Weapon weapon) { if(weapon.weaponType != WeaponType.Ranged) return; originalRange = weapon.range; weapon.range += rangeAddition; Debug.Log($"远程武器射程提升至{weapon.range}"); } public override void Remove(Weapon weapon) { if(weapon.weaponType != WeaponType.Ranged) return; weapon.range = originalRange; } } ``` #### 2. 武器系统实现 ```csharp public class Weapon : MonoBehaviour { public WeaponType weaponType; public float baseDamage = 10f; // 近战武器 public float range = 10f; // 远程武器 private List<ActiveBuff> activeBuffs = new List<ActiveBuff>(); // 添加Buff public void AddBuff(BuffData buffData) { // 类型检查 if(buffData.applicableType != weaponType) { Debug.LogWarning($"Buff {buffData.name} 不适用于{weaponType}武器"); return; } // 应用效果 buffData.Apply(this); // 创建激活的Buff实例 ActiveBuff newBuff = new ActiveBuff(buffData, this); activeBuffs.Add(newBuff); // 启动协程管理持续时间 StartCoroutine(BuffDurationRoutine(newBuff)); } // Buff持续时间协程 private IEnumerator BuffDurationRoutine(ActiveBuff buff) { yield return new WaitForSeconds(buff.data.duration); buff.data.Remove(this); activeBuffs.Remove(buff); } } // 激活的Buff实例 public class ActiveBuff { public BuffData data; public Weapon weapon; public float remainingTime; public ActiveBuff(BuffData data, Weapon weapon) { this.data = data; this.weapon = weapon; this.remainingTime = data.duration; } } ``` #### 3. 拾取系统实现 ```csharp public class BuffPickup : MonoBehaviour { public BuffData buffData; // 在Inspector中配置Buff类型 private void OnTriggerEnter(Collider other) { if(other.CompareTag("Player")) { PlayerWeaponController weaponController = other.GetComponent<PlayerWeaponController>(); // 获取当前武器并应用Buff Weapon currentWeapon = weaponController.GetCurrentWeapon(); currentWeapon.AddBuff(buffData); // 显示获取提示 ShowPickupMessage(buffData.buffName); // 销毁拾取物 Destroy(gameObject); } } private void ShowPickupMessage(string buffName) { // 实现UI提示逻辑 Debug.Log($"获得Buff: {buffName}"); } } ``` #### 4. 玩家武器控制器 ```csharp public class PlayerWeaponController : MonoBehaviour { [SerializeField] private Weapon meleeWeapon; [SerializeField] private Weapon rangedWeapon; [SerializeField] private Weapon currentWeapon; private void Start() { // 默认使用近战武器 SwitchWeapon(WeaponType.Melee); } public Weapon GetCurrentWeapon() { return currentWeapon; } public void SwitchWeapon(WeaponType type) { currentWeapon = type == WeaponType.Melee ? meleeWeapon : rangedWeapon; Debug.Log($"已切换到{type}武器"); } } ``` ### Unreal 实现方案(C++/蓝图) #### 1. Buff基类(C++) ```cpp UENUM(BlueprintType) enum class EWeaponType : uint8 { Melee, Ranged }; UCLASS(Abstract, Blueprintable) class UBuffData : public UObject { GENERATED_BODY() public: UPROPERTY(EditDefaultsOnly, Category = "Buff") FText BuffName; UPROPERTY(EditDefaultsOnly, Category = "Buff") EWeaponType ApplicableWeaponType; UPROPERTY(EditDefaultsOnly, Category = "Buff") float Duration = 10.0f; UFUNCTION(BlueprintNativeEvent, Category = "Buff") void Apply(AWeapon* Weapon); UFUNCTION(BlueprintNativeEvent, Category = "Buff") void Remove(AWeapon* Weapon); }; ``` #### 2. 近战攻击Buff实现 ```cpp UCLASS() class UMeleeAttackBuff : public UBuffData { GENERATED_BODY() public: UPROPERTY(EditDefaultsOnly, Category = "Buff") float DamageMultiplier = 1.5f; virtual void Apply_Implementation(AWeapon* Weapon) override { if (Weapon->GetWeaponType() != EWeaponType::Melee) return; OriginalDamage = Weapon->GetBaseDamage(); Weapon->SetBaseDamage(OriginalDamage * DamageMultiplier); UE_LOG(LogTemp, Log, TEXT("Melee damage increased to %f"), Weapon->GetBaseDamage()); } virtual void Remove_Implementation(AWeapon* Weapon) override { if (Weapon->GetWeaponType() != EWeaponType::Melee) return; Weapon->SetBaseDamage(OriginalDamage); } private: float OriginalDamage; }; ``` #### 3. 武器类实现(C++) ```cpp UCLASS() class AWeapon : public AActor { GENERATED_BODY() public: EWeaponType GetWeaponType() const { return WeaponType; } float GetBaseDamage() const { return BaseDamage; } void SetBaseDamage(float NewDamage) { BaseDamage = NewDamage; } void AddBuff(UBuffData* BuffData) { if (!BuffData) return; // 检查适用性 if (BuffData->ApplicableWeaponType != WeaponType) { UE_LOG(LogTemp, Warning, TEXT("Buff not applicable to this weapon")); return; } // 应用Buff BuffData->Apply(this); // 创建激活的Buff FActiveBuff NewBuff; NewBuff.BuffData = BuffData; NewBuff.RemainingTime = BuffData->Duration; ActiveBuffs.Add(NewBuff); // 设置定时器 GetWorld()->GetTimerManager().SetTimer( NewBuff.TimerHandle, [this, BuffData]() { RemoveBuff(BuffData); }, BuffData->Duration, false ); } void RemoveBuff(UBuffData* BuffData) { BuffData->Remove(this); ActiveBuffs.RemoveAll([BuffData](const FActiveBuff& Buff) { return Buff.BuffData == BuffData; }); } private: UPROPERTY(EditAnywhere, Category = "Weapon") EWeaponType WeaponType; UPROPERTY(EditAnywhere, Category = "Weapon") float BaseDamage = 10.0f; struct FActiveBuff { UBuffData* BuffData; float RemainingTime; FTimerHandle TimerHandle; }; TArray<FActiveBuff> ActiveBuffs; }; ``` #### 4. 拾取物蓝图实现 1. 创建`BP_BuffPickup`蓝图 2. 添加碰撞盒组件 3. 事件图表: ``` Event BeginPlay: -> Set Collision Preset to OverlapOnlyPawn Event OnComponentBeginOverlap (Collision Box): if OtherActor is PlayerPawn: Get PlayerWeaponController component Get CurrentWeapon Call "AddBuff" on CurrentWeapon with configured BuffData Destroy Actor ``` ### 关键设计要 1. **武器类型识别系统**: ```csharp // 自动识别远程武器 if(bulletConfig.projectileSpeed > 0) weaponType = WeaponType.Ranged; else weaponType = WeaponType.Melee; ``` 2. **Buff应用逻辑**: ```mermaid sequenceDiagram 拾取物->>武器系统: 尝试应用Buff 武器系统-->>Buff: 检查武器类型 alt 类型匹配 Buff->>武器: 修改属性 武器-->>UI系统: 更新状态显示 else 类型不匹配 武器系统-->>拾取物: 拒绝应用 end ``` 3. **效果计算公式**: - 近战伤害加成: $$ \text{最终伤害} = \text{基础伤害} \times (1 + \sum \text{伤害加成系数}) $$ - 远程射程衰减: $$ \text{实际伤害} = \text{基础伤害} \times e^{-k \times (\text{距离} - \text{最佳射程})} $$ 其中 $k$ 是衰减系数 ### 性能优化建议 1. **对象池管理**: ```csharp public class BuffPool : MonoBehaviour { private Dictionary<string, Queue<GameObject>> pools = new(); public GameObject GetBuff(string prefabPath) { if(!pools.ContainsKey(prefabPath)) pools[prefabPath] = new Queue<GameObject>(); return pools[prefabPath].Count > 0 ? pools[prefabPath].Dequeue() : Instantiate(Resources.Load<GameObject>(prefabPath)); } } ``` 2. **事件驱动设计**: ```csharp public class WeaponEvents : MonoBehaviour { public UnityEvent<BuffData> OnBuffApplied; public UnityEvent<BuffData> OnBuffExpired; } ``` 3. **数据导向设计**: ```json // Buff配置JSON { "buffs": [ { "id": "melee_damage_boost", "type": "Melee", "param": 1.5, "duration": 15.0 } ] } ``` ### 可视化反馈方案 1. **武器特效**: - 近战武器:刀刃粒子效果 - 远程武器:枪口能量光环 2. **UI提示**: ```csharp public class BuffUI : MonoBehaviour { public void ShowBuff(BuffData buff) { // 创建UI元素 var icon = Instantiate(buffIconPrefab, buffPanel); icon.sprite = buff.icon; // 添加倒计时条 StartCoroutine(ShowBuffDuration(icon, buff.duration)); } } ``` 3. **音效反馈**: - 拾取时:能量充能音效 - 效果结束时:能量消散音效 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值