김김김의 게임개발
  • 유니티 게임 개발 숙련 #1
    2023년 09월 18일 21시 25분 55초에 업로드 된 글입니다.
    작성자: noun06

    Scripatble Object

    • 데이터를 저장하고 관리하기 위한 도구로, 프로젝트 내에서 게임 오브젝트와 독립적인 에셋으로 데이터를 저장하고, 에디터에서 데이터를 쉽게 수정하고 생성할 수 있게 하는 특징을 가지고 있음.

     

    using UnityEngine;
    
    [CreateAssetMenu(fileName = "NewItem", menuName = "MyGame/Item")]
    public class ItemData : ScriptableObject
    {
        public string itemName;
        public int itemID;
        public Sprite itemIcon;
        public int itemValue;
    }
    • 위 코드는 아이템 데이터를 저장하는 Scriptable Object의 에시임.
    • [CreateAssetMenu] 속성은 Scriptable Object를 에디터 사엥서 생성할 때 사용되는 특성으로 이를 통해 에디터 메뉴를 만들 수 있음. (fileName: 새로 생성되는 파일 이름 / meuuName: 어떤 에디터 메뉴에 배치할지 정의.)
    • 이 스크립트를 기반으로 ItemData 에셋을 생성할 수 있으며 에디터 상에서 데이터를 설정 가능함.

     

    using UnityEngine;
    
    public class ItemController : MonoBehaviour
    {
        public ItemData item;
    
        private void Start()
        {
            Debug.Log("Item Name: " + item.itemName);
            Debug.Log("Item ID: " + item.itemID);
        }
    }
    • 이제 이 ItemData를 사용하여 게임 내에서 아이템 데이터를 사용하는 작업을 수행할 수 있으며 데이터를 효과적으로 관리할 수 있음.

     

    오브젝트 풀링

    • 게임 성능의 향상을 위해 사용되는 디자인 패턴으로 리소스를 동적으로 생성 및 삭제하는 대신 미리 생성된 객체들을 재활용하여 사용함. 
    • 게임이 시작될 때 필요한 수의 오브젝트를 생성하고 풀에 저장한 후, 게임 내에서 필요할 때 풀에서 가져옴. 필요한 오브젝트를 풀에서 가져오면 해당 오브젝트는 활성화 상태로 변경되고 게임에 표시됨. 오브젝트 사용이 끝나면 다시 풀로 반환되며 필요할 때 재사용됨.

     

    using UnityEngine;
    using UnityEngine.Pool;
    
    public class BulletPoolManager : MonoBehaviour
    {
        public GameObject bulletPrefab; // 풀링할 총알 프리팹
        public int poolSize = 10; // 풀 크기
    
        private ObjectPool<GameObject> bulletPool;
    
        private void Start()
        {
            // SimpleObjectPool을 사용하여 총알 오브젝트 풀 초기화
            bulletPool = new ObjectPool<GameObject>(() => Instantiate(bulletPrefab),
                                                          obj => obj.SetActive(false),
                                                          poolSize,
                                                          true,
                                                          true);
        }
    
        private void Update()
        {
            if (Input.GetButtonDown("Fire1"))
            {
                // 오브젝트 풀에서 총알 가져오기
                GameObject bullet = bulletPool.Get();
                bullet.transform.position = transform.position;
                bullet.SetActive(true);
    
                // 총알 사용 후 일정 시간 후에 다시 풀로 반환
                StartCoroutine(ReturnBulletToPool(bullet, 2.0f));
            }
        }
    
        private IEnumerator ReturnBulletToPool(GameObject bullet, float delay)
        {
            yield return new WaitForSeconds(delay);
    
            // 총알을 오브젝트 풀로 반환
            bulletPool.Release(bullet);
        }
    }
    •  총알 오브젝트의 풀링 예시 코드로 풀에서 총알을 가져와서 발사하고 일정 시간 후에 총알을 다시 풀로 반환함. 이를 통해 총알 오브젝트를 효율적으로 재사용할 수 있음. 
    댓글