일상

SDHS GAME JAM을 참여하며

백인성(GGM) 2024. 8. 23. 12:27

들어가기 앞서 SDHS는 서울 디지텍 고등학교를 뜻하는 것이며 글에서는 편하게 디지텍고라고 말하겠다.

 

 

때는 6월 17일

 

겜마고와 오랜 연을 가지고 있는 학교인 디지텍고에서 진행하는 게임잼에 초대를 받게 되었다.

그리하여 평소 친하게 지내던 친구 2명과 같이 신청을 하였고 디지텍고에 가게 되었다.

 

디지텍고에서 진행하는 게임잼은 무박 2일로 진행하는 게임잼으로 주제가 정해진 시점부터 24시간 동안 개발을 진행하는 게임잼이다.

 

 

그리고...

 

 

결전의 날 7월 20일

 

아침 일찍 도착하여 팀원 중 1명과 만났다.

 

 

당시 평균 기온이 30도였음에도 불구하고 겉옷을 착용한 팀원은 노트북을 들고 다니며 시원한 곳을 찾아다니고 있었다.

 

이후 다른 팀원과도 만난 후 디지텍에 입장하게 되었다. 

 

디지텍고를 들어가자마자 들은 생각은 "학교 같지 않다."였다.

부정적인 표현이 아닌 긍정적인 표현으로

학교내부가 학원처럼 되어있고 모던해 보였다.

 

이후 간단한 소개를 마친 후...

 

주제발표 시간

 

이번 게임잼의 주제는 제로였다.

하지만 우리 팀은 기획 없이 개발만 3명이었기에

 

간단한 보스러시 게임을 기획하고 바로 개발에 들어갔다.

 

301f048f-6107-40b4-9a52-586b08a4daad_디지텍_게임잼.pdf
0.86MB

(매우 간단하게 작성한 기획서)

 

나는 게임의 기믹과 UI 맵 등의 작업을 진행했다.

 

게임의 기믹중 하나 민 바닥 플로어 제작에 들어갔다.

잠깐 여기서 만든 150줄이 넘는 필자의 코드를 보여주겠다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Random = UnityEngine.Random;

public class Floor : MonoBehaviour
{
    [SerializeField] private int key;
    [SerializeField] private AudioClip _audioClip;
    private float _waitTime;
    private Transform[,] _blockArr = new Transform[16, 25];
    private MeshRenderer[,] _meshRendererArr = new MeshRenderer[16, 25];
    private Collider[,] _colliderArr = new Collider[16, 25];
    private float _defualtY;

    private void Start()
    {
        FloorManager.Instance.AddFloor(key, this);
    }

    private void Awake()
    {
        int num = 0;
        for (int i = 1; i < 16; ++i) //1~15
        {
            for (int j = 1; j < 25; ++j) //1~24
            {
                _blockArr[i, j] = transform.GetChild(num++);
                _meshRendererArr[i, j] = _blockArr[i, j].GetComponentInChildren<MeshRenderer>();
                _colliderArr[i, j] = _meshRendererArr[i, j].GetComponent<Collider>();
            }
        }

        _defualtY = _blockArr[1, 1].position.y;
        _waitTime = FloorManager.Instance.waitTime;
    }

    public void FloorUp(int y)
    {
        StartCoroutine(FloorCoroutine(y));
    }

    private IEnumerator FloorCoroutine(int y)
    {
        var Wait = new WaitForSeconds(_waitTime);
        for (int i = 1; i < 16; i++)
        {
            for (int j = 1; j < 25; j++)
            {
                Transform trm = _blockArr[i, j];

                trm.DOLocalMoveY(trm.position.y + y, 0.2f).OnComplete(() =>
                {
                    trm.DOLocalMoveY(trm.position.y - y, 0.2f);
                }).SetEase(Ease.InOutBack);
            }

            SoundSpawn();
            yield return Wait;
        }
    }

    public void Horizonfloorup(int y)
    {
        StartCoroutine(horizonfloorupcoroutine(y));
    }

    private IEnumerator horizonfloorupcoroutine(int y)
    {
        var wait = new WaitForSeconds(_waitTime);
        int num = 1;
        for (int k = 1; k < 25; ++k)
        {
            for (int i = 1; i < 16; i++)
            {
                for (int j = 1; j < 25; j++)
                {
                    if (j != num)
                        continue;
                    Transform trm = _blockArr[i, j];

                    trm.DOLocalMoveY(trm.position.y + y, 0.2f).OnComplete(() =>
                    {
                        trm.DOLocalMoveY(trm.position.y - y, 0.2f);
                    }).SetEase(Ease.InOutBack);
                }
            }

            SoundSpawn();
            num++;
            yield return wait;
        }
    }

    public void ReSetYPos()
    {
        for (int i = 1; i < 16; ++i) //1~15
        {
            for (int j = 1; j < 25; ++j) //1~24
            {
                _blockArr[i, j].DOLocalMoveY(_defualtY, 0.2f);
            }
        }
    }

    public void DissolveFloor(bool value)
    {
        StartCoroutine(DissolveCoroutine(value));
    }

    private IEnumerator DissolveCoroutine(bool value)
    {
        var wait = new WaitForSeconds(_waitTime);
        int num = 1;
        for (int k = 1; k < 25; ++k)
        {
            for (int i = 1; i < 16; i++)
            {
                for (int j = 1; j < 25; j++)
                {
                    if (j != num)
                        continue;
                    if (!value)
                    {
                        _meshRendererArr[i, j].material.DOFloat(1, "_DissolveAmount", 0.25f)
                            .OnComplete(() => _colliderArr[i, j].enabled = false);
                    }
                    else
                        _meshRendererArr[i, j].material.DOFloat(0, "_DissolveAmount", 0.25f)
                            .OnComplete(() => _colliderArr[i, j].enabled = true);
                }
            }

            num++;
            yield return wait;
        }
    }


    public void RandomFloorUp(int y)
    {
        StartCoroutine(RandomFloorUpCoroutine(y));
    }

    private IEnumerator RandomFloorUpCoroutine(int y)
    {
        var Wait = new WaitForSeconds(2);
        for (int i = 0; i < 5; ++i)
        {
            for (int j = 0; j < 10; ++j)
            {
                _blockArr[Random.Range(1, 16), Random.Range(1, 25)].DOLocalMoveY(y, 0.4f);
            }

            SoundSpawn();
            yield return Wait;
        }

        yield return Wait;
        ReSetYPos();
    }

    private void SoundSpawn()
    {
        PoolManager.SpawnFromPool("SoundObj", transform.position).GetComponent<SoundObj>().SetAudio(_audioClip);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            FloorManager.Instance.PlayerInGroundKey = key;
        }
    }
}

 

이 코드는 매우 길어 보여 무언가 있어 보이지만 매우 간단한 코드이다.

 

모든 바닥을 관리하는 매니저 스크립트에 자신을 넣어주고 

매니저에서 선택된 바닥은 함수를 호출하는데 함수의 이름대로 바닥은 움직이게 된다.

 

예를 들어 Horizonfloorup() 함수를 실행하게 된다면

말 그대로 가로방향의 바닥이 위로 솟아오르게 된다. 

 

이런 식으로 바닥이 보스의 패턴에 따라 다르게 움직이게 만들었다.

 

그리고 점심시간이 되어 도시락을 주었다 하지만. 

배가 고프지 않아 디지텍에서 제공하는 라면을 먹었다.

 

라면은 매우 맛이 있었다.

 

라면을 먹고 난 이후 선생님께서 졸린 친구들을 위해 에너지 드링크를 사 오셨다.

 

그렇게 드링크를 마시고 개발을 하다 보니 바닥 기믹이 완성되었다.

 

 

기믹을 다 제작한 후 저녁이 되었다.

저녁도 라면을 먹으면 큰일 날 것 같아서 저녁은 도시락으로 해결했다.

(반찬은 3가지가 있었는데 그중 2개만 받았다.)

도시락은 매우 맛있었다.

 

바닥 기믹을 다 제작한 이후에는 타이틀 화면과 화면의 UI를 제작하기 시작했다.

제작하던 중 선생님이 또다시 에너지 드링크를 사 오셨다.

 

드링크를 마시고 기분이 좋아져서 잠깐 동안 장난도 처봤다.

6개까지 쌓고 무너져 내려서 다시 일에 집중했다.

 

 

그렇게 계속 집중을 하고 나니 학교 측에서 치킨도 준비해 주었다.

 

 

치킨을 마지막으로 아무것도 먹지 않았다.

 

새벽감성으로 집중을 하다 보니 마감까지 2시간 정도 남았었다.

그런데...

 

여기서 엄청 큰 문제가 터지게 된다.

같은 팀원이

깃 포크 실수로 메인을 터쳐버린 것이다.

 

복구를 하귀 위해 다 같이 노력해 보았지만 아쉽게도 복구가 되지 않아 

우리는 제출할 때 5시간 전꺼를 제출하게 되었다.

 

https://drive.google.com/file/d/1euaaX7OjYvi3cUGAMJ8CuTLZPb97W2n_/view?usp=sharing

 

DigitechGamejam.zip

 

drive.google.com

이 링크는 우리가 제출한 빌드본이다.

 

이렇게 되어

아쉽게도 수상은 하지 않았지만 다양한 경험을 할 수 있었던 의미 있던 24시간이었던 것 같다.

 

 

'일상' 카테고리의 다른 글

정보처리 기능사 실기 - 예상 문제  (0) 2024.08.17
집중 안 되는 밤 (2024-03-10)  (2) 2024.03.10