폭탄 던지는 기능을 만들어보고 싶었음

근데 사실 하다보니 막히는 부분이 있어서 폭탄 떨구는 방식으로 타협


폭탄은 만들면서 진짜 구리다고 생각 했는데 막상 유니티에서 사용해보니 대충 폭탄처럼 보이기는 해서 기분이 좋음

ac5939a70001b942813e33669735c1bcc2a977c21c773585f0dabed5e42e074dc2d2542d4fa4fd2bcba114c2d1971e9e083fd2859da529e36d7b2e8761f3bafe8f3302fbe56de938633fb95d94a3b2


export 한 뒤 유니티에서 프리팹으로 만들어줬음

처음엔 폭발이라는 이펙트와 기능을 구분하지 못해서 파티클 시스템으로 하면 되는건가? 했는데, 이건 그냥 이펙트일 뿐이였음


파편에 맞으면 데미지를 입는 그런걸 원했음

그래서 BombFragments라는 파편을 만들었고, 그냥 시꺼먼 색상만 있으면 보는 재미가 없을 것 같아서 검정,주황,빨강 세가지로 했음

ac5939a70001b942813e33669735c1bcc2a977c21c773585f0dabed5e42e074dc2d2542d4fa4fd2bcba114c2d1971e9e083fd2859da529e36d7b298361f6b4fe161bcf4e4f921d7a78a170e433ed


이제 스크립트를 만들어야함

각종 수치들은 public 으로 수정하기 쉽도록 했고 아까 만든 큐브(파편)을 랜덤으로 선택해서 랜덤위치에 생성되도록 했음.


폭발하는 기능은 RigidBody에 AddExplosionForce라는게 있어서 생각보다 쉽게 만들었음

using UnityEngine;

public class Bomb : MonoBehaviour
{
public float timer = 1f; // 폭탄 타이머
public GameObject[] cubePrefabs; // 여러가지 큐브 파편 색상을 위한 프리팹 배열
public int cubeCount = 10;
public float explosionRadius = 0.5f; // 폭탄 파편 생성 범위
public float explosionForce = 20f; // 폭발력
public float upwardModifier = 0.1f; // 폭발 시 위쪽으로 밀어내는 힘

public float bombFragmentsDestroyTimer = 5f; // 파편 삭제 타이머

private void Update()
{

timer -= Time.deltaTime;
if (timer <= 0f)
{
Explode();
}
}

private void Explode()
{

for (int i = 0; i < cubeCount; i++)
{

// 파편 색상 랜덤 선택
int randomIndex = Random.Range(0, cubePrefabs.Length);
GameObject selectedCubePrefab = cubePrefabs[randomIndex];

// 파편 생성 범위 지정
Vector3 randomPos = GetRandomPointInHemisphere(transform.position, explosionRadius);
GameObject cube = Instantiate(selectedCubePrefab, randomPos, Random.rotation);

// 큐브에 물리적용
Rigidbody rb = cube.AddComponent<Rigidbody>();

// 폭발 효과 적용
rb.AddExplosionForce(explosionForce, transform.position, explosionRadius, upwardModifier, ForceMode.Impulse);
Destroy(cube, bombFragmentsDestroyTimer);
}

// 폭탄 삭제
Destroy(gameObject);
}

// 반구 범위에서 랜덤 위치 반환 (Y >= 1)
private Vector3 GetRandomPointInHemisphere(Vector3 origin, float radius)
{
// 반구 형태로 생성 범위 지정
Vector3 randomDirection = new Vector3(
Random.Range(-radius, radius), // X
Random.Range(1f, radius), // Y
Random.Range(-radius, radius) // Z
).normalized;

return origin + randomDirection * Random.Range(0f, radius);
}
}



이제 폭발 관련된건 다 만들었으니 폭탄 생성부분임

아래 rb.AddForce 이 부분은 자연스러움(?)을 위해 넣어봤음


안넣으니까 정지상태에서 부자연스럽게 서있는 느낌이였음

private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
DropBomb();
} }
private void DropBomb()
{


GameObject bomb = Instantiate(bombPrefab, bombSpawnPoint.position, bombSpawnPoint.rotation);

Rigidbody rb = bomb.GetComponent<Rigidbody>();

if (rb != null)
{
rb.AddForce(bombSpawnPoint.forward * throwForce, ForceMode.Impulse);
} }


자 이제 스페이스바를 누르면 폭탄이 생성됨

ac5921a7001bb940a63e32459734e5bcc82bc4cd4e393de82b0fc57cfe5b36fa9fae1a800f2208f17092789041ffdb3d10563e56c249ceb301802b3851dd779601cfd51bea8c1163f27a09de



.

.

.



ac5936a70017b942843e33669737ecbcc0c31b35e00844cbed0e3e6a6fc919e5abbe75355d1e431f918bac

RigidBody랑 Collider를 안넣어줬음



제대로 설정하고 다시 실행 해봤음

ac5933a70017b940a13e32559734f7bc833764ea8acaee60bbed477a4da88d5ca643d5feb089170a59c4bd39b4df058994a2d5820ea67905a46ed87bb61fc70866572150de16199aa184d6bb79875b104f72e3


.

.

.

.


ac5939a70001b940a13e32449734f7bccb3b09fc3a440cbf3237701897d46331cdadc63209273c2fc48a870ef4

덜그덕거리고 마음에 들지 않음


여기서 고민이 들었음
1. 폭탄이 생성될 때 충돌을 무시하고 몇초 뒤 다시 활성화할까?
2. 유저가 폭탄 주변에 있으면 충돌을 무시하고 벗어나면 활성화 할까?


벌써복잡하고 하기 싫은 느낌이 팍팍듬



그래서 걍 주인공 뒤에 생성되도록 했음
생각해보니 이게 더 나은듯

ac593ba70013b942823e337b9735c8bc0d3a1f6cacce50bd55a9b5d27e072172a0b845eb0c9de1877a168c8940ad7f



ac5922a70013b940a53e32599734e5bc8f1de430db8814529df4e3bfe97f68aa06550190b5044b8b








다음에 해볼 것
1. 점프

2. 파편에 피해량 적용

3. 주인공 체력 적용