개발일지/TIL(Today I Learned)

24-10-25

프린스 알리 2024. 10. 25.

내일배움캠프 Node.js 사전캠프 16일차

1. ZEP에서 이루어진 팀단위 JavaScript 스터디

(1) 스터디 준비

먼저 이전 시간에 작성했던 코드가 가진 약점들을 수정하고 보완하는 시간을 가졌다.

1) 장애물의 y좌표를 더 정밀하게 조정

public TGround tground;
public TObstacle tobstacle;

public void SpawnObstacle(Vector3 playerPosition)
{
    Vector3 randomPosition = new Vector3(UnityEngine.Random.Range(5f, 10f), -playerPosition.y + tground.transform.position.y + tground.gameObject.GetComponent<Renderer>().bounds.size.y / 2 + tobstacle.gameObject.GetComponent<Renderer>().bounds.size.y / 2, 0);
    // gameObject.GetComponent<Renderer>().bounds.size.y : 게임 오브젝트의 실제 높이(메시의 높이)를 구한다.

    Spawn(ObstaclePrefab, playerPosition + randomPosition);
}

 

2) 시야에서 벗어날 시 장애물 제거

public class TObstacle : MonoBehaviour
{
    public Vector2 addForce;
    private void OnTriggerStay2D(Collider2D other)
    {
        bool isPlayer = other.CompareTag("Player");

        if (isPlayer == false) return;

        other.GetComponent<TPlayer>().ObstacleAddForceAction(addForce);
    }

    private void OnBecameInvisible()
    {
        Destroy(gameObject);
    }
}

 

(2) 스터디 진행 과정

오늘의 목표 : 보스를 잡아서 게임을 클리어하자!

 

public float moveSpeed;

private void Update()
{
    transform.Translate(Vector2.right * moveSpeed * Time.deltaTime);
}

보스가 플레이어의 좌측에서 moveSpeed만큼의 속력으로 다가오고 있다. 플레이어는 랜덤하게 생성되는 장애물을 뛰어넘으며 총을 쏠 수 있는데, 아직 보스를 물리치는 건 구현이 되어있지 않은 상황이다.

보스의 체력을 100이라 가정하고 총알의 콜라이더와 보스의 콜라이더가 충돌할 때마다 보스의 체력이 깎이도록 코드를 작성해 보았다.

    public int hp = 100; // 보스의 체력

    private void OnTriggerEnter2D(Collider2D other)
    {
        bool isBullet = other.CompareTag("Bullet");
        bool isPlayer = other.CompareTag("Player");

        if (isBullet)
        {
            Destroy(other.gameObject); // 보스와 부딪히면 총알 오브젝트 파괴
            hp--; // 충돌할 때 보스의 체력은 1씩 깎인다.
            Debug.Log($"보스의 남은 체력 : {hp}"); // 보스 체력 표시

            if (hp <= 0) // 보스의 체력이 0이하가 되는 순간 게임 클리어 화면 등장
            {
                Destroy(this.gameObject);
                Debug.Log("보스를 처치했습니다!");
                UnityEngine.SceneManagement.SceneManager.LoadScene("GameClear");
            }
        }

        if (isPlayer) // 보스와 충돌한 게 플레이어라면
        {
            Destroy(other.gameObject); // 플레이어가 사망
        }        
    }

 

여기서 발생하는 문제점

 

죽거나 게임클리어 이후에 Q를 눌러서 재시작을 하면 TestScene을 불러오는 과정에서 오류가 발생한다. 시야에서 사라질 때 장애물을 지웠던 게 문제가 된 듯해서 해당 코드를 주석처리 해보았지만 또다른 오류가 발생했다.

 

장애물 생성은 플레이어의 위치를 기반하고 있는데, 플레이어가 생성되기 전이라 오류가 나는 걸까?

(3) 팀원들과 인사이트 공유하기

팀장님으로부터 해결 방법에 대한 힌트를 들을 수 있었다. 해당 오류는 씬을 전환할 때 오브젝트를 모두 초기화해주는 방식으로 해결이 가능하다고 하다. 가장 일차원적인 방식은 GameObject.Find()메서드를 사용해서 하나하나 초기화를 해주는 것이고 또다른 방법은 오브젝트 풀링을 이용하는 것이다. 오브젝트를 그룹화하여 초기화하는 방식인데 아래 링크에서 자세히 설명되어 있다.

 

[Unity3D] Programming - 오브젝트 풀링 기법 구현하기 :: 베르의 프로그래밍 노트

 

[Unity3D] Programming - 오브젝트 풀링 기법 구현하기

Programming - 오브젝트 풀링 기법 작성 기준 버전 :: 2019.2 프로그래밍에서 오브젝트를 생성하거나 파괴하는 작업은 꽤나 무거운 작업으로 분류된다. 오브젝트 생성은 메모리를 새로 할당하고 리소

wergia.tistory.com

 

오늘을 끝으로 우리 2팀의 자그마한 게임 개발 프로젝트는 마침표를 찍었다. 마지막 날까지 함께 으쌰으쌰 돕고 응원했던 팀원들께 감사하다. 함께 많은 걸 배우고 익힐 수 있어 무척 즐거웠다. 비록 팀은 달라지겠지만, 그래도 언젠간 다시 만날 테니까! 28일부터 시작될 본캠프에서 다들 건강한 모습으로 만날 수 있기를. 화이팅~!

'개발일지 > TIL(Today I Learned)' 카테고리의 다른 글

2024-10-29  (0) 2024.10.29
2024-10-28  (1) 2024.10.28
24-10-24  (2) 2024.10.24
24-10-23  (1) 2024.10.23
24-10-22  (1) 2024.10.22

댓글