유니티 스크립트

오브젝트를 생성할때 인수를 넣어주기

ruripanda 2026. 4. 9. 18:29
 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 오브젝트의 속성에 적용해줍니다