지금 까지 만든 보스 캐릭터로 최종 보스 스테이지를 만들겠습니다.

스테이지에 입장하면 방 안쪽에 보스가 있다 입장후 나올수 없다

보스 캐릭터 뒤에 열쇠가 있는 보물상자가 있다.

반 안쪽에 문이 있다.

보스를 쓸어트리고 보물상자에서 키를 얻어야 방을 나가고 클리어 됩니다.

보스는 무한히 총을 쏠수 있고 플레이어는 돌아 다니면서 화살을 줏어야 보충할 수 있습니다.

화살의 위치는 랜덤으로 몇군데 배치하겠습니다.

최종 보스용씬은 BossStage라는 이름으로 씬을 만들고 BuildSetting에 등록합니다. 타일맵으로 맵을 만듭니다.

BossStage.unity
0.12MB

예제를 다운로드하고 로딩하면 SoundManager에러가 나는데 일단 씬뷰에서 지워줍니다. 전 Cavas도 에러가 났는데 교재에서 다운받아 UIManager에 깔아줬습니다.

Canvas.prefab
0.04MB

 

게임 스테이지로 설정하기 위해 지금까지 만들었던 프리팹을 배치합니다.

Player : 프리팹을 추가하면 됩니다.

RoomManager : UIManager의 Retry Scene Name에 다시 시도할 때 불러올 씬 이름을 설정합니다.

Canvas : Main Camera를 설정합니다.

EventSystem :  +>UI>Event System

 

아이템을 자동으로 배치하는 기능 만들기

이제 아이템(화살)을 자동으로 배치하는 기능을 추가합니다.

화살의 수를 항상 확인한다

화살의 수가 0이 되면 화살을 랜덤위치에 배치합니다.

 

오브젝트 발생기

계측뷰 +>CreateEmpty를 클릭해 빈게임오브젝트를 만들오 Boss폴더에 이름을 ObjGen으로 하고 칼라아이콘을 추가합니다.

 

ObjectGenPoint 스크립트를 만들기

ObjectGenPoint.cs
0.00MB

ObjGen에 어태치합니다. 씬에 배치할 위치와 프리팹을 지정해 오브젝트를 만드는 스크립트입니다.

변수

public GameObject objPrefab;    //발생 시킬 Prefab 데이터

ObjectCreate() 메소드

현재 위치에 프리팹으로 게임오브젝트를 배치합니다. 외부에서 호출합니다.

public void ObjectCreate()  {
    Vector3 pos = new Vector3(transform.position.x,transform.position.y,-1.0f);
    //Prefab으로 GameObject 만들기
    Instantiate(objPrefab, pos, Quaternion.identity);

Item 폴더의 Arrow 프리팹을 끌어다 Obj Prefab에 지정합니다.

ObjGen을 Boss폴더로 끌어다 프리팹으로 만듭니다.

프리팹을 끌어다 씬뷰에 10개정도 추가합니다. 화살이 생성될 위치입니다.

 

ObjectGenManager스크립트

ObjectGenManager.cs
0.00MB

다음으로 배치된 ObjectGenPoint를 관리하고 화살의 수를 감시해 화살의 갯수가 0이 되면 배치하는 기능입니다.

완성후 하이라키뷰의 RoomManager에 어태치합니다. 프리팹이 아닌 씬에 배치된 오브젝트에 어태치해야 해당 씬에서만 스크립트가 동작합니다.

 

변수

씬에 배치된 objGen들의 참조를 담을 배열입니다.

ObjectGenPoint[] objGens;   //씬에 배치되어있는 ObjectGenPoint 배열

Start()

ObjectGenPoint 타입을 모두 찾아 objGens에 전달합니다.

void Start() {
    objGens = GameObject.FindObjectsOfType<ObjectGenPoint>();
}

Update()  

씬에서 Item을 찾아 화살이 있다면 리턴하고 없고 플레이어도 화살을 가지고 있지 않다면 임의의 위치에 화살을 배치합니다.

void Update()   {
    //ItemData 찾기
    ItemData[] items = GameObject.FindObjectsOfType<ItemData>();
    //반복문으로 화살 찾기
    for (int i = 0; i < items.Length; i++)  {
        ItemData item = items[i];
        if (item.type == ItemType.arrow) {
            return; //화살이 있으면 아무것도 하지 않고 메서드에서 빠져나가기
        }
    }
    //플레이어가 존재하는지와 화살의 수 확인
    GameObject player = GameObject.FindGameObjectWithTag("Player");
    if (ItemKeeper.hasArrows == 0 && player != null) {
        //화살 개수가 0이고 플레이어가 존재하면
        //배열의 개수 범위 안에서 난수 생성
        int index = Random.Range(0, objGens.Length);
        ObjectGenPoint objgen = objGens[index];
        objgen.ObjectCreate();   //아이템 배치
    }
}

 

+ Recent posts