feat: 무기 배율 시스템 통합
- DamageEffect: 무기 데미지 배율 적용 (GetDamageMultiplier) - PlayerSkillInput: 무기 마나 소모 배율 적용 (GetActualManaCost) - SkillEffect: 무기 사거리 배율 적용 (가상 메서드로 구현) Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -1,7 +1,9 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.InputSystem;
|
using UnityEngine.InputSystem;
|
||||||
using Unity.Netcode;
|
using Unity.Netcode;
|
||||||
|
|
||||||
using Colosseum.Skills;
|
using Colosseum.Skills;
|
||||||
|
using Colosseum.Weapons;
|
||||||
|
|
||||||
namespace Colosseum.Player
|
namespace Colosseum.Player
|
||||||
{
|
{
|
||||||
@@ -20,6 +22,8 @@ namespace Colosseum.Player
|
|||||||
[SerializeField] private SkillController skillController;
|
[SerializeField] private SkillController skillController;
|
||||||
[Tooltip("PlayerNetworkController (없으면 자동 검색)")]
|
[Tooltip("PlayerNetworkController (없으면 자동 검색)")]
|
||||||
[SerializeField] private PlayerNetworkController networkController;
|
[SerializeField] private PlayerNetworkController networkController;
|
||||||
|
[Tooltip("WeaponEquipment (없으면 자동 검색)")]
|
||||||
|
[SerializeField] private WeaponEquipment weaponEquipment;
|
||||||
|
|
||||||
private InputSystem_Actions inputActions;
|
private InputSystem_Actions inputActions;
|
||||||
|
|
||||||
@@ -51,6 +55,12 @@ namespace Colosseum.Player
|
|||||||
networkController = GetComponent<PlayerNetworkController>();
|
networkController = GetComponent<PlayerNetworkController>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WeaponEquipment 참조 확인
|
||||||
|
if (weaponEquipment == null)
|
||||||
|
{
|
||||||
|
weaponEquipment = GetComponent<WeaponEquipment>();
|
||||||
|
}
|
||||||
|
|
||||||
InitializeInputActions();
|
InitializeInputActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +120,9 @@ namespace Colosseum.Player
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 마나 비용 체크
|
// 마나 비용 체크 (무기 배율 적용)
|
||||||
if (networkController != null && networkController.Mana < skill.ManaCost)
|
float actualManaCost = GetActualManaCost(skill);
|
||||||
|
if (networkController != null && networkController.Mana < actualManaCost)
|
||||||
{
|
{
|
||||||
Debug.Log($"Not enough mana for skill: {skill.SkillName}");
|
Debug.Log($"Not enough mana for skill: {skill.SkillName}");
|
||||||
return;
|
return;
|
||||||
@@ -137,13 +148,15 @@ namespace Colosseum.Player
|
|||||||
if (skillController.IsExecutingSkill || skillController.IsOnCooldown(skill))
|
if (skillController.IsExecutingSkill || skillController.IsOnCooldown(skill))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (networkController != null && networkController.Mana < skill.ManaCost)
|
// 마나 비용 체크 (무기 배율 적용)
|
||||||
|
float actualManaCost = GetActualManaCost(skill);
|
||||||
|
if (networkController != null && networkController.Mana < actualManaCost)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 마나 소모
|
// 마나 소모 (무기 배율 적용)
|
||||||
if (networkController != null && skill.ManaCost > 0)
|
if (networkController != null && actualManaCost > 0)
|
||||||
{
|
{
|
||||||
networkController.UseManaRpc(skill.ManaCost);
|
networkController.UseManaRpc(actualManaCost);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 모든 클라이언트에 스킬 실행 전파
|
// 모든 클라이언트에 스킬 실행 전파
|
||||||
@@ -166,6 +179,19 @@ namespace Colosseum.Player
|
|||||||
skillController.ExecuteSkill(skill);
|
skillController.ExecuteSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 무기 마나 배율이 적용된 실제 마나 비용 계산
|
||||||
|
/// </summary>
|
||||||
|
private float GetActualManaCost(SkillData skill)
|
||||||
|
{
|
||||||
|
if (skill == null) return 0f;
|
||||||
|
|
||||||
|
float baseCost = skill.ManaCost;
|
||||||
|
float multiplier = weaponEquipment != null ? weaponEquipment.ManaCostMultiplier : 1f;
|
||||||
|
|
||||||
|
return baseCost * multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 스킬 슬롯 접근자
|
/// 스킬 슬롯 접근자
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ using UnityEngine;
|
|||||||
|
|
||||||
using Colosseum.Stats;
|
using Colosseum.Stats;
|
||||||
using Colosseum.Combat;
|
using Colosseum.Combat;
|
||||||
|
using Colosseum.Weapons;
|
||||||
|
|
||||||
namespace Colosseum.Skills.Effects
|
namespace Colosseum.Skills.Effects
|
||||||
{
|
{
|
||||||
@@ -68,7 +69,24 @@ namespace Colosseum.Skills.Effects
|
|||||||
_ => 0f,
|
_ => 0f,
|
||||||
};
|
};
|
||||||
|
|
||||||
return baseDamage + (statDamage * statScaling);
|
float baseTotal = baseDamage + (statDamage * statScaling);
|
||||||
|
|
||||||
|
// 무기 데미지 배율 적용
|
||||||
|
float damageMultiplier = GetDamageMultiplier(caster);
|
||||||
|
return baseTotal * damageMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 시전자의 무기 데미지 배율 조회
|
||||||
|
/// </summary>
|
||||||
|
private float GetDamageMultiplier(GameObject caster)
|
||||||
|
{
|
||||||
|
var weaponEquipment = caster.GetComponent<WeaponEquipment>();
|
||||||
|
if (weaponEquipment != null)
|
||||||
|
{
|
||||||
|
return weaponEquipment.DamageMultiplier;
|
||||||
|
}
|
||||||
|
return 1f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Colosseum;
|
using Colosseum;
|
||||||
|
using Colosseum.Weapons;
|
||||||
|
|
||||||
namespace Colosseum.Skills
|
namespace Colosseum.Skills
|
||||||
{
|
{
|
||||||
@@ -106,12 +108,13 @@ namespace Colosseum.Skills
|
|||||||
{
|
{
|
||||||
Vector3 center = GetAreaCenter(caster);
|
Vector3 center = GetAreaCenter(caster);
|
||||||
Collider[] hits = Physics.OverlapSphere(center, Mathf.Max(areaRadius, fanRadius), targetLayers);
|
Collider[] hits = Physics.OverlapSphere(center, Mathf.Max(areaRadius, fanRadius), targetLayers);
|
||||||
|
// 같은 GameObject가 여러 콜라이더를 가질 수 있으므로 중복 제거
|
||||||
|
HashSet<GameObject> processedTargets = new HashSet<GameObject>();
|
||||||
foreach (var hit in hits)
|
foreach (var hit in hits)
|
||||||
{
|
{
|
||||||
if (hit.gameObject == caster) continue;
|
if (hit.gameObject == caster) continue;
|
||||||
if (!IsCorrectTeam(caster, hit.gameObject)) continue;
|
if (!IsCorrectTeam(caster, hit.gameObject)) continue;
|
||||||
|
if (processedTargets.Contains(hit.gameObject)) continue;
|
||||||
// 부채꼴 판정
|
// 부채꼴 판정
|
||||||
if (areaShape == AreaShapeType.Fan)
|
if (areaShape == AreaShapeType.Fan)
|
||||||
{
|
{
|
||||||
@@ -119,6 +122,7 @@ namespace Colosseum.Skills
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
processedTargets.Add(hit.gameObject);
|
||||||
ApplyEffect(caster, hit.gameObject);
|
ApplyEffect(caster, hit.gameObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user