public void Fire()
{
GameObject bulletOBJ = bulletObjPool.MakeOBJ(bulletType);
if (bulletOBJ != null)
{
// 주의: 코루틴(자동 비활성화)이 정상 작동하려면 Init() 호출 전에 SetActive(true)가 되어 있어야 합니다.
bulletOBJ.SetActive(true);
// 최적화: GetComponent 대신 가비지(GC)를 만들지 않는 TryGetComponent 사용!
if (bulletOBJ.TryGetComponent(out Bullet bullet))
{
// Gun_Base에서 상속받은 damage, element, knockback과 playerTr을 총알로 넘겨줍니다.
bullet.Init(muzzle.position, muzzle.rotation, speed, damage, element, knockback, playerTr);
}
}
}
using System.Collections;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float damage;
public char element;
public float knockback;
public Transform playerTr;
public float speed = 20f;
private Transform tr;
private Rigidbody rb;
private TrailRenderer trail;
void Awake()
{
tr = GetComponent<Transform>();
rb = GetComponent<Rigidbody>();
trail = GetComponent<TrailRenderer>();
}
public void OnCollisionEnter(Collision collision)
{
// 벽이나 바닥에 닿았을 때
if (collision.gameObject.CompareTag("FLOOR") || collision.gameObject.CompareTag("WALL"))
{
gameObject.SetActive(false);
}
// 몬스터에 닿았을 때
else if (collision.gameObject.CompareTag("MONSTER"))
{
//TryGetComponent 적용: 가비지(GC) 발생 완벽 차단
if (collision.gameObject.TryGetComponent(out MonsterCtrl monster))
{
monster.OnDamage(damage, element, knockback, playerTr);
}
gameObject.SetActive(false); // 타격 후 비활성화
}
}
void OnDisable()//총알이 비활성화 될때 초기화
{
trail.Clear();
tr.SetPositionAndRotation(Vector3.zero, Quaternion.identity);
rb.Sleep();
}
//총이 총알을 쏠 때 정보를 직접 찔러넣어주는 Init 함수
public void Init(Vector3 position, Quaternion rotation, float speed, float weaponDamage, char weaponElement, float weaponKnockback, Transform playerTransform)
{
damage = weaponDamage;
element = weaponElement;
knockback = weaponKnockback;
playerTr = playerTransform;
transform.SetPositionAndRotation(position, rotation);
rb.linearVelocity = Vector3.zero;
rb.angularVelocity = Vector3.zero;
rb.AddForce(transform.forward * speed, ForceMode.Impulse);
StartCoroutine(DisableAfterDelay(5f));
}
private IEnumerator DisableAfterDelay(float delay)//총알 딜레이
{
yield return new WaitForSeconds(delay);
gameObject.SetActive(false);
}
}
위 스크립트는 필자가 총알을 생성해서 발사할때 생성자가 총알에 속성을 넣는 것을 스크립트로 구현한 것 입니다
필자가 처음에는 총알이 생성될때마다 총알에서 씬의 오브젝트를 검색하고 생성자에서 속성을 받아오게 했는데
그렇게하면 PC의 컴퓨팅 파워를 많이 잡아먹는 듯 합니다
의외로 자주 쓰이므로 글을 올립니다



이제 Bullet 오브젝트에 스크립트로 데미지나 총알 속성, 맞은 후 밀리는 넉백 등의 자료를 넣어줍니다
그뒤 public void Init()함수에 인수로 받아온 속성을 Bullet 오브젝트의 속성에 적용해줍니다
'유니티 스크립트' 카테고리의 다른 글
| 코루틴(Coroutine) (0) | 2024.12.24 |
|---|---|
| 델리게이트 실제 사용 (0) | 2024.12.24 |
| 델리기이트 예제 (0) | 2024.12.24 |
| 오브젝트를 포착하고 안의 함수를 호출(실행) (1) | 2024.12.24 |
| Resources 폴더에서 프리팹 사용 (0) | 2024.12.23 |