Scriptable Object로 각 오브젝트 특징 구현

devKyoun·2024년 10월 31일
0

Unity

목록 보기
21/27

🧐 공통적으로 가져야 하는 속성

소환 할 오브젝트들은 각자 공통된 속성을 가진다!

그 중 Barrel 오브젝트인데 예시로 보자면 오브젝트 고유의 ID, 차 속력 저하 수치, 차에 데미지 들어가는 수치 이 세가지가 공통적으로 가져야 하는 속성이다.

총 이렇게 4가지 있다.

근데 왜 스크립터블 오브젝트를 사용 하느냐

의문점이 들어 영상 서칭을 해보고 Chat gpt에게 부탁을 해본 결과.

유튜브 베르 Scriptable Object 영상

두 가지점이 좋다는 것이 확실해보인다.


👍 각 오브젝트 프리팹에 적용을 하자

각 프리팹은 Spawn Manager을 통해 생성이 된다.
이 프리팹에 이에 맞는 Obstacle Data를 부착하고 이 데이터를 이용하는 Obstacle Manager를 만들어준다.


⚙️ Obstacle Manager

public class ObstacleManager : MonoBehaviour
{
    private ObjectPoolingManager poolingManager;
    public void Initialization(ObjectPoolingManager poolingManager)
    {
        this.poolingManager = poolingManager;
    }


    public Obstacle obstacleData;


    private Transform vanTransform;
    private float disappearOffSetZ = 4;


    private void Awake()
    {
        if (vanTransform == null && GameObject.FindWithTag("Player").TryGetComponent<Transform>(out Transform _vanTransform))
        {
            this.vanTransform = _vanTransform;
        }
    }

    private void Update()
    {
        // 장애물로부터 플레이어가 일정거리 멀어지면
        if (vanTransform != null && vanTransform.position.z - transform.position.z > disappearOffSetZ)
        {
            poolingManager.DeActivateObject(obstacleData.Id, this.gameObject);
        }
    }

    
    private void OnTriggerEnter(Collider other)
    {
        // 장애물이 플레이어와 충돌
        if (other.gameObject.CompareTag("Player"))
        {

            if (other.TryGetComponent<VanController>(out VanController vanController))
            {

                // 장애물에 맞는 이펙트 활성화
                poolingManager.ActivateEffect(obstacleData.Id + 4, transform);

                // 플레이어에게 영향
                vanController.ObjectCollision(obstacleData);

            }


            // 충돌한 오브젝트는 비활성화
            poolingManager.DeActivateObject(obstacleData.Id, this.gameObject);
        }
    }
}

장애물에 맞는 이펙트 활성화 그리고 플레이어에게 영향을 줄때 Obstacle Data를 사용해 주고 있다.


⚠️ 염두에 두어야 할 점

프로젝트 내에서 새로 생성이 안된다는 건 당연(?) 할 듯 하다
반면에 보안상의 문제는 생각 할 필요가 있다.
빌드할때 업데이트할때 편하다는 장점이 있으나 프로젝트 내에 파일 형태로 저장이 되는 것이기 때문에
사용자가 접근하기 쉽다는 점을 간과해서는 안된다.
이 게임은 싱글 플레이기 때문에 상관은 없으나 멀티 플레이 게임을 하는 경우 중요한 데이터는 스크립터블 오브젝트로 만들기 전에 고려해보도록 하자

profile
Game Developer

0개의 댓글