TIL

[멋쟁이사자처럼 부트캠프 TIL회고] 39일차 : 폭발물 추가

Cadi 2024. 12. 29. 14:33

의도하지 않은 데미지, 폭발로 인한 데미지가 아니라 닿아서 데미지를 줌 

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

public class RayBoom : MonoBehaviour
{
   public float damage;

   void OnCollisionEnter2D(Collision2D collision)
   {
      if (collision.gameObject.layer == 3)
      {
         Explode();
      }
   }
   
   
   
   
   void Explode()
   {
      float explosionRadius = 1.2f;
      float explosionPower = 15f;
      float upWardForec = 5f;
      float originalDamge = 10;


      Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, explosionRadius);

      foreach (Collider2D collider in colliders)
      {
         Rigidbody2D rb = collider.GetComponent<Rigidbody2D>();
         if (rb != null)
         {
            Vector2 direction = collider.transform.position - transform.position;
            float distance = direction.magnitude;
            damage = originalDamge / (1 - (distance / explosionRadius));

            float forceFalloff = 1 - (distance / explosionRadius);
            Vector2 force = direction.normalized * (forceFalloff *explosionPower);
            force += Vector2.up * upWardForec;
            
            //rb.AddForce(force, ForceMode2D.Impulse);
            
         }
      }



   }
}
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class DamageCheck : DestroyableObject
{
 void Start()
 {
     HP = 10000;
     maxHP = 10000;
 }
 void Update()
 {
     base.Update();
     
 }

 private void OnCollisionEnter2D(Collision2D other)
 {
     takeDamage(other);
 }


 void takeDamage(Collision2D other)
 {
     var RabyBoom = other.gameObject.GetComponent<RayBoom>();
     if (RabyBoom != null)
     {
         HP -= RabyBoom.damage;
         Debug.Log($"Rayboom의 데미지로 인해{this.gameObject.name}의 HP가 {HP} 남았습니다.");

     }
 }
        
}

 

takeDamage로 하는 방법은 당장 떠오르지 않아, 폭발물 자체에서 거리를 계산하고 데미지를주는 방식으로 재편성.

 


damage = originalDamge / (distance / explosionRadius);
if (collider.gameObject != null)
{
   
   var damageCheck = collider.GetComponent<DamageCheck>();
   if (damageCheck != null)
   {
      damageCheck.HP -= damage;
      Debug.Log($"이름 : {collider.gameObject.name} 남은 HP :{damageCheck.HP}");
   }
   
}

 

작동 영상 :

 

 

*터지도록 의도하지 않아서 화살이 닿을 때마다 폭발데미지가 들어감

*DamageCheck가 가까이 있는 것, (1)이 붙은 것이 더 멀리 있음

 

그러나 이 방식은 Original 데미지보다 데미지가 커지는 문제가 있었음.

damage = originalDamge / (distance / explosionRadius);

을 고침

float forceFalloff = 1 - (distance / explosionRadius);
            damage = originalDamge * forceFalloff;

의도한 바대로 성공 !! 

 

이 방식을 응용하면, 거리별로 데미지가 줄어드는 것을 표현할 수 있다.

 

 

남은 시간은 어제 받은 디자인 패턴을 한 번 훑어보고, 기억이 나지 않는 코드들을 복습해야지.