Unity: RangedEnemy Function

이재형·2024년 7월 10일
0
post-thumbnail
post-custom-banner

Unity 실습

원거리 적에 대해서 생각

문제 생각: 원거리 공격에 대해서 2가지 방법을 생각하였음

문제 진행:

1. 플레이어를 향해서 발사체를 발사하여 진행

2. 플레이어의 위치에 원형 폭발물 생성 후 원형이 터지게 진행

문제 해결: 문제 없이 2가지의 구현을 완성을 했다.

1. 원거리 적에 대한 구현

public class RangedEnemy : Enemy
{
    [SerializeField]
    private GameObject projectile;
    public bool AttackType = false;

    protected override void Awake()
    {
        base.Awake();
    }

    private void Start()
    {
        attackEvent += SpawnProjectile;
    }

    private void SpawnProjectile()
    {
        if(AttackType == false)
        {
            GameObject tile = Managers.Pool.Pop(projectile, transform.parent).gameObject;
            tile.transform.position = transform.position;
            tile.GetComponent<ProjectileController>().direction = enemyMovement.direction;
        }
        else
        {
            GameObject tile = Managers.Pool.Pop(projectile, transform.parent).gameObject;
            tile.transform.position = enemyMovement.target.position;
        }
    }

}

원거리 적에 대한 코드로서 공격체에 대한 변수 projectile과 폭발물, 발사체에 대한 bool타입인 AttackType으로 결정하여 SpawnProjectil()에서 스폰과 방향에 대해서 처리를 하였다.


2. 발사체로 진행

public class ProjectileController : MonoBehaviour
{
    Rigidbody2D rigid;
    public int power;
    public Vector3 direction;
    private int speed = 2;

    void Awake()
    {
        rigid = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        rigid.velocity = direction * speed;
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        // collision.TryGetComponent<IDamagable>(out IDamagable damagable) && 
        if (collision.gameObject.CompareTag("Player"))
        {
            //damagable.ApplyDamage(power);
            Managers.Pool.Push(gameObject);
            Debug.Log("발사체에 맞음");
        }
    }
}

1번에서 플레이어를 향하는 발사체를 생성하고 플레이어를 향한 direction을 향해서 speed만큼 이동을하고 충돌체의 Tag가 Player라면 발사체를 오브젝트 풀에 다시 넣고 Log가 찍히게 함(아직 플레이어 구현에서 IDamagable이 미구현으로 log만 찍히게 하였음)


3. 폭발물로 진행

public class Explosion : MonoBehaviour, IAttackable
{
    [SerializeField]
    GameObject min;
    [SerializeField]
    GameObject max;

    public int power;
    private Vector3 addVector3 = new Vector3(0.1f, 0.1f, 0.1f);

    private IDamagable target;

    private void OnEnable()
    {
        min.transform.localScale = addVector3;
    }

    void Update()
    {
        if (min.transform.localScale.magnitude >= max.transform.localScale.magnitude)
        {
            if(Attack(target, power, 0))
            {
                target.ApplyDamage(power);
            }
            Managers.Pool.Push(gameObject);
        }
        else
        {
            min.transform.localScale += addVector3 * Time.deltaTime * 5;
        }
    }

    public bool Attack(IDamagable target, float power, int numberOfAttacks)
    {
        if (target == null) return false;

        return true;
    }



    private void OnTriggerEnter2D(Collider2D collision)
    {
        // collision.TryGetComponent<IDamagable>(out IDamagable damagable) && 
        if (collision.gameObject.CompareTag("Player"))
        {
            //target = damagable;
            Debug.Log("폭탄 공격 범위 들어옴");
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        // collision.TryGetComponent<IDamagable>(out IDamagable damagable) && 
        if (collision.gameObject.CompareTag("Player"))
        {
            //target = damagable;
            Debug.Log("폭탄 공격 범위 나감");
        }
    }
}

작은 원과 큰원을 만들어 두고 생성 시 작은 원의 스케일 값을 높여서 큰 원보다 스케일이 커지면 데미지를 플레이어가 데미지를 입히게 했는데 이것도 2번과 같이 IDamagable이 없어서 log만 찍히게 해뒀고 Enter2D, Exit2D를 이용하여 플레이어 들어오고 나갔는지에 따라서 target 값을 처리하여 데미지를 입히게 할 예정임


정리

배운 내용

1. 없음

해결 못한 문제

1. 없음

문제점

1. 없음

profile
한국사람
post-custom-banner

0개의 댓글