skill cooltime 적용 로직 테스트 코드

This commit is contained in:
aube.lee
2025-02-08 14:49:06 +09:00
parent d4bafd6cec
commit 57eb4abea3
9 changed files with 118 additions and 165 deletions

View File

@@ -749,6 +749,30 @@ PrefabInstance:
propertyPath: poolContainer.Array.data[2].count propertyPath: poolContainer.Array.data[2].count
value: 5 value: 5
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 7514646104575922049, guid: ab2e507b20e5dc844a1ea24b5619f656, type: 3}
propertyPath: poolContainer.Array.data[0].objectId
value: K0001
objectReference: {fileID: 0}
- target: {fileID: 7514646104575922049, guid: ab2e507b20e5dc844a1ea24b5619f656, type: 3}
propertyPath: poolContainer.Array.data[1].objectId
value: K0002
objectReference: {fileID: 0}
- target: {fileID: 7514646104575922049, guid: ab2e507b20e5dc844a1ea24b5619f656, type: 3}
propertyPath: poolContainer.Array.data[2].objectId
value: K0007
objectReference: {fileID: 0}
- target: {fileID: 7514646104575922049, guid: ab2e507b20e5dc844a1ea24b5619f656, type: 3}
propertyPath: poolContainer.Array.data[0].objectPrefab
value:
objectReference: {fileID: 6328494989662859589, guid: 25bb8f03ea9cfc941b64e04b75d3a1d9, type: 3}
- target: {fileID: 7514646104575922049, guid: ab2e507b20e5dc844a1ea24b5619f656, type: 3}
propertyPath: poolContainer.Array.data[1].objectPrefab
value:
objectReference: {fileID: 2209934716239183953, guid: d120f035432a9f849acccd97c5d88eb1, type: 3}
- target: {fileID: 7514646104575922049, guid: ab2e507b20e5dc844a1ea24b5619f656, type: 3}
propertyPath: poolContainer.Array.data[2].objectPrefab
value:
objectReference: {fileID: 589444956133359262, guid: 530f7e18dc59af345a84638c4e80642f, type: 3}
m_RemovedComponents: [] m_RemovedComponents: []
m_RemovedGameObjects: [] m_RemovedGameObjects: []
m_AddedGameObjects: [] m_AddedGameObjects: []

View File

@@ -160,12 +160,12 @@ namespace TON
attackCollider.EnableCollider(false); attackCollider.EnableCollider(false);
} }
public void SkillAttack(string skillName) public void SkillAttack(string skillId)
{ {
animator.Play("Skill Attack"); animator.Play("Skill Attack");
// 스킬 생성 // 스킬 생성
GameObject skill = ObjectPoolManager.Instance.GetEffect(skillName); GameObject skill = ObjectPoolManager.Instance.GetEffect(skillId);
// skill.transform.SetParent(firePoint); // skill.transform.SetParent(firePoint);
skill.transform.SetPositionAndRotation(firePoint.position, firePoint.rotation); skill.transform.SetPositionAndRotation(firePoint.position, firePoint.rotation);

View File

@@ -4,54 +4,8 @@ using UnityEngine;
namespace TON namespace TON
{ {
public class DarknessBall : PoolAble public class DarknessBall : SkillBase
{ {
private float elapsedTime; // 경과 시간 저장 변수
public float destoryTime = 2f;
[SerializeField]
private float damage;
private string id = "K0003";
private DamageCalculator damageCalculator = new DamageCalculator();
private PlayerData playerData;
void OnEnable()
{
elapsedTime = 0f; // 오브젝트가 활성화될 때 초기화
damage = SkillDataManager.Singleton.GetSkillData(id).damage;
playerData = PlayerDataManager.Singleton.player;
}
void Update()
{
elapsedTime += Time.deltaTime; // 경과 시간 누적
// 2초가 지나면 오브젝트 풀에 반환
if (elapsedTime >= destoryTime)
{
ReleaseObject();
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Monster")) // 적과 충돌 시 제거
{
// 기본 데미지 계산
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 몬스터 방어력
float monsterDefencePower = collision.GetComponent<MonsterBase>().defencePower;
float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower * this.damage, 0, monsterDefencePower);
// 치명타 적용
damage = damageCalculator.ApplyCriticalDamage(damage);
collision.GetComponent<IDamage>().ApplyDamage(damage);
ReleaseObject();
}
}
} }
} }

View File

@@ -5,54 +5,8 @@ using UnityEngine;
namespace TON namespace TON
{ {
public class FireBall : PoolAble public class FireBall : SkillBase
{ {
private float elapsedTime; // 경과 시간 저장 변수
public float destoryTime = 2f;
[SerializeField]
private float damage;
private string id = "K0001";
private DamageCalculator damageCalculator = new DamageCalculator();
private PlayerData playerData;
void OnEnable()
{
elapsedTime = 0f; // 오브젝트가 활성화될 때 초기화
damage = SkillDataManager.Singleton.GetSkillData(id).damage;
playerData = PlayerDataManager.Singleton.player;
}
void Update()
{
elapsedTime += Time.deltaTime; // 경과 시간 누적
// 2초가 지나면 오브젝트 풀에 반환
if (elapsedTime >= destoryTime)
{
ReleaseObject();
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Monster")) // 적과 충돌 시 제거
{
// 기본 데미지 계산
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 몬스터 방어력
float monsterDefencePower = collision.GetComponent<MonsterBase>().defencePower;
float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower * this.damage, 0, monsterDefencePower);
// 치명타 적용
damage = damageCalculator.ApplyCriticalDamage(damage);
collision.GetComponent<IDamage>().ApplyDamage(damage);
ReleaseObject();
}
}
} }
} }

View File

@@ -4,53 +4,8 @@ using UnityEngine;
namespace TON namespace TON
{ {
public class IceBall : PoolAble public class IceBall : SkillBase
{ {
private float elapsedTime; // 경과 시간 저장 변수
public float destoryTime = 2f;
[SerializeField]
private float damage;
private string id = "K0002";
private DamageCalculator damageCalculator = new DamageCalculator();
private PlayerData playerData;
void OnEnable()
{
elapsedTime = 0f; // 오브젝트가 활성화될 때 초기화
damage = SkillDataManager.Singleton.GetSkillData(id).damage;
playerData = PlayerDataManager.Singleton.player;
}
void Update()
{
elapsedTime += Time.deltaTime; // 경과 시간 누적
// 2초가 지나면 오브젝트 풀에 반환
if (elapsedTime >= destoryTime)
{
ReleaseObject();
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Monster")) // 적과 충돌 시 제거
{
// 기본 데미지 계산
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 몬스터 방어력
float monsterDefencePower = collision.GetComponent<MonsterBase>().defencePower;
float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower * this.damage, 0, monsterDefencePower);
// 치명타 적용
damage = damageCalculator.ApplyCriticalDamage(damage);
collision.GetComponent<IDamage>().ApplyDamage(damage);
ReleaseObject();
}
}
} }
} }

View File

@@ -5,17 +5,41 @@ using UnityEngine;
namespace TON namespace TON
{ {
[System.Serializable] [System.Serializable]
public abstract class SkillBase public abstract class SkillBase : PoolAble
{ {
public float SkillCoolDown => SkillData.coolDown; public float SkillCoolDown => SkillData.coolDown;
public float CurrentCoolDown { get; protected set; } public float CurrentCoolDown { get; protected set; }
public SkillData SkillData { get; private set; } public SkillData SkillData { get; private set; }
public PlayerData playerData;
private DamageCalculator damageCalculator = new DamageCalculator();
private float elapsedTime; // 경과 시간 저장 변수
public float destoryTime = 2f;
public void Init(SkillData skillData) public void Init(SkillData skillData)
{ {
SkillData = skillData; SkillData = skillData;
playerData = PlayerDataManager.Singleton.player;
}
void OnEnable()
{
elapsedTime = 0f; // 오브젝트가 활성화될 때 초기화
}
void Update()
{
UpdateSkill(Time.deltaTime);
elapsedTime += Time.deltaTime; // 경과 시간 누적
// 2초가 지나면 오브젝트 풀에 반환
if (elapsedTime >= destoryTime)
{
ReleaseObject();
}
} }
public void UpdateSkill(float deltaTime) public void UpdateSkill(float deltaTime)
@@ -25,7 +49,25 @@ namespace TON
} }
public abstract void ExecuteSkill(CharacterBase actor); private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Monster")) // 적과 충돌 시 제거
{
// 기본 데미지 계산
// TODO: 장비 공격력 반영 필요
// float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower, playerData.equipmentAttack, playerData.defensivePower);
// 몬스터 방어력
float monsterDefencePower = collision.GetComponent<MonsterBase>().defencePower;
float damage = damageCalculator.CalculateBaseDamage(playerData.attackPower * SkillData.damage, 0, monsterDefencePower);
// 치명타 적용
damage = damageCalculator.ApplyCriticalDamage(damage);
collision.GetComponent<IDamage>().ApplyDamage(damage);
ReleaseObject();
}
}
} }
} }

View File

@@ -22,10 +22,7 @@ namespace TON
{ {
skillDatas = new List<SkillData>(); skillDatas = new List<SkillData>();
} }
// skillData를 skillBase로 치환 // skillData를 skillBase로 치환
// 기존 스킬 클래스들을 skillBase를 상속받게 변경
} }
public SkillData GetSkillData(string skillId) public SkillData GetSkillData(string skillId)

View File

@@ -69,22 +69,13 @@ namespace TON
linkedCharactor.Attack(); linkedCharactor.Attack();
} }
public void OnClickSkillButton(ControllerUI_SkillButton skill) public void OnClickSkillButton(ControllerUI_SkillButton button)
{ {
linkedCharactor.SkillAttack(button.skillId);
SkillData skillData = skillDatas.Find(skill => skill.id == button.skillId);
button.SetCoolTime(skillData.coolDown);
linkedCharactor.SkillAttack(skill.skillData.name);
} }
private void Update()
{
foreach (var index in skillButtons.Keys)
{
ControllerUI_SkillButton skillButton = skillButtons.GetValueOrDefault(index);
if (skillButton != null && skillButton.skillData != null)
{
// skillButton.SetCoolTime()
}
}
}
} }
} }

View File

@@ -9,7 +9,6 @@ namespace TON
public class ControllerUI_SkillButton : MonoBehaviour public class ControllerUI_SkillButton : MonoBehaviour
{ {
public SkillData skillData;
[SerializeField] private TextMeshProUGUI coolTimeText; [SerializeField] private TextMeshProUGUI coolTimeText;
[SerializeField] private Image coolTimeDimd; [SerializeField] private Image coolTimeDimd;
[SerializeField] private GameObject skillIcon; [SerializeField] private GameObject skillIcon;
@@ -18,22 +17,59 @@ namespace TON
[SerializeField] [SerializeField]
private SerializableDictionary<string, Sprite> skillSprite = new SerializableDictionary<string, Sprite>(); private SerializableDictionary<string, Sprite> skillSprite = new SerializableDictionary<string, Sprite>();
public string skillId;
public float maxCooldown;
public void Initalize(SkillData skillData) public void Initalize(SkillData skillData)
{ {
Debug.Log($"Initalize :: {skillData.id}"); skillId = skillData.id;
this.skillData = skillData; maxCooldown = skillData.coolDown;
InitSkillData(skillData);
skillIcon.SetActive(true); skillIcon.SetActive(true);
skillIcon.GetComponent<Image>().sprite = skillSprite.GetValueOrDefault(skillData.id, null); skillIcon.GetComponent<Image>().sprite = skillSprite.GetValueOrDefault(skillData.id, null);
lockImage.SetActive(false); lockImage.SetActive(false);
} }
public void SetCoolTime(float remain, float max) public void SetCoolTime(float remain)
{ {
coolTimeText.gameObject.SetActive(remain > 0f); coolTimeText.gameObject.SetActive(remain > 0f);
coolTimeText.text = $"{Mathf.CeilToInt(remain)}s"; coolTimeText.text = $"{Mathf.CeilToInt(remain)}s";
coolTimeDimd.fillAmount = remain / max; coolTimeDimd.fillAmount = remain / maxCooldown;
} }
private SkillBase InitSkillData(SkillData skillData)
{
switch (skillData.id)
{
case "K0001":
var fireBall = gameObject.AddComponent<FireBall>();
fireBall.Init(skillData);
return fireBall;
case "K0002":
var iceBall = gameObject.AddComponent<IceBall>();
iceBall.Init(skillData);
return iceBall;
case "K0003":
return null;
case "K0004":
return null;
case "K0005":
return null;
case "K0006":
return null;
case "K0007":
return null;
case "K0008":
return null;
default:
return null;
}
}
} }