Game Client Lee Hwanguk 2023. 4. 17. 02:19

# 1 Stage Boss 제작 중이다. 보스 room 제작과 보스의 패턴을 제작해야겠다

 보스의 움직임을 어떻게 제어할지 고민중이다. 첫번째 방법은 waypoint를 정해놓고 순회하는 방법이 있고

 두번쨰 방법은 player를 향해 오면서 공격 패턴이 나오는 방법이다

 공격 패턴과 섞으려면 두번째 방법인 player를 향해 다가오는 방법으로 만들어야겠다. 

 

# 1 Stage Boss는 불공격을 할것 처럼 보이는 에셋을 구입했다. 애니매이션은 Attack, Death, Get Hit, Walk가 있고 다행히도 Bullet에셋에 Explosion에셋도 포함되어있다. 

 

#보스 패턴 제작에 필요한 부분을 크게 세개로 나눠서 생각했다. 

  *1. Boss Movement Pattern (플레이어의 방향으로 다가온다. 맵에 보스와 충돌 가능한 오브잭트를 배치하지않을 생각임으로 A*를 이용한 길찾기 알고리즘까지는 필요가 없을 듯 하다)

  *2. Boss Attack Pattern (오브잭트 풀링도 필요하겠다, 3가지 공격 패턴을 생각중이다)

   - pattern 1 - 보스의 위치에서 360도 로 bullet 발사

   - pattern 2 - 플레이어의 방향으로 유도탄 bullet을 발사

   - pattern 3 - 플레이어를 향해 빠른속도로 돌진하며 지나온 자리에는 장판공격(범위공격)을 한다

 *3. Boss Hit Pattern (보스가 유저에게 타격을 당하고 체력이 바닥나면 Death애니매이션)

 

#1. 보스 룸 제작, 보스의 움직임 구현

 

*타일맵은 일단 오브잭트가 없는 간단한 형태로 만들어 보았다. (오브잭트들이 타일맵 밖으로 나가지 않게 바운더리에 콜라이더를 붙여서 경계선만 만들어 줬다)

*order in layer가 중요하다. 팀원들과 회의로 레이어를 이미 정해놨다.
*타일맵으로 쓰일 오브잭트에 컴포넌트 셋팅

*보스의 움직임을 구현해봤다. 플레이어 방향으로 움직이게 하는 것은 rigidbody2D를 이용하여 이동하였고 플레이어가 반대 방향에 있다면 sprite를 flip시켰다. 콜라이더를 디테일하게 조정해놓았더니 콜라이더도 똑같이 flip이 되어야 하는데 콜라이더에는 flip 기능이 없었다. 새로운 방법이 필요했다. 자식 오브잭트로 콜라이더를 두개를 만들고 sprite가 반전될때 콜라이더의 기능을 on/off해줬다.

 

 

 

*script

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

public class FireWorm : MonoBehaviour
{
    private enum eState
    {
        Idle, //0
        Walk, //1
        Attack, //2
        Death, //3
        GetHit, //4
    }
    public Transform player;
    public float bossMoveSpeed = 2.5f;
    private Rigidbody2D rb;
    private SpriteRenderer sprite;

    //Collider Flip
    public Collider2D originalCollider;
    public Collider2D flippedCollider;

    //animator(State)
    private Animator anim;

    private void Start()
    {
        this.rb=this.GetComponent<Rigidbody2D>();
        this.sprite=this.GetComponent<SpriteRenderer>();
        this.anim=this.GetComponent<Animator>();

        this.anim.SetInteger("state", (int)eState.Idle); 
    }
    private void FixedUpdate()
    {
        Vector2 direction=this.player.position-this.transform.position;

        if(direction.magnitude>1f)
        {
            direction.Normalize();
        }

        this.rb.velocity = direction*this.bossMoveSpeed;

        if(this.rb.velocity.x!=0f)
        {
            Debug.Log("Walk");
            this.anim.SetInteger("stat",(int)eState.Walk);
        }

        if(this.player.position.x<this.transform.position.x)
        {
            this.sprite.flipX= true;
            this.originalCollider.enabled = false;
            this.flippedCollider.enabled = true;
        }
        else
        {
            this.sprite.flipX= false;
            this.originalCollider.enabled = true;
            this.flippedCollider.enabled = false;
        }

    }

    //Test
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.CompareTag("Player"))
        {
            Debug.Log("Player");
        }
    }
}

 

* 세가지 공격패턴을 만들면 되겠다. 처음엔 단순하게 만들 생각이었지만 앞으로 추가될 3마리의 보스를 생각하면 재활용 해야하는 패턴이 생길 것 같다. 전략 패턴을 공부하고 적용이 필요하다.