TIL_231204

Z_제트·2023년 12월 4일
0

TODAY I LEARNED

목록 보기
26/88
post-thumbnail

to do_오늘 할 일

  • 알고리즘 문제풀기
  • 팀과제 ing

retro_오늘 한 일(회고)

팀 과제 진행상황

나의 새로운 담당 임무 is
보스 라운드(디자인, 이미지, 패턴 etc) 만들기 !

저번 주말에 보스의 위치와 크기, HP bar 등
Scene 의 대략적인 틀 만들기를 진행하고,
오늘은 특정 HP 마다 랜덤 벽돌을 생성하는 것(보스의 방해스킬)을 작업했다.

금방 작업이 완료될 줄 알고 기분좋게 시작했는데,
중간중간 조원분들의 오류를 같이 해결하고
(도움이 되었을지는 모르겠지만😅 오류를 해결하는 과정에서 또 새롭게 배우는 것이 있어서 무조건 동참 필수 !)
아이디어 회의도 계속 하면서
추가로 오늘은 스탠다드반 수업도 있는 날이라
(이렇게 적고 보니 핑계 나열처럼 보이긴 하는데 기분탓입니다 하하하 ^.^)

시간이 너무나도 빠르게 흘러갔다..!

그리고 쉽게 완성되리라 예상했던 벽돌 랜덤 생성 파트에서
코드를 작성하려고 하는데 오늘따라 이상하게 뇌가 제대로 작동하지 않는 기분이었다. (물론 아는 것이 많이 없어서 그렇기도 하지만 !)

지금은 처음보단 확실히 조건문 & 반복문 친구들과 어색한 사이를 넘어 조오오오금이라도 친해진 것 같긴한데 아직 응용력이 부족한 것 같다.

그래도 함께하는 소중한 조원분들이 있기에
도움 찬스를 사용하여 구현 성공한 벽돌 랜덤 생성 !


NormalBoss.cs ↓

using UnityEngine;

public class NormalBoss : MonoBehaviour
{
    float bossMovementX = 0.05f; // Boss 의 x 축 움직임
    public int bossMaxHP = 10; // Boss 의 Max HP
    int damageFromBall = 0; // 공의 공격력

    public NormalBossBrickMaker nbBrickMaker;


    // Start is called before the first frame update
    void Start()
    {
        Time.timeScale = 1.0f;
    }

    // Update is called once per frame
    void Update()
    {
        if (transform.position.x > 2.6f) // Boss 가 오른쪽 화면 끝까지 가면 왼쪽으로 방향 전환
        {
            bossMovementX = -0.05f;
        }

        if (transform.position.x < -2.6f) // Boss 가 왼쪽 화면 끝까지 가면 오른쪽으로 방향 전환
        {
            bossMovementX = 0.05f;
        }
    }

    void FixedUpdate()
    {
        transform.position += new Vector3(bossMovementX, 0, 0);
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Ball") // boss 와 Ball 이 만나면 Boss 가 데미지 입음.
        {
            damageFromBall += 1;
            Debug.Log("damageFromBall~~");

            // HPfront 컴포넌트 찾기
            GameObject varOfHPfront = GameObject.Find("HPfront");

            varOfHPfront.transform.localScale = new Vector3(1 - ((float)damageFromBall / bossMaxHP), 1.0f, 1.0f); // 나눌 때 자료형 주의 !

            // RandomBrickSpawn
            nbBrickMaker.RandomBrickSpawn(bossMaxHP - damageFromBall);

            if (damageFromBall >= bossMaxHP) // boss 가 죽었을 때 - 시간을 0 으로 세팅해서 HP bar 변화와 boss 움직임 일어나지 않도록 세팅.
            {
                BossDead();
            }
        }
    }

    void BossDead()
    {
        // Boss 움직임 Stop 은 FixedUpdate() 에서 구현.

        // Boss 죽었을 때 dead(붉은 색) 으로 췌인지
        gameObject.transform.Find("alive").gameObject.SetActive(false);
        gameObject.transform.Find("dead").gameObject.SetActive(true);

        // 시간 0 으로 설정.
        Time.timeScale = 0.0f;
    }


    // TODO 특정 HP 마다 item 드랍하도록
}

OnCollisionEnter2D() 에서 공과 충돌이 일어났을 때 벽돌 랜덤 생성 메서드인 RandomBrickSpawn() 이 작동하도록 구현했다.

RandomBrickSpawn() 에 대한 세부 내용은 아래 스크립트에 적혀있다.

NormalBossBrickMaker.cs

using UnityEngine;

public class NormalBossBrickMaker : MonoBehaviour
{

    public GameObject brick;

    public void RandomBrickSpawn(int bossMaxHP) // 매개변수로 boss 의 HP
    {
        if (bossMaxHP == 7)
        {
            for (int i = 0; i < 5; i++)
            {

                if (i % 2 == 1)
                {
                    GameObject newBrick = Instantiate(brick);
                    newBrick.transform.parent = GameObject.Find("Bricks").transform;
                    float x = (i % 5) * 1.2f - 2.4f;
                    float y = 0.5f;
                    newBrick.transform.position = new Vector3(x, y, 0);
                }
            }
        }
        else if (bossMaxHP == 5)
        {
            for (int i = 0; i < 5; i++)
            {

                if (!(i % 2 == 1))
                {
                    GameObject newBrick = Instantiate(brick);
                    newBrick.transform.parent = GameObject.Find("Bricks").transform;
                    float x = (i % 5) * 1.2f - 2.4f;
                    float y = 0.5f;
                    newBrick.transform.position = new Vector3(x, y, 0);
                }
            }
        } 
        else if (bossMaxHP == 3)
        {
            for (int i = 0; i < 5; i++)
            {
                GameObject newBrick = Instantiate(brick);
                newBrick.transform.parent = GameObject.Find("Bricks").transform;

                float x = (i % 5) * 1.2f - 2.4f;
                float y = 0.0f;
                newBrick.transform.position = new Vector3(x, y, 0);
            }
        }
    }
}

코드를 작성하는 과정에서 몸소 체험하며 배운 것들은 다음과 같다.

  • A 라는 클래스에 있는 메서드를 사용하기 위해 B 라는 클래스에서 A 클래스를 선언하는 법
  • for 문의 반복 담당인 i 를 하나의 조건문으로 또 감싸서 통제할 수 있는 아이디어
  • 나누기 연산자 사용할 때 나눌 변수들의 자료형 체크(e.g. int 에서 int 나누기, int 에서 float 나누기 etc)

전에 배운 적도 있겠지만,
직접 맞닥뜨리며 배우게 된 이 부분들은 정말 잊지 못할 내용이다.
(내 기억력 파이팅 ~^_^)


추가로 기억할 것 :

  • unity editor 에서 script 이름 바꿀 때 script 안에 class 이름도 맞춰서 수정해주기 !

추가 공부할 것s :

  • 유니티 스크립트 라이프 사이클 (e.g. 이벤트 함수의 실행 순서)
  • 스탠다드반에서 배운 내용 복습(delegate, class, interface etc.)

profile
trying to make the world a better place with a cool head and warm heart

0개의 댓글