본문 바로가기
게임 제작/뉴진스 파워퍼프걸 팬게임

뉴진스 파워퍼프걸 팬게임 제작 (15)_ Stage1_보스 패턴(2) (New jeans Powerpuff girls fangame)

by 나는반딧불 2023. 9. 2.
반응형

뉴진스 파워퍼프걸 팬게임 제작 (15)_ Stage1_보스 패턴(2)

저번 글에서는 보스의 공격 패턴을 구현했다면 

 

뉴진스 파워퍼프걸 팬게임 제작 (14)_ Stage1_보스 패턴(1) (New jeans Powerpuff girls fangame)

뉴진스 파워퍼프걸 팬게임 제작 (14)_ Stage1_보스 패턴(1) 이번 글에서는 Stage1의 보스인 거대 토끼의 등장과 두 가지 종류의 공격패턴을 구현할 계획이다. 이번글의 목표 Wave3 등장 구현 거대 토끼

culturelevel.tistory.com

이번 글에서는 보스의 체력 처리와 사망 이벤트 등을 제작할 계획이다.

 

이번 글의 목표

보스 피격 이벤트 구현

보스 사망 이벤트 구현

응원봉 아이템 오브젝트 구현

 

 

1. 보스 피격 이벤트 구현

그동안은 적이 플레이어의 공격에 맞을 때 피격 이미지를 생성하는 이벤트를 발동시켰다면

이번에는 맞을 때마다 보스 캐릭터가 빨간색으로 잠깐씩 깜빡이는 이벤트를 구현할 생각이다.

 

1.1 boss1_hpCtrl 스크립트 작성

public float hp = 5;
private float time = 0;
private bool effectBool = false;

원래는 기존의 enemy_hpCtrl 스크립트에 보스 조건을 걸어서 

몇개의 코드만 추가하려고 했는데 작성하다보니 생각보다 들어가는게 많아져서

그냥 새로 스크립트를 작성했다.

변수는 일단 hp 변수와 타이머용 변수, 이벤트 활성화용 변수 3개만 선언했다.

private void OnTriggerEnter2D(Collider2D other)
    {
       
        if (other.tag == "BULLET")  //플레이어 총알에 맞으면 hp 1감소
        {
            effectBool = true; 
            hp--;

        }
        else if (other.tag == "BULLET_R") //플레이어 스킬에 맞으면 hp 3감소
        {
            effectBool = true;
            hp -= 3;

        }
    }

일반 공격에 맞으면 hp 1감소, 스킬 공격에 맞으면 hp 3감소

그리고 어떤 공격이든 맞으면 effectBool을 true로 바뀌게 작성했다.

 

 void Update()
    {
        if (effectBool)
        {
            Timer();
        }
    }

effectBool이 활성화가 되면 Update문에서 TImer 함수를 실행한다.

 

void Timer()
    {
        gameObject.GetComponent<SpriteRenderer>().color = new Color(1, 0.8f, 0.8f, 1);
        time += Time.deltaTime;

        if (time > 0.1f)
        {
            gameObject.GetComponent<SpriteRenderer>().color = new Color(1, 1, 1, 1);
            time = 0;
            effectBool = false;
        }
    }

 gameObject.GetComponent<SpriteRenderer>().color로 spriterenderer에 접근해서

빨갛게 만들어 줬다가 일정시간이 지나면 원래대로 돌아오게 작성했다.

 

 

1.2 스크립트 및 물리 충돌 컴포넌트 추가

다른 적 캐릭터에 했던것과 동일하게 물리충돌 컴포넌트를 추가하고

방금 만든 스크립트를 추가해주었다.

 

 

 

1.3 결과물

플레이어의 공격을 맞을 때마다 빨간색으로 깜빡이는 모습으로 확인할 수 있다.

 

 

 

 

2. 보스 사망 이벤트 구현

일반 적 캐릭터들은 hp가 0이되면 그냥 삭제되었지만

보스인 거대 토끼는 사망시 애니메이션 이벤트를 보여주게 만들 계획이다.

 

 

2.1 Animation Clip 제작

먼전 window 메뉴에서 Animation-Animation을 선택해 Animaton 창을 연다.

 

애니메이션을 적용시킬 오브젝트를 클릭하고 Animation창에서 Create 버튼을 눌러준다.

 

 

그러면 Create New Animation 창이 생성되는데 파일이름을 boss1_die로 적고 저장 버튼을 눌러준다.

 

위 단계를 모두 끝내면 위와 같은 화면을 볼 수 있게 된다.

저 프레임 구간 안엔서 각 프레임마다 캐릭터의 상태를 변화시켜 애니메이션을 만들 수 있다.

 

좌측에 있는 Add Property를 누르면 변화시킬 상태들을 추가할 수 있다.

나는 Position과 Rotation을 선택해 추가해 주었다.

 

첫 프레임과 마지막 프레임에 오브젝트의 위치, 회전 상태가 설정되었다.

이제 좌측 상단에 있는 빨간색 녹화 버튼을 눌러준다.

 

녹화 버튼을 누르면 프레임이 빨갛게 변하면서 녹화 상태로 변하게 된다.

이때 특정 프레임을 지정하고 오브젝트를 변화시키면 해당 프레임에 오브젝트의 현재 설정이 저장되게 된다.

 

 오브젝트를 앞뒤로 회전시키면서 화면 아래로 떨어지도록 

특정 프레임마다 위치값과 회전값을 설정해주었다.

 

 

이제 녹화 버튼을 다시 눌러 녹화를 종료하고

재생 버튼을 누르면 위와같이 애니메이션이 실행되는 모습을 확인할 수 있다.

 

 

2.2 Animator Control 설정

애니메이션 클립이 완성되었으면 클립을 저장한 폴더에 가서 클립을 선택하고

Loop Time을 체크 해제해서 애니메이션이 한번만 실행되게 만든다.

 

그리고 Animator 창에 들어가면 아까 만들었던 애니메이션 클립 만들때 자동으로 같이 만들어진 

Animator Control이 떠있는 것을 확인할 수 있다.

만약 떠있지 않다면 [오브젝트 이름(Animator Control)]을 찾아서 클릭하면된다.

 

빈화면에 마우스 우클릭으로 메뉴창을 연 뒤  Create State-Empty를 생성한다.

 

그러면 해당 위치에 New State가 생성된다.

아무것도 안하는 상태이기 때문에 알기쉽게 이름을 idle로 바꿔준다.

 

그리고 주황색 애니메이션 클립(boss1_die)를 선택하고 delete키를 눌러 삭제해준다.

그러면 위와같이 자동으로 Entry화살표가 idle State로 향하게 된다.

 

이제 애니메이션 폴더에서 boss1_die애니메이션을 드래그해 다시 animator 창에 집어 넣는다.

 

그후 idle을 마우스 우클릭해 Make Transition을 선택한다.

 

그러면 idle에서 시작되는 하얀색 화살표가 생성되는데 그 상태로 boss1_die를 클릭하게 되면

idle에서 boss1_die로 향하는 화살표가 연결되게 된다.

 

이제 idle에서 boss1_die로 애니메이션을 변경시킬 조건을 만들 차례이다.

우측 상단의 Parameters탭을 선택하고 +버튼을 누른 뒤 Bool을 선택한다.

 

그러면 해당 Animator에 bool변수가 생성된다.

변수 이름은 BOSSDIE로 바꿔주었다.

 

조건에 쓰일 변수가 만들어졌으니 다시 idle-boss1_die사이의 화살표를 클릭하고

우측에 뜨는 inspector창의 Condition 메뉴의 +버튼을 클릭한다.

 

해당 메뉴에선 애니메이션이 변경되기 위한 조건을 설정할 수 있다.

나는 BOSSDIE라는 변수가 true값이 되어야지만 idle 애니메이션 상태에서

boss1_die 애니메이션 상태로 바뀔 수 있도록 설정했다.

 

마지막으로 boss1_die를 선택하고 애니메이션 재생 speed를 0.3으로 변경시켜주었다.

 

 

2.3 boss1_hpCtrl 스크립트 추가 작성

 

 public GameObject rightwall;  //중간에 있는 이동 방지 투명벽
 public GameObject item_key;  //응원봉 아이템
 private bool onetime = true;
 private Animator anim; //보스 사망 애니메이션

사망 후 이벤트에 필요한 변수들을 추가로 선언해 주었다.

 

 

void Start()
    {
        anim = GetComponent<Animator>();
    }

Start 함수에서는 오브젝트에 있는 Animator을 불러와 anim에 대입해 주었다.

 

 

void Update()
    {
        if (hp <= 0)
        {
            this.gameObject.GetComponent<Boss1Ctrl>().EndBossAction(); //움직임 종료
            rightwall.SetActive(false);//중간 벽 해제
            anim.SetBool("BOSSDIE",true);  //죽는 애니메이션 실행
            Invoke("Spawn_item_key", 5f); //5초뒤에 키 생성
      
    }

Update 함수에선 보스 캐릭터의 hp가 0이하로 되면

Boss1Ctrl 함수를 호출해 공격 행동을 중지시키고,

투명벽을 해지하고, 방금 만들었던 애니메이션을 발동시키게 작성했다.

그리고 보스가 사망하고 몇초 뒤에 아이템이 생성되도록 만들었다.

 

void Spawn_item_key()
    {
        if (onetime)//한번만 실행 체크
        {
            Instantiate(item_key, transform.position, transform.rotation);//키 아이템 생성
            onetime = false;
        }
    }

함수가 호출되면 보스 캐릭터의 위치에서 딱 한번 아이템(응원봉)이 생성되도록 작성했다.

 

 public void EndBossAction()
    {
        ActionStart = false;
        Attackmod = 0;
    }

 그리고 방금 Update에서 호출한  Boss1Ctrl 함수는 아직 만든적이 없기에

Boss1Ctrl스크립트에 추가로 함수를 만들어주었다.

함수가 호출되면 보스가 idle상태로 변하고 더이상 공격을 하지 않게 된다.

 

 

 

 

 

 

3. 응원봉 아이템 오브젝트 제작

보스 사망시 응원봉 아이템이 아래에서 위로 올라오고

아이템을 먹으면 다음 씬을 불러오도록 만들 계획이다.

 

 

3.1 응원봉 오브젝트 배치 및설정

먼저 응원봉 Sprite를 배치하고 그 하위에 빛나는 효과 Sprite를 배치한다.

 

빛나는 효과의 layer를 -3으로 설정해 응원봉보다 뒤로 보이게 만들어 준다.

응원봉 sprite에는 물리충돌 컴포넌트를 추가한뒤 태그를 ITEM_KEY로 설정해주고,

빛나는 효과 sprite에는 예전에 만든 회전 스크립트를 추가해주었다.

 

 

 

3.2 item_key 스크립트 작성

    private Transform tr;
    public float goaly; //목표 지점 y좌표
    public float speed; //처음 위로 이동할때 속도
    private bool startup = true; 

    public float movespeed = 1f;  //반복 이동 속도
    public float movelimit = 1f; //반복 이동 범위
    public bool upmove = true;
    private float y;

처음 위로 이동할 때와 도착하고 나서 반복 이동을 할때에 필요한 변수들을 선언해주었다.

 

 

void Start()
    {
        tr = GetComponent<Transform>();
    }

Start함수에서는 tr에 오브젝트의 Transform을 대입해 초기화해준다.

 

 

    void Update()
    {
        if (startup)
        {
            if (tr.position.y < goaly) // 목적 위치에 도달하기 전까지 이동
            {
                tr.Translate(0, speed * Time.deltaTime, 0);
            }
            else
            {
                startup = false;
            }
        }
        else
        {
            updown();
        }
    }

 Update함수에서는 먼저 오브젝트가 목적지까지 올라가게 만든 뒤

목적지에 도달하면 updown 함수를 실행하게 작성했다.

 

 void updown()
    {
        if (upmove)      //위로 이동이 참일때
        {
            if (tr.transform.position.y < goaly+movelimit)  //높이제한보다 객체 y좌표가 낮다면
            {
                tr.Translate(Vector2.up * movespeed * Time.deltaTime);//위로 이동
            }
            else
            {
                upmove = false;
            }
        }
        else if (!upmove)      //위로 이동이 거짓일때
        {
            if (tr.transform.position.y > goaly - movelimit)  //높이제한보다 객체 y좌표가 높다면
            {
                tr.Translate(Vector2.down * movespeed * Time.deltaTime);//아래로이동
            }
            else
            {
                upmove = true;
            }
        }

    }

updown 함수는 이전에 만들었던 스크립트를 그대로 가져와 조건값만 살짝 변경해주었다.

 

 

 

3.3 Player_hpcrtl 스크립트 추가 작성

 public int score_key = 10000;
 
 private void OnTriggerEnter2D(Collider2D other)
    {
      else if (other.tag == "ITEM_KEY")
        {
            scoreCount += score_key; 
            getSound.Play();
            Destroy(other.gameObject);
            keyCount_text.text = "1";  //key 아이템 개수 1로 변경
            GameObject.Find("WaveCtrl").GetComponent<WaveCtrl>().NextWave();//다음씬 등장
        }
    }

ITEM_KEY 오브젝트와 충돌하면 10000점의 점수를 획득하고

다음 씬을 불러내는함수를 호출하도록 작성해 주었다.

 

 

 

3.4 스크립트 추가 및 설정 후 프리팹화

작성한 스크립트를 추가하고 테스틀 하면서 적절한 속도값과 이동 제한값을 설정한뒤

프리팹화 해주었다.

 

 

 

 

4. 거대 토끼 오브젝트에 Boss1_hpCtrl 스크립트 추가

두번쨰로 만든 Boss1_hpCtrl스크립트를 추가해주고 

빈칸에 투명벽과 방금 만든 응원봉 프리팹을 넣어준다.

hp는 테스트할때는 10으로 설정했지만

게임이 완성될때는 100정도로 변경할 계획이다.

 

 

5. 결과물

플레이어의 공격에 빨간색으로 깜빡이고

사망하면 아래로 추락하는 애니메이션이 발동된다.

그 후 올라오는 응원봉 아이템을 먹으면

바로 다음 씬이 진행되는 것을 확인할 수 있다.

 

 

 

이번 글을 끝으로 길었던 보스 전투 제작이 마무리되었다.

다음 글에서는  Stage1의 마지막 Wave를 제작할 계획이다.

 

 

 

 

 

 

 

 

반응형