폭탄 던지는 기능을 만들어보고 싶었음
근데 사실 하다보니 막히는 부분이 있어서 폭탄 떨구는 방식으로 타협함
폭탄은 만들면서 진짜 구리다고 생각 했는데 막상 유니티에서 사용해보니 대충 폭탄처럼 보이기는 해서 기분이 좋음

export 한 뒤 유니티에서 프리팹으로 만들어줬음
처음엔 폭발이라는 이펙트와 기능을 구분하지 못해서 파티클 시스템으로 하면 되는건가? 했는데, 이건 그냥 이펙트일 뿐이였음
파편에 맞으면 데미지를 입는 그런걸 원했음
그래서 BombFragments라는 파편을 만들었고, 그냥 시꺼먼 색상만 있으면 보는 재미가 없을 것 같아서 검정,주황,빨강 세가지로 했음

이제 스크립트를 만들어야함
각종 수치들은 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);
}
}
자 이제 스페이스바를 누르면 폭탄이 생성됨

.
.
.

RigidBody랑 Collider를 안넣어줬음
제대로 설정하고 다시 실행 해봤음

.
.
.
.

덜그덕거리고 마음에 들지 않음
여기서 고민이 들었음
1. 폭탄이 생성될 때 충돌을 무시하고 몇초 뒤 다시 활성화할까?
2. 유저가 폭탄 주변에 있으면 충돌을 무시하고 벗어나면 활성화 할까?
벌써복잡하고 하기 싫은 느낌이 팍팍듬
그래서 걍 주인공 뒤에 생성되도록 했음
생각해보니 이게 더 나은듯


다음에 해볼 것
1. 점프
2. 파편에 피해량 적용
3. 주인공 체력 적용
우와ㅜ재밌어보여요!!
형님형님 딱좋노 이기
레이어 설정해서 어떤 지정한 레이어끼리만 충돌하도록 할 수 있으니까 찾아보셈