본문 바로가기

유니티/뱀서라이크

뱀서라이크 따라하기 - 소환레벨 적용하기 2번째

저번 글에 이어서 직렬화를 완성시켜보도록 하겠습니다.

먼지 직렬화란, 개체를 저장 또는 전송하기 위해서 변환을 하는 과정을 말합니다. 

[System.Serializable]
public class SpawnData{
    public int spriteType;
    public float spawnTime;
    public int health;
}

간단히도, 대괄호안에 System.Serializable만 추가를 해주시면 직렬화를 완성할 수 있습니다. 

이 과정을 거치고 나면 이제 스폰 데이터를 인스팩터창에서 확인하실 수 있습니다.

 

그 뒤 게임창에서 각 몬스터들의 스팩을 조정해줄 수 있습니다.

또한 코드를 이상태로 계속 진행할 경우에는 list rangeout오류가 뜨게 되는데, 이 오류도 고쳐보도록 하겠습니다.

먼저 spawner에 가서 레벨과 관련된 부분을 고쳐줍니다.

void Update()
    {
        timer += Time.deltaTime;

        level =Mathf.Min( Mathf.FloorToInt(GameManager.instance.gameTime / 10f),spawnData.Length-1);
        if (timer > spawnData[level].spawnTime){
            timer = 0f;
            Spawn();
        }
       
        void Spawn(){
            GameObject enemy = GameManager.instance.pool.Get(0);
            enemy.transform.position = spawnPoint[Random.Range(1,spawnPoint.Length)].position;
            enemy.GetComponent<Enemy>().Init(spawnData[level]);
        }
    }
}

mathf에 있는 min을 이용해서, 스폰 데이터에 넣어놓은 만큼만 갈 수 있게 만들었습니다. 이제 유니티에서 다시 게임을 실행해보면 레인지아웃이 나타나지 않는것을 알 수 있습니다. 

 

이제 레벨에 따른 소환시스템은 완성했습니다! 이어서 근접무기를 구현해보도록 하겠습니다

먼저 태그 bullet을 만들어줍니다.

그 뒤 미리 만들어져있는 asset에서 삽모양 에셋을 끌어다 넣어주고 다음과 같은 코드를 짜줍니다.

    void OnTriggerEnter2D(Collider2D collision){
        if(!collision.CompareTag("Bullet"))
            return;
       
        health -= collision.GetComponent<Bullet>().damage;

        if(health>0){

        }
        else{
            Dead();
        }
    }

    void Dead(){
        gameObject.SetActive(false);  
    }

enemy 스크립트의 아래쪽에 다음과 같은 코드를 추가해줍니다! 적과충돌시에 발생하도록 하고, 무기의 데미지만큼 적의 데미지가 깎이도록 만들어 줄 것 입니다. 체력이 0보다 큰 상태이라면 충돌 효과를 넣어줄 예정이고, 충돌 시 체력이 0보다 같거나 작다면 죽도록 만들겠습니다. 

 

DEAD함수의 경우에는 오브젝트가 비활성화되게 하였습니다. 

 

저같은 경우는 bullet 태그를 넣지 않아서 작동이 되지 않았었으니 유의해주세요!

 

그 뒤 삽이 자동으로 생성되도록 바꿔보도록 하겠습니다.

먼저 유니티에서 만들어놓은 bullet 오브젝트들을 지워줍니다. 이미 프레팹 폴더에 있으니 걱정하실 필요 없습니다.

 

그 뒤 weapon이라는 코드를 새로 짜줍니다. 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Weapon : MonoBehaviour
{
    public int id;
    public int prefabId;
    public float damage;
    public int count;
    public float speed;

    void Start(){
        Init();
    }
    void Update(){
         switch(id){
            case 0:
                transform.Rotate(Vector3.forward*speed*Time.deltaTime);
                break;
            default:
                break;
        }
    }

    public void Init(){
       switch(id){
            case 0:
                speed -=150;
                Batch();
                break;
            default:
                break;
        }
    }
    void Batch(){
        for (int index = 0; index < count; index++){
            Transform bullet = GameManager.instance.pool.Get(prefabId).transform;
            bullet.parent = transform;
            bullet.GetComponent<Bullet>().Init(damage, -1);
        }
    }
}

 

젤 먼저, 여러 변수들을 만들어줍니다. 처음 시작했을 때는 Init 함수를 시작할 수 있게 해줍니다. Init 함수에선 switch 문을 짜서 id에 따라 다른 반응을 하도록 만들어줍니다. 저 아이디는 추후에 무기의 종류가 될 예정입니다. 

Batch함수는 무기를 만들어서 놓아주는 역할을 하게 될 것인데요, 위에서 만든 count 변수가 무기의 숫자가 될것입니다. 

count만큼 for문을 돌려서 무기가 배치되도록 할것이고, Init에서 -1이 되어있는 부분은 근접무기이기에 관통되는 적의 숫자를 -1로 해놓아 무한대로 관통된다는것을 표현해놓았습니다.

 

이제 무기 배치 뒷부분은 다음글에서 이어서 해보도록 하겠습니다!

 

이 글은 아래의 영상을 따라하는 과정을 기록하기 위한 글입니다. 궁금하신 점이 있다면 아래의 영상을 참고 바랍니다!

https://www.youtube.com/watch?v=HPJVVcRKwn0&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=10&ab_channel=%EA%B3%A8%EB%93%9C%EB%A9%94%ED%83%88