진행한 것들

전체 테스트

이번 주에 만든 적 패트롤, 추적, 공격과 플레이어 연속 공격을 한 씬에 넣어서 테스트 했다.

 

 

데미지 계산

Weapon이라는 클래스를 만들어 무기에 컴포넌트로 등록시키고 OnTriggerEnter로 체크하여 데미지를 계산하고 입히게끔 했다.

attacker와 target으로 나누어 정보를 전달하였고 무적과 회피 그리고 크리티컬을 체크한 뒤 데미지를 계산하였다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Weapon : MonoBehaviour, IBattle
{
    private EntitySO _weaponSO;

    private const int PERCENT_EXCLUDE_MAX_VALUE = 101;

    private void OnTriggerEnter(Collider other)
    {
        HealthSO targetSO = null;
        IDamageable damageable = null;

        if (other.CompareTag("Player"))
        {
            PlayerStatHandler statHandler = other.GetComponentInParent<PlayerController>().StatHandler;
            targetSO = statHandler.Data;
            damageable = statHandler;

            if (_weaponSO == null)
            {
                _weaponSO = GetComponentInParent<EnemyController>().StatHandler.Data;
            }

            Attack(_weaponSO, targetSO, damageable);
        }
        else if (other.CompareTag("Enemy"))
        {
            EnemyStatHandler statHandler = other.GetComponentInParent<EnemyController>().StatHandler;
            targetSO = statHandler.Data;
            damageable = statHandler;
            
            if (_weaponSO == null)
            {
                _weaponSO = GetComponentInParent<PlayerController>().StatHandler.Data;
            }
            
            Attack(_weaponSO, targetSO, damageable);
        }
    }

    public void Attack(EntitySO attacker, HealthSO target, IDamageable targetDamageable)
    {
        if (target.IsInvincible)
            return;

        int randomEvasionProbability = UnityEngine.Random.Range(0, PERCENT_EXCLUDE_MAX_VALUE);
        if (randomEvasionProbability < target.EvasionProbability)
            return;

        float attackDamage = attacker.Attack;

        int randomCriticalProbability = UnityEngine.Random.Range(0, PERCENT_EXCLUDE_MAX_VALUE);
        if (randomCriticalProbability < attacker.CriticalProbability)
            attackDamage += attacker.Attack * attacker.CriticalMod;

        targetDamageable.Damaged(attackDamage);
    }
}

 

 

 

오늘의 이슈 / 내일 할 것

어제 이슈 : 패트롤 비동기

1. 공격 중에 점프, 구르기 이동 막기 (이동은 처음 공격 시 방향 전환만 적용)

StateMachine의 CurrentState가 AttackState면 return하도록 했다.

2. 맵 정보를 받아와서 적이 플레이어 추적하고 공격할 수 있도록 하기

Area에서 정보를 받아서 플레이어가 OnTriggerEnter 됐을 때 추적하고 OnTriggerExit 됐을 때 패트롤 상태가 되도록 했다.

 

오늘 이슈

1. 공격 상태가 아님에도 Attack을 호출하여 적 끼리 OnTriggerEnter가 불려서 NullReferenceException이 발생

 

내일 할 것

공격 상태에만 Attack을 호출할 수 있도록 하기

 

 

오늘의 회고

  오늘은 이번 주에 작업 했던 것들을 합쳐서 점검하고 무기로부터 데미지를 전달할 수 있도록 했다. 이후에 아이템 작업 하시는 분의 StatHandler의 작업이 끝나면 무기의 스텟을 캐릭터 스텟에 추가하고 총 합을 Attack의 매개변수로 넘길 수 있도록 할 것이다. 무기도 장착해주고 보여지는 것들이 하나씩 늘어가니까 뭔가 진행되고 있는 것 같아서 기분이 좋다. 이 기분대로 열심히 더 해보자 파이팅!

+ Recent posts