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;
의도한 바대로 성공 !!
이 방식을 응용하면, 거리별로 데미지가 줄어드는 것을 표현할 수 있다.
남은 시간은 어제 받은 디자인 패턴을 한 번 훑어보고, 기억이 나지 않는 코드들을 복습해야지.