ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unity]유니티 입문하기 6-16(적 생성용 프리팹)
    카테고리 없음 2023. 8. 30. 22:10

    이전 글에서는 상속 기능을 활용해 적군의 종류를 늘려보았습니다.

    이번에는 프리팹을 활용해, 적군의 생성을 관리하는 스크립트를 만들어봅시다.


    프리팹은 이전에 총알을 만들 때에도 사용한 기능인데요, 정확히 말하자면 프리팹은 원하는 오브젝트를 통째로 에셋에 저장한 뒤, 원할 때마다 꺼내쓸 수 있게 한 것입니다.

    적군 또한 같은 타입의 적이 여러 개체가 나오니, 프리팹으로 만들어 두면 관리하기 편하겠죠.

    예전에 투사체를 제작할 때 Prefabs 폴더는 이미 만들어두었으니, Enemy1과 Enemy2를 Prefabs 폴더에 드래그하여 프리팹으로 만들어줍시다.

    이제 이 프리팹들을 관리할 SpawnManager 스크립트를 작성해 봅시다.

     

    SpawnManager 스크립트는 Managers 폴더를 만들어 거기에 넣어두도록 하겠습니다.

    SpawnManager 오브젝트를 생성하고 스크립트를 부착하는 건 이제 다들 익숙한 과정일 테니 넘기도록 하죠.

     

    SpawnManager.cs 파일을 열어, Enemy1과 Enemy2를 생성하고 배치하는 SpawnEnemy() 메서드를 만들어 Start() 메서드에서 실행하도록 합니다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class SpawnManager : MonoBehaviour
    {
        public GameObject Enemy1Prefab;
        public GameObject Enemy2Prefab;
        
        void Start()
        {
            SpawnEnemy(Enemy1Prefab, new Vector3(1,2,0));
            SpawnEnemy(Enemy2Prefab, new Vector3(-1,2,0));
        }
    
        public void SpawnEnemy(GameObject prefab, Vector3 _position)
        {
            GameObject enemy = Instantiate(prefab);
            enemy.transform.position = _position;
        }
    }

     

    코드의 작성이 완료되었다면, 인스펙터 창에서 프리팹을 연결한 뒤, 게임을 시작해 봅시다.(투사체 제작할 때에도 중요하게 언급했지만, 계층 구조 창이 아니라 프로젝트 창에서 드래그하는 것 잊지 맙시다.)

     

    바꾸기 전과 같이 적군 오브젝트가 생성되어 좌우로 날아가기 시작했다면 성공입니다.

     

    그런데, 사소한 문제가 있습니다.

    지금에야 모든 적들이 동시에 생성되고 생성과 동시에 움직이기 시작하니 문제가 없지만, 적들이 시간차를 두고 생성된 뒤 동시에 움직이도록 하는 등의 변화를 주려고 하면, 객체의 Start()에 의해 Move() 메서드가 실행되는 방식은 그다지 바람직하지 않습니다.

    그렇다면 Move() 메서드 또한 SpawnManager에서 실행되어야 하는데, Enemy1과 Enemy2에 각각 접근해서 Move메서드를 호출하는 것은 역시나 비효율적이겠지요. 이를 해결하기 위해 저번에 배운 오버라이드를 활용해 봅시다.

     

    //Enemy.cs
    public virtual void Move(){    }
    
    //Enemy1.cs
    public override void Move()
    {
        GetComponent<Rigidbody2D>().AddForce(Vector2.right * 50);
    }
    
    //Enemy2.cs
    public override void Move()
    {
        GetComponent<Rigidbody2D>().AddForce(Vector2.left * 50);
    }

    Enemy에 virtual로 Move() 메서드를 추가해 주고, Enemy1과 Enemy2에 있던 Move에 override를 달아줍니다.

     

    Enemy 쪽 코드를 수정했으면 SpawnManager에서 이를 활용해야겠죠?

    public void SpawnEnemy(GameObject prefab, Vector3 _position)
    {
        GameObject enemy = Instantiate(prefab);
        enemy.transform.position = _position;
        enemy.GetComponent<Enemy>().Move();
    }

    우리가 오버라이드로 Enemy 클래스에 Move() 메서드를 추가해 준 결과, SpawnEnemy 메서드에 인수로 들어온 프리팹이 Enemy1이든 Enemy2이든 상관없이 Enemy에 접근하는 것으로 Move() 메서드를 실행할 수 있게 되었습니다.

     

    이 모든 과정을 문제없이 끝내고 실행해 보면, 여전히 잘 생성되어 날아가는 적들을 볼 수 있을 겁니다.

    코드에 여러 변형을 주어 서로 같은 타이밍에 생성되어 다른 타이밍에 날아가게 해 보는 등의 변형을 해보세요.

Designed by Tistory.