오늘 학습 키워드

최종 팀 프로젝트

오늘 학습 한 내용을 나만의 언어로 정리하기

체력 / 스태미나 소모하게 바꾸기

체력 소모

// 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 사용하기

  1. 구글 스프레드 시트 아이디를 적음 (링크에 있는거)
  2. 인증 Json 파일의 위치를 적음
  3. Step 1을 한 번 누름
  4. 컴파일이 완료되면 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는 콜라이더의 경계선을 원본 모양에서 얼마나 확장하거나 축소할지를 조절하는 속성입니다.

이 값은 복합 콜라이더를 구성하는 개별 콜라이더들의 경계선이 합쳐질 때, 그 합쳐진 외곽선이 원본 모양과 얼마나 떨어져 있을지를 결정합니다.

양수 값: 콜라이더의 외곽선이 원본 모양보다 약간 바깥쪽으로 확장됩니다. 이는 미세한 틈새를 메우거나, 콜라이더가 오브젝트보다 약간 더 커야 할 때 유용합니다.

음수 값: 콜라이더의 외곽선이 원본 모양보다 약간 안쪽으로 수축됩니다. 오브젝트의 실제 모델보다 콜라이더가 약간 작아야 할 때 사용할 수 있습니다.

이 속성은 복합 콜라이더를 구성하는 여러 콜라이더들이 합쳐질 때 발생하는 미세한 틈새나 부정확성을 보정하는 데 주로 사용됩니다.

내일 학습 할 것은 무엇인지