
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
체력 / 스태미나 소모하게 바꾸기
체력 소모
// PlayerCondition.cs
public void TakeDamage(int damage)
{
if (isDead) return;
if (player.PlayerAttack.successParry)
{
if (invincibleCoroutine != null) return;
invincibleCoroutine = StartCoroutine(Invincible(0.3f));
}
if (invincibleCoroutine == null)
{
if(!player.IsCurrentState<DamagedState>()) player.ChangeState<DamagedState>();
invincibleCoroutine = StartCoroutine(Invincible());
Debug.Log("[플레이어] 플레이어 데미지 받음");
health.Substract(damage);
Debug.Log($"[플레이어] 플레이어 현재 체력 : {health.CurValue()}");
}
}스태미나 소모
// PlayerCondition.cs
public bool TryUseStamina(int useStamina)
{
if (stamina.CurValue() - useStamina >= 0)
{
stamina.Substract(useStamina);
Debug.Log($"[플레이어] 스태미나 {useStamina} 사용. 현재 스태미나 {stamina.CurValue()}");
return true;
}
else
{
Debug.Log($"[플레이어] 스태미나 {useStamina} 사용 불가");
return false;
}
}- 스태미나 소모 예시시
// StartParryState.cs
public void Enter(PlayerController player)
{
if (!player.Condition.TryUseStamina(needStamina))
{
if (player.PlayerMove.isGrounded)
{
player.ChangeState<IdleState>();
return;
}
else
{
player.ChangeState<FallState>();
return;
}
}
스태미나 회복

- 기획쪽에서 최대한 x^2 그래프를 유지하고 싶다고 하셔서 공식을 만들어봄
- 스태미나가 0일 때 100까지 올라가려면 5초가 걸려야 한다고 하심
- kx^2 = y니까 k * 10000 = 5 > k = 1/2000
- k = (최대 회복 시간) / (최대 스태미나)
- 그러면 가장 먼저 현재 스태미나에 맞는 y(시작시간) 을 구함
- 그 때부터 elapsed Time 을 점점 증가시키고 그 식대로 스태미나를 대입하면 됨
- 그리고 스태미나를 사용하고 1초가 지난 뒤에 회복 가능하다고 했음
// PlayerCondition.cs
private void Awake()
{
canStaminaRecovery = new Observable<bool>(EventBusKey.ChangeStaminaRecovery, false);
startRecoveryStaminaTime = 1f;
player = GetComponent<PlayerController>();
k = (recoveryFullTime) / Mathf.Pow(stamina.maxValue, 2);
Debug.Log($"[플레이어] 스태미나 상수 k = {k}");
}
void FixedUpdate()
{
Debug.Log($"[플레이어] 스태미나 : {stamina.CurValue()}");
if(canStaminaRecovery.Value && stamina.CurValue() < stamina.maxValue)
{
if (Time.time > recoveryStaminaThresholdTime)
{
recoveryElapsedTime += Time.fixedDeltaTime;
var tempStamina = Mathf.FloorToInt(Mathf.Sqrt(recoveryElapsedTime * (1 / k)));
stamina.SetCurValue(Mathf.Min(stamina.maxValue, tempStamina));
}
}
if (health.CurValue() <= 0f && !isDead)
{
Die();
}
}
public void OnStaminaRecoveryChanged(object data)
{
// RecoveryChanged가 True 로 바꼈을 때
if ((bool)data)
{
// Debug.Log("[플레이어] 스태미나 리커버리 켜짐");
recoveryElapsedTime = k * Mathf.Pow(stamina.CurValue(), 2);
recoveryStaminaThresholdTime = Time.time + startRecoveryStaminaTime;
// 1초 뒤에 시작할 수 있게
// Debug.Log($"[플레이어] 스태미나 상수 k 에 곱해진 현재 스태미나 : {Mathf.Pow(stamina.CurValue(), 2)}");
// Debug.Log($"[플레이어] 스태미나 리커버리 시간 {recoveryElapsedTime}"); }
else
{
recoveryElapsedTime = 0;
// Debug.Log("[플레이어] 스태미나 리커버리 꺼짐");
}
}
public void OnStaminaChanged(object data)
{
if ((int)data < stamina.maxValue)
{
canStaminaRecovery.Value = true;
}
else
{
canStaminaRecovery.Value = false;
}
}죽음 상태 추가하기
// PlayerCondition.cs
public void Die()
{
isDead = true;
Debug.Log("[플레이어] 죽음!");
player.ChangeState<DieState>();
}
// DieState.cs
public class DieState : IPlayerState
{
public void Enter(PlayerController player)
{
player.SetAnimation(PlayerAnimID.Die, true);
player.Inputs.Disable();
}구글 시트와 데이터 연동하기
- 팀원분이 만들어주신 GoogleSheetToJson 사용하기


- 구글 스프레드 시트 아이디를 적음 (링크에 있는거)
- 인증 Json 파일의 위치를 적음
- Step 1을 한 번 누름
- 컴파일이 완료되면 Step 2를 누름
-
참고 : 나중에 시트에서 데이터 값만 바뀌는거면 Step 2만 누르면 됨.
-
그러면 자동으로 C# 클래스 파일이랑 데이터가 생김!
-
TableDataHandler에서 플레이어 데이터를 로드하도록 메소드 추가
// TableDataHandler.cs
public static PlayerDataModel LoadPlayerData()
{
DataTableManager.Instance.LoadSingleData<PlayerData>();
PlayerData tableData = DataTableManager.Instance.SingleData[typeof(PlayerData)] as PlayerData;
PlayerDataModel result = new PlayerDataModel(tableData.MaxHealth, tableData.MaxStamina,
tableData.SpecialAttackStamina, tableData.DodgeStamina, tableData.DodgeInvincibleTime,
tableData.DoubleJumpStamina, tableData.ParryStamina, tableData.ParryInvincibleTime, tableData.ParryDamage,
tableData.WallJumpStamina, tableData.InvincibleTime, tableData.NormalAttackDamage,
tableData.JumpAttackDamage, tableData.DownAttackDamage, tableData.Jumpforce, tableData.Skill_Ids,
tableData.MoveSpeed);
return result;
}학습하며 겪었던 문제점 & 에러
문제 1
- 문제&에러에 대한 정의
좌우로 움직일 때 버벅였음
- 내가 한 시도
타일맵 콜라이더를 안씀
- 해결 방법
타일맵 콜라이더에 컴포짓 콜라이더를 넣고 Offset distance를 0으로 바꿨더니 나아짐
- 자세한 내용
Composite Collider 2D의 Offset Distance는 콜라이더의 경계선을 원본 모양에서 얼마나 확장하거나 축소할지를 조절하는 속성입니다.
이 값은 복합 콜라이더를 구성하는 개별 콜라이더들의 경계선이 합쳐질 때, 그 합쳐진 외곽선이 원본 모양과 얼마나 떨어져 있을지를 결정합니다.
양수 값: 콜라이더의 외곽선이 원본 모양보다 약간 바깥쪽으로 확장됩니다. 이는 미세한 틈새를 메우거나, 콜라이더가 오브젝트보다 약간 더 커야 할 때 유용합니다.
음수 값: 콜라이더의 외곽선이 원본 모양보다 약간 안쪽으로 수축됩니다. 오브젝트의 실제 모델보다 콜라이더가 약간 작아야 할 때 사용할 수 있습니다.
이 속성은 복합 콜라이더를 구성하는 여러 콜라이더들이 합쳐질 때 발생하는 미세한 틈새나 부정확성을 보정하는 데 주로 사용됩니다.
