수료자들이 떠난 스타터스... 익숙한 듯 익숙하지 않은 내 거 같은 내 거 아닌.. 그런 기분 ㅠ
빈자리가 쓸쓸했지만.. 그렇다고 남은 분들의 열정이 식지는 않았다.
주위에서 느끼는 불타는 열정들에 힘입어 나역시 힘을 내야겠다고 생각이 들었고, 12주차 교육 역시 무사히 마쳤다!
12주에는 로그인 씬과 미니맵 등의 기능을 구현하였다.
아직 서버와 연결은 하지 못해서, 완벽하게 데이터베이스를 통한 로그인은 아니지만, 적어도 클라이언트 상의 로그인 기능을 멋스럽게 구현했다는 것은 나름 뿌듯한 일이었다.
한편, 잠시 멈춰있던 스터디는 3조 남은 분들과 함께 다시 시작했다.
이번주는 최대공약수, 최소공배수 (유클리드 호제법)과 관련한 알고리즘 문제들을 찾아서 풀었고, 서로의 코드를 리뷰하며 틀리거나 이해가 안 되었던 부분들을 모두 해결할 수 있었다.
2주 토이 프로젝트는 다시 새로운 게임을 기획하는 시간을 가졌다.
이번에는 타이쿤류 게임으로, 꽃집 경영에 관한 게임을 만들기로 하였다.
여하튼, 추석 연휴 전으로 짧았던 12주. 그럼에도 적지 않게 배웠던 것들을 아래 다시 풀어써보겠다.
Starters 12주차 수업 - '로그인 및 미니맵 구현'
로그인 씬 제작
우리가 하는 대부분의 멀티플레이 게임에 적용되는 공통점 중에 가장 기본이 되는 것이 있다면, 그게 바로 로그인 기능일 것이다.
특히나 대규모의 온라인 게임이라면, 무조건 필요한 기능이기도 하다.
물론 내가 만들고 있는 유니티 프로젝트가 그런 대규모의 온라인 게임을 목표로 하고 있는 것은 아니지만, 훗날에 내가 만들게 될 메타버스는 로그인 기능이 필수불가결하기 때문에 이번 기회에 확실하게 구현하면서 배우기로 했다.
일단 로그인 씬에서 가장 기본이 되는 아이디, 비밀번호를 적는 패널을 만들고, 캐릭터 선택 패널 그리고, 닉네임을 정하는 패널을 따로 만들기로 했다.
각 과정은 순차적으로 진행되도록 각 과정이 끝날 때마다 차례차례 setActive를 켜고 끄게 하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class Data
{
public static string ID = "aaa";
public static string PASS = "12345";
public static int charNum = 0;
public static int charMaxNum = 1;
public static string nick = " ";
}
public class LogInManager : MonoBehaviour
{
public GameObject logInPanel;
public GameObject charPanel;
public GameObject nickPanel;
public TMP_InputField id;
public TMP_InputField ps;
void Awake()
{
id = GameObject.Find("ID").GetComponent<TMP_InputField>();
ps = GameObject.Find("PASS").GetComponent<TMP_InputField>();
}
void Update()
{
}
public void LoginBtn()
{
bool checkID = id.text == Data.ID;
bool checkPS = ps.text == Data.PASS;
if (checkID && checkPS)
{
logInPanel.SetActive(false);
charPanel.SetActive(true);
}
}
public void NextBtn()
{
charPanel.SetActive(false);
nickPanel.SetActive(true);
Debug.Log(Data.charNum);
}
}
public class SelectChar : MonoBehaviour
{
public int charNumber;
public void SelectBtn()
{
Data.charNum = charNumber;
Debug.Log(Data.charNum);
}
}
public class InputNick : MonoBehaviour
{
public TMP_InputField nickName;
public void StartBtn()
{
Data.nick = nickName.text;
Debug.Log(Data.nick);
GetComponent<SceneChange>().OnStartBtn();
}
}
잘 보면, 각 패널의 버튼의 onClick 마다 해당하는 클래스의 버튼 함수들을 붙여서 setActive를 조절하도록 만든 것을 볼 수 있다.
그리고, 로그인에 필요한 정보들은 Data 클래스로 따로 모아서 static으로 처리했는데, 이렇게 하면, 유일한 변수로 지정되어서 어떤 클래스에서든 이 변수를 가져오고, 변경할 수 있게 된다.
사실 강사님과는 이 정도의 기능만 구현했지만, 나는 로그인 씬이 너무 심심하게 느껴져서 배경에 해골이 떨어져 쌓이는 렌더 텍스쳐를 깔았다.
실제 다른 구역에서 해골을 생성하는 위치인 SkullManager 오브젝트를 놓고, 해당 위치가 랜덤으로 일정 영역 사이에 나타나게끔 한 뒤에 초마다 해당 위치에서 해골을 드롭하였다.
그리고, 다른 카메라로 그 장면을 찍어 렌더 텍스쳐로 받아와 로그인 화면 배경으로 깔아서 구현하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SkullManager : MonoBehaviour
{
public GameObject skullPrefab;
public int maxCount = 25;
public List<GameObject> curSkull = new List<GameObject>();
public GameObject skullRespawner;
public float timer = 3f;
private float spawnPos = 0;
public float moveSpeed = 5f;
private float originalT;
void Awake()
{
originalT = timer;
skullRespawner = GameObject.Find("SkullRespawn");
}
public void RemoveSkull(GameObject skull)
{
curSkull.Remove(skull);
}
void Update()
{
if (curSkull.Count <= maxCount)
{
if (timer <= 0)
{
skullRespawner.transform.position = new Vector3(Random.Range(299, 301), skullRespawner.transform.position.y, 0);
GameObject skull = Instantiate(skullPrefab);
skull.transform.position = skullRespawner.transform.position + new Vector3(0, 5, 0);
skull.name = "SkullHead";
skull.transform.parent = this.transform;
curSkull.Add(skull);
timer = originalT;
}
else
{
timer -= Time.deltaTime;
}
}
}
}
미니맵 구현
미니맵은 플레이어 하위 오브젝트로 새로운 미니맵용 카메라를 두어 구현하였다.
카메라는 캐릭터 바로 위로 멀찍이 두고, 캐릭터 레이어 대신 캐릭터 2D 이미지 레이어를 (컬링 마스크로) 찍도록 하였다.
그리고, 또다시 렌더 텍스쳐를 이용해서 미니맵 이미지에 출력되도록 하였다.
여기서, 동그랗게 미니맵을 만들고 싶다면, 동그란 이미지의 부모 오브젝트에 미니맵 렌더 텍스쳐 이미지를 하위 오브젝트로 넣고, 아래와 같이 컴포넌트를 조정하면 된다.
Starters 12주차 스터디 - '유클리드 호제법과 관련 문제들'
유클리드 호제법
최대공약수와 최소공배수 그중에서도 특히 최대공약수를 찾는데 아주 아주 아주 도움을 주는 이론인 유클리드 호제법을 배웠다.
간략하게 유클리드 호제법의 내용을 아주 간략하게 설명하자면 큰 수 A와 작은 수 B의 최대공약수와 A에서 B를 나눈 나머지 R과 B의 최대공약수가 같다는 같다는 그런 내용이다.
이게 무슨 소리인가 하는 분은 내가 참고한 아래 블로그 페이지를 통해 배우면 훨씬 좋을 것 같다.
정수론 (1) - 최대공약수, 최소공배수, 유클리드 호제법
안녕하세요, Dimen입니다! 오늘부터 정수론에 대한 글을 써보고자 합니다. 정수론은 정규 수학 교육과정에서 잘 다루지 않기 때문에 많은 분들에게 생소한 분야입니다. 그런 만큼 많은 분들에게
dimenchoi.tistory.com
여하튼, 이를 이용하면, A와 B의 최대공약수는 A에서 B를 나눈 나머지 R과 B의 최대공약수이자, 다시 B에서 R을 나눈 나머지인 R2와 R의 최대공약수가 된다.
이대로 계속 나누면, 나머지가 0이 될 때가 생기는데, (Bn % Rn = 0) 당연하게도 Bn과 Rn의 최대공약수는 Rn이라는 것이 되고, 즉, 다시 처음으로 돌아가서 A와 B의 최대공약수 역시 Rn이 된다.
백준 2609 : 최대공약수와 최소공배수
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
바로 위의 공식을 그대로 사용하면 되는 문제이다.
최소공배수는 더 쉬운데, 그냥 두 수를 곱한 다음 최대공약수를 나누면 된다.
(그 이유는 위에 블로그를 참고하면 알 수 있습니다.)
즉, 최대공약수를 먼저 구하고 나면, 저절로 최소공배수 역시 구할 수 있게 된다.
using System;
using System.Collections.Generic;
public static class BJ2609
{
public static void Main(string[] args)
{
string[] str = Console.ReadLine().Split(" ");
int a = int.Parse(str[0]);
int b = int.Parse(str[1]);
int gcd = SolveGCD(a, b);
int lcm = SolveLCM(a, b, gcd);
Console.Write(gcd + "\n" + lcm);
}
public static int SolveGCD(int a, int b)
{
int big;
int small;
if (a > b)
{
big = a;
small = b;
}
else
{
big = b;
small = a;
}
int r = big % small;
if (r == 0)
{
return small;
}
else
{
return SolveGCD(small, r);
}
}
public static int SolveLCM(int a, int b, int gcd)
{
return (a * b) / gcd;
}
}
Starters 12주차 토이 프로젝트 - '타이쿤 게임 기획'
콘셉트 잡기
새로운 게임은 타이쿤 게임으로 하려고 하였는데, 꽃집에 대한 에셋을 구하려고 하다 정말 구하기 어렵다는 것을 알게 되었다.
그리고, 내 콘셉트에 맞게 내 마음대로 만들어 쓰려고 보니 역시 2D가 좀 더 편하다는 것을 알게 되었다.
하지만, 이번에는 좀 더 새롭게 3D 프로젝트에서 2.5D로 구현하기로 하였다.
이는 '굶지 마(Don't starve)'라는 게임에서 착안했다.
그리고, 에셋의 전체적인 분위기는 카이로 소프트 게임들처럼 만들어보기로 했다.
완전 같지는 않지만, 도트 풍으로 귀엽게 만들게 될 것 같다.
부가적인 부분은 사실 시간이 많지 않아서 다 정하지 못했다.
일단 먼저 열심히 도트 이미지를 찍는데 시간을 보내고 있는데, 스토리나 게임 방식을 좀 더 다듬는 작업을 다음 주부터 시작하고, 다음주 수요일 정도부터는 유니티를 직접 만질 수 있지 않을까 싶다.
유데미 코리아 바로가기 :
Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea
유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.
www.udemykorea.com
💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
'Starters 부트캠프 > B - log' 카테고리의 다른 글
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 14주차 학습 일지 (1) | 2022.09.25 |
---|---|
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 13주차 학습 일지 (0) | 2022.09.18 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 11주차 학습 일지 (0) | 2022.09.04 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 10주차 학습 일지 (0) | 2022.08.28 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 9주차 학습 일지 (0) | 2022.08.21 |