반갑다
TIL을 개인과제 1일차만 써놓고 바로 후기로 돌아오는 기가 막힌 정신머리.
근데 어쩔 수가 없다. 나는 늘 시간에 쫓겨 살기 때문에...
개인과제 후기 겸 팀과제 1일차까지 다 작성하려 한다.
Fox In The Forest2
내일배움캠프 심화주차 개인과제
🖥️ 프로젝트 소개
탐험가 'Foxy'가 숲을 탐험하며 몬스터를 피해 숲의 비밀을 찾아내는 게임
장르 : 혼합 (인터렉티브 무비+포인트 앤 클릭 + RPG)
⚙️개발 기간
24.02.19 ~ 24.02.22
개발 환경
Visual Studio 2022
Unity 2022.3.2f
📌주요 기능
필수 요구 사항
선택 요구 사항
게임 요약
[↑↑스타트씬] 스타트씬부터 스크립트를 적용했다.
대충 플레이어가 열심히 숲을 뛰어가는 연출을 하기 위해서다.
뒷배경이 움직이는데, 배경에 움직이는 스크립트를 먹여 생동감있는 오프닝 연출을 했다!
[↑↑메인씬] 게임은 거의 메인씬에서 아이템, 몬스터, 함정과 상호작용 하는대로 씬이 넘어간다.
메인씬에서 플레이어는 이동, 점프, (구현은 못했지만 공격)등을 할 수 있고,
[피격시] 몬스터에 닿았을 때 피격 애니메이션도 연출을 했다.
[↑↑단서1]
[↑↑단서2]
[↑↑단서3&엔딩분기점]
맵 곳곳에 있는 아이템을 클릭하면 대화창이 연출되도록 했다.
사실 말이 창이지 씬 이동으로 구현해서 새로운 씬으로 이동하도록 연출한거다.
아무리 머리를 쥐어짜내도 이 방법밖에 떠오르지가 않아서... 그래... 내 최선이었다.
엔딩 분기점을 플레이어의 선택에 따라 엔딩이 달라지는건데, 누가봐도 빨간버튼 수상하죠?
[↑↑베스트엔딩씬]플레이어가 상자를 열지 않는 선택을 하면 살아남는다. 반대로 상자를 열게 되면...
누가봐도 수상한 상자이기 때문에, 플레이어는 죽을 수 밖에 없다.
이 외에도 다른 엔딩으로는 노말엔딩이 있는데
[↑↑워스트엔딩씬]
[↑↑노말엔딩씬]플레이어의 체력이 다 닳거나, 함정에 빠지면 바로 즉사다. 노말 엔딩으로 이어진다.
그래서 왜 상자를 열면 죽는가?
줄거리 스포일러(해석?)
맵 곳곳에 있는 플레이어의 독백을 보면
사람의 뼈가 있는 것을 본 플레이어는 자신이 들어온 숲이 상당히 위험한 곳임을 인지한다.
또한 누군가가 남겨놓은 기록으로 인해 그 무시무시한 상자에 대한 정보를 얻는다.
이런 과정을 거쳐 플레이어가 마주한 최종 선택지에 있는 상자에 대한 선택이 최종 엔딩 결정으로 이어진다.
그 상자는 결국
플레이어 이전의 탐험가가 발견하고 보물이 있을거라 생각하고 열어보지만 > 저주받은 상자이기 때문에
상자를 연 순간부터 천천히 죽어가고 > 죽어 가는 동안 나중에 숲을 탐험할 플레이어를 위해 작성한 기록이다.
이후 숲에 처음 들어온 플레이어는 그 선대 탐험가의 뼈와 기록 등을 발견할 수 있는 것이다.
급조한 줄거리지만 만족스럽군...
후기
우선 아쉬운 점이 너무 많다. 기존에 생각했던 기능을 구현하는데 또 다른 방법이 있지 않을까 싶어 연구하다가 찾은 raycast라는 방법이 있다.
//RayCast>> 오브젝트 검색을 위해 Ray를 쏘는 방식, 바닥감지
if(rigid.velocity.y < 0)
{
Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0));
RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask("Platform"));
if (rayHit.collider != null)
{
if (rayHit.distance < 0.6f)
anim.SetBool("isJumping", false);
플레이어 오브젝트 한가운데에서 바닥으로 보이지 않는 레이저를 쏘고, 그 레이저가 바닥을 감지한 경우에만 점프를 누를 수 있다.
게다가 원래 배운대로라면 플레이어 조작을 Input System으로 구현해야했는데, 더 간단하게 할 수 있는게 있지 않을까 생각하다가
void Update()
{
if (Input.GetButtonUp("Horizontal"))
{
//키 뗐을 때
rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
}
//방향전환
if (Input.GetButton("Horizontal"))
spriteRenderer.flipX = Input.GetAxisRaw("Horizontal") == -1;
//애니메이션 전환(서있기<>걷기)
if (Mathf.Abs(rigid.velocity.x) < 0.48) // 속도가 얼마나 떨어졌을 때 모션이 바뀌는지
anim.SetBool("isWalking", false);
else
anim.SetBool("isWalking", true);
//애니메이션 전환 - 점프
if (Input.GetKeyDown(KeyCode.Space) && !anim.GetBool("isJumping"))
{
rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
anim.SetBool("isJumping", true);
}
//애니메이션 전환-공격 : q키를 눌렀을 때 어택 애니메이션이 실행되고 있지 않다면 트리거 진행
if (Input.GetKeyDown(KeyCode.Q) && !anim.GetCurrentAnimatorStateInfo(0).IsName("Attack"))
{
anim.SetTrigger("attack");
gameObject.layer = 12;
Invoke("OnAttack", 1);
}
}
거의..약간...주먹구구식으로..코딩을 하게 되었다.
이 외에도 점프 모션이 이상하다거나, 공격이 먹히지 않는다던가, 하는 자잘한 버그들도 있었고...
더 구현하고 싶은 기능들이 많았다...
예를들어.. 플레이어의 공격 기능, 몬스터 체력바, 랜덤 맵 생성, 효과음, 퍼즐, 보스 전투씬 등
여러가지를 더 구현하고 싶었고 혼합 장르 보다는 RPG적 요소를 더 많이 넣어보고 싶었는데, 플레이어 이동과 애니메이션 구현 하나에 꽂혀서 너무 많은 시간을 뺏겼기에 엔딩도 못낼 것 같아 몇 가지 비교적 간단한 기능을 더 추가해서 부랴부랴 끝맺음을 지었다...흑흑...
그래서!!
이번주차 팀과제는 내 개인과제를 베이스로 또 또 FOX IN THE FOREST를 재구성 하기로 했다!
내일의 TIL을 기대하시라..