[유니티 프로젝트] 로그라이크 허브 마을 (기억의 성소) 제작 .1
현재 진행중인 프로젝트의 허브 (마을이자 인게임 이름 "성소") 의 1차 제작이 완료되었다.
여기서 성소는 유저가 던전을 들어가기 전 거쳐야만 하는 곳이자 영구적인 강화 및 장비 구매가 가능한 지역이다.
원래는 규모가 있는 마을로 기획을 하였으나 시스템을 기획하는 과정에서 많은 부분이 잘려나가게 되어 주요 NPC 가 3명으로 줄어들고 이에따른 맵의 규모를 줄일 필요가 생겨 현재처럼 실내 (성소는 성당이 모티브) 규모가 되었다.
주요 NPC 는 세명으로 수녀와 상인, 그리고 던전입장을 도와주는 기사단장으로 구성되어있다.
그외의 인터렉션이 가능한 빌보드 ( 이전 게임에서 얻은 골드의 기록을 다시 볼수 있는 기능을 하는 오브젝트) 가 있다.
그외에 연출적인 부분이지만 별다른 큰 역할을 하지 않는 NPC 세마리가 존재하며 해당 NPC들은 게임의 디테일적인 부분이라 간단한 대사 정도만 추가될수 있을듯 하다.
맵의 전체적인 모양은 아래와 같다.
각 npc의 위치를 보면 맵의 최 상단에 수녀 NPC의 공간이 존재한다.
맵의 우측에는 이전 골드 획득량 기록을 보여주는 빌보드가 있다.
맵의 좌측의 상인 NPC 에게서 장비를 구매한 뒤 던전으로 향할수 있다.
맵의 하단에는 기사단장 NPC에게서 랜덤 무기를 부여받아 붉은색 포탈을 이용해 던전으로 향할수 있다.
현재 개선해야 할 사항은 아래와 같다.
- sorting layer 개선 , 현재 맵의 구조가 오밀조밀하다보니 sorting layer가 굉장히 많이 필요했다. 일반 적인 던전들에 비해 오브젝트도 많고 유저가 가려져야 하는 부분 또는 유저가 오버레이 되어야 하는 부분등이 굉장히 많아 아직 수정이 필요하다.
- 맵의 기능을 하지 않는 NPC들중 일반 기사 3명은 자유롭게 움직이는데 이러한 느낌이 좀 일괄적이라는 생각이 들어 좀더 자연스럽게 움직일수 있도록 코드 수정이 필요하다
- NPC들에게 다가갈시 팝업하는 UI의 제작이 필요할듯 하다.
그외의 자유롭게 움직는 기사들의 코드는 아래와 같다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KnightsController : MonoBehaviour
{
private Animator anim;
private Rigidbody2D rb;
private float moveSpeed = 1f; // NPC 이동 속도
private float moveTime = 0.5f; // NPC 이동 시간
private bool isMoving = false;
private void Awake()
{
this.anim = GetComponent<Animator>();
this.rb = GetComponent<Rigidbody2D>();
this.StartCoroutine(this.MoveNPC());
}
private IEnumerator MoveNPC()
{
while (true)
{
if (!this.isMoving)
{
Vector2 direction = Vector2.zero;
this.isMoving = true;
var ran = Random.Range(1, 3);
if(ran == 1)
{
direction = new Vector2(Random.Range(-1f, 1f),0).normalized;
if (direction.x < 0)
this.transform.Rotate(0, 0, 0);
else if (direction.x > 0)
this.transform.Rotate(0, -180, 0);
}
else
{
direction = new Vector2(0, Random.Range(-1f, 1f)).normalized;
}
float elapsedTime = 0;
while (elapsedTime < moveTime)
{
this.anim.SetInteger("state", 1);
this.transform.Translate(direction * this.moveSpeed * Time.deltaTime);
elapsedTime += Time.deltaTime;
yield return null;
}
this.anim.SetInteger("state", 0);
yield return new WaitForSeconds(1f);
this.isMoving = false;
}
yield return null;
}
}
}
코루틴을 이용하여 깨어남과 동시에 랜덤한 방향으로 (대각선은 어색한 부분이많아 빼고 4방향으로만 움직일수 있게 하였다.) 움직이게 만드는 코드이다.
움직이는 방향에 따라 로테이션도 바꾸게 하였으나 살짝 어색한 부분도 있어 이부분도 디테일하게 수정해야 할듯 하다.