<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>스파게티 코드에도 볕 들 날 온다</title>
        <link>https://velog.io/</link>
        <description>패션컴공탈출기</description>
        <lastBuildDate>Fri, 29 Mar 2024 12:00:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>스파게티 코드에도 볕 들 날 온다</title>
            <url>https://velog.velcdn.com/images/hotchanny_x_x/profile/fa6f7d59-6bd8-45d7-9e34-6f3870ee9f76/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 스파게티 코드에도 볕 들 날 온다. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hotchanny_x_x" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[240329 - 팀과제 23일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240329-%ED%8C%80%EA%B3%BC%EC%A0%9C-23%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240329-%ED%8C%80%EA%B3%BC%EC%A0%9C-23%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 29 Mar 2024 12:00:49 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘은 별거 안했는데 별거 했다.
바로가자</p>
<blockquote>
<h2 id="interactionmanager">InteractionManager</h2>
</blockquote>
<p>팀원이 지적해준 인터렉션 매니저.
처음에는 엥 내가 이걸 어케써..? 라고 생각했는데 공부하다보니까 별거 아니더라(훗)
요약하자면 그냥 <strong>&quot;내가 쓸 함수들을 한 스크립트에 묶어서 필요한 부분에 1줄만 추가&quot;</strong>뿐이다.</p>
<p>먼저 매니저를 만들고 필요한 변수들을 선언한다</p>
<pre><code>public class InteractionManager2D : MonoBehaviour
{
    private GameObject curInteractGameobject;
    private IInteractable curInteractable;

    public TextMeshProUGUI promptText;
    public Player player;
</code></pre><p>다음 제일 중요한, 싱글톤화를 한다.
그래야 계속 불러서 쓸 수 있다.
씬 이동 했을때도 계속 불러올 수 있도록 파괴되지 않게 만든다.</p>
<pre><code>public static InteractionManager2D instance = null;

void Awake()
{
    if (null == instance)
    {
        //InteractionManager2D.instance.SetPromptText();

        instance = this;

        DontDestroyOnLoad(this.gameObject);
    }
    else
    {
        Destroy(this.gameObject);
    }
}</code></pre><p>그리고 대충 코드 짜기 전에 설계 해둔 것을 정리한다.</p>
<pre><code>//디폴트상태 : 안내텍스트x

//public 플레이어 상호작용 함수

//if 플레이어가 퍼즐 가까이 가면

//      if 플레이어가 뭘 안가지고 있으면

//              플레이어가 물건 집도록 안내 텍스트 함수호출
//      elseif (가지고있다면)
//              물건 못집음 함수호출</code></pre><p>사실 저 위의 설계는 이미 PlayerInteraction스크립트에 있긴 하다.
인스턴스를 어디에 넣을 지 잠깐 고민하느라 주석으로 정리했던 것 같다ㅋㅋ
아무튼 설계해놓은 주석대로 코드를 짠다.</p>
<pre><code>public void SetPromptText() //시아
{
    if (player.haveItem != null)
    {
        promptText.gameObject.SetActive(false);

    }
    else
        promptText.gameObject.SetActive(true);
}

public void OffPromptText() //시아
{
    promptText.gameObject.SetActive(false);
}

public void OnInteractInput(InputAction.CallbackContext callbackContext)
{
    if (callbackContext.phase == InputActionPhase.Started &amp;&amp; curInteractable != null)
    {
        curInteractable.OnInteract();
        curInteractGameobject = null;
        curInteractable = null;
        promptText.gameObject.SetActive(false);
    }
}</code></pre><p>자 이제 매니저를 다 짰으니 PlayerInteraction에 적용시키자.
단 2줄만 넣으면 된다.</p>
<pre><code>public void DeleteCheak()
{
    if(!CastCylinderRays())
    {
        item = null;
        _object = null;
        puzzle = null;
        InteractionManager2D.instance.OffPromptText(); &lt;&lt; 이쪽에 하나
    }
}

...

public bool CastCylinderRays()
{
    for (int ii = 0; ii&lt;7;ii++)
    {
        for (int i = 0; i &lt; numberOfRays; i++)
        {

            float angle = ((i * 240f) / numberOfRays) - Angle;
            Vector3 direction = Quaternion.Euler(0, angle, 0) * transform.forward;

            Vector3 rayStart = transform.position + Vector3.up * (height*ii);
            RaycastHit hit;

            if (Physics.Raycast(rayStart, direction, out hit, radius))
            {
                if(_object == hit.collider.gameObject &amp;&amp; item!=null) return true;

                item = hit.collider.GetComponent&lt;Item&gt;();

                if (hit.collider.gameObject.layer == 12)
                {
                    InteractionManager2D.instance.SetPromptText(); &lt;&lt; 이쪽에 하나
                }
</code></pre><p>끝.
이렇게 <del>어쩌고</del>매니저를 완벽하게 정복하게 되었다. 야호!!!!!!!!!!!!!
벌써 사운드 관리도 이렇게 할 생각에 가슴 떨림ㅋㅋ</p>
<blockquote>
<h2 id="에셋-관련">에셋 관련</h2>
</blockquote>
<p>연출을 위한 에셋을 하나 다운받았는데, 제대로 작동되지가 않았다.
튜터님을 2명이나 붙잡고 총합 2시간 가량 고민했는데도 해결이 되지 않았다.
... 에셋 제작자(외국인,,,,,,,)에게 물어볼 수밖에 없었다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/56de5fc8-3beb-4420-9b46-6a7a527f493c/image.png" alt=""><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/36878909-62e9-46b1-b5ef-5a1ac6b4cfa0/image.png" alt="">보기만 해도 두려워지는 온갖 영어와 러시아어가 판치는 곳....덜덜덜덜덜
영어 울렁증이 있는 나로써는 마음 단단히 먹고 입장했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/911d556e-1cf8-40c9-b622-f0f394d54843/image.png" alt="">
처음에는 우리 프로젝트의 버젼과 해당 에셋의 버젼이 달라서 생긴 현상이라 생각해서 메일을 넣었다. 그러나 에셋 버전이 달라도 쓸 수 있다 해서 어떻게든 적용시켜보자 전전긍긍 하다 혼자는 해결 불가능하다는 판단을 내렸고,,,,</p>
<p>결국 개발자와 디스코드로...영어로..ㅠㅠ..대화를 하면서 해결했다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/22e3ad32-895a-4f6b-a79e-ec42f539b994/image.png" alt="">해결 결과, 우리가 쓰는 Urp에 해당 에셋의 urp 렌더러를 추가하면 되는 아주 간단한 문제였다ㄱ-</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/a5ef294d-456a-4ba6-93ad-434a1e1685da/image.gif" alt="">
무서운 메인화면 만들기 성공. 후후.</p>
<p>Thanks to NullTale.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b09559f4-394e-4fa7-bd96-c803d9fed496/image.png" alt="">오늘 트러블 슈팅도 훌륭하게 적었다ㅎㅎ^^
(진짜 이렇게 적은거 아님;;)</p>
<p>그리고 간단히 내일 모레 할 일을 정리하며 오늘 하루를 마무리했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/92413e53-0463-4632-8136-9057597a72f7/image.png" alt=""></p>
<p><em>다음 화에 계속</em>...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240327 - 팀과제...21일차...]]></title>
            <link>https://velog.io/@hotchanny_x_x/240327-%ED%8C%80%EA%B3%BC%EC%A0%9C...21%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240327-%ED%8C%80%EA%B3%BC%EC%A0%9C...21%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 27 Mar 2024 12:18:38 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
9일만에 돌아온 기가막힌 TIL
바로 시작하자</p>
<blockquote>
<h2 id="to-do-list">To do List</h2>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/14adf4a9-3225-4fa9-8c36-88eef16186e2/image.png" alt="">
일단 2<del>3주차 투두리스트는 이정도 되겠다.
이중에서 거의완벽or 틀만 완성해두고 나중에 제대로 만들 부분들을 제외해서 이번에 쓸 내용은
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/f52dfa82-4da2-48d1-848e-b5facbca1d3c/image.png" alt="">
게임종료와 상호작용이 되겠다.
~</del>사실 다 손보긴 해야함. 근데 일단 한 것부터 씀.~~</p>
<blockquote>
<h3 id="게임종료">게임종료</h3>
</blockquote>
<p>게임종료구현은 간단하다.
매번 프로젝트 때마다 단골손님으로 쓰던 Exit함수를 응용한다.</p>
<pre><code>public void GameExit()
{
    #if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false;
    #else
        Application.Quit();
    #endif
}</code></pre><p>베리굿. 해결완. 근데 데이터관리를 하기 시작하면 또 코드를 수정해야겠지..눈물줄줄...</p>
<blockquote>
<h3 id="상호작용">상호작용</h3>
</blockquote>
<p>제일 시간을 끌면서 고민을 했다가 어처구니없이 해결된 문제.
일단은 팀원이 만들어놓은 플레이어 상호작용 스크립트에 기생해서 해결한다.</p>
<pre><code> private GameObject curInteractGameobject; // 시아
 private IInteractable curInteractable; // 시아

 public interface IInteractable // 시아
 {
    string GetInteractPrompt();
     void OnInteract();
 }

 public TextMeshProUGUI promptText; // 상호작용 안내 텍스트 Meshpro</code></pre><p>쓸 변수들을 선언해준다.
퍼즐 오브젝트들을 인식할 때 필요한 변수들과 상호작용 할 때 안내 텍스트를 위한 변수들.</p>
<pre><code>private void SetPromptText() //시아
{
    if (this.gameObject.transform.GetChild(1).GetComponent&lt;Animator&gt;().GetBool(&quot;@GroundHave&quot;))
    {
        promptText.gameObject.SetActive(false);

    }
    else
    promptText.gameObject.SetActive(true);
}

private void OffPromptText() //시아
{
    promptText.gameObject.SetActive(false);
}

public void OnInteractInput(InputAction.CallbackContext callbackContext)
{
    if (callbackContext.phase == InputActionPhase.Started &amp;&amp; curInteractable != null)
    {
        curInteractable.OnInteract();
        curInteractGameobject = null;
        curInteractable = null;
        promptText.gameObject.SetActive(false);
    }
}</code></pre><p>우선 SetPromptText함수는 안내 텍스트 출력을 위한 함수다
우선 플레이어의 행동에 조건을 보고, 안내 텍스트를 출력할 지 말지에 대해 판단하는건데,
플레이어의 상태가 물건을 들고 있을 때(@GroundHave), 텍스트 출력을 비활성화 한다.
그게 아니면(물건을 들고 있지 않거나, 퍼즐조각과 가까이 있을 때) 텍스트 출력을 활성화 한다.</p>
<pre><code>if (item != null &amp;&amp; hit.collider.gameObject.layer == 12)
{
    //Debug.DrawLine(rayStart, hit.point, Color.red);

    _object = hit.collider.gameObject;

    //여기다 상호작용 안내 텍스트 코드 넣기
    SetPromptText();

    Debug.Log(&quot;상호작용&quot;);

    return true;

}</code></pre><p>퍼즐 오브젝트는 레이캐스트로 거리를 인식해서 잡을 수 있게 하셨길래 거기다 덧붙여서 퍼즐조각들에 레이어를 Interactable로 바꿨다. 그리고 그 레이어와 플레이어의 거리가 어느정도 됐을 때 안내텍스트가 나오는 함수를 불러오도록 한다. </p>
<pre><code>public void DeleteCheak()
{
    if(!CastCylinderRays())
    {
        item = null;
        _object = null;
        puzzle = null;
        OffPromptText();
    }
}</code></pre><p>default상태, 그러니까 플레이어가 아무것도 하지 않는(아이템 들고있지않음, 아이템이 가까이 있지 않음) 상태 일때는 OffPromptText()함수를 불러와 안내 텍스트를 꺼놓는다. 오로지 퍼즐조각이 가까이 있을 때만 나오도록.</p>
<p>그 결과!</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/13feae4a-cfd0-4340-94fb-5846942b4aff/image.png" alt=""><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/c0edd74c-b690-47d4-8e7e-85d02a9f27f7/image.png" alt="">
Vㅔ리굿. 퍼펙트.</p>
<blockquote>
<h2 id="트러블-슈팅">트러블 슈팅</h2>
</blockquote>
<p>해당 코드를 팀원들과 상의했다.
기본적으로 PlayerInteraction스크립트는 팀원들 모두가 공유해서 쓰는 스크립트라 이쪽에다 코드 붙이는걸 추천하지 않는다고 했다.
따라서 InteractionManager를 새로 생성해서 싱글톤으로 만들어 필요할 때마다 그냥 불러와서 쓰는 방식으로 바꾸는게 어떻냐는 이야기가 나왔다.
근데 이제 문제는
...
...
...
내가 매니저를 다룰 줄 모른다는 것.
...
...
...
대 위기.</p>
<p>다음 화에 계속...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240318 - 팀과제...12일차..]]></title>
            <link>https://velog.io/@hotchanny_x_x/240318-%ED%8C%80%EA%B3%BC%EC%A0%9C...12%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240318-%ED%8C%80%EA%B3%BC%EC%A0%9C...12%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 18 Mar 2024 11:44:18 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
마지막 글이 팀과제 1일차인데 12일만에 돌아오는 기적의 시간개념.
어쩔 수 없다. 숨만 쉬면서 코딩만 했다..
이전 과제 후기 TIL은...언젠가 쓰겠지...
자 들어가자.</p>
<blockquote>
<h3 id="내-역할">내 역할</h3>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d81111fc-195f-4179-b982-56d230cc8617/image.png" alt=""></p>
</blockquote>
<p>이번 프로젝트에서 내 메인 역할은 <strong>UI</strong>다.
지금까지의 팀과제를 진행하면서 다른 역할과 더불어 UI를 겸해서 하긴 했었는데, 그때는 게임시작버튼, 종료버튼, 리트라이버튼, 메인메뉴버튼, 간단한 배경... 이런것들만 간단하게 구현했었는데 본격적으로 UI만 만지는건 또 처음이라 뭐 어떻게..진행해야 할까요...? 상태다..</p>
<blockquote>
<h3 id="1주-차---에셋으로-이해하기">1주 차 - 에셋으로 이해하기</h3>
</blockquote>
<p>일단 1~2주는 샘플 에셋을 뜯어보면서 어떤 구현을 해야할 지 계획을 디테일하게 짜보기로 했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/2428045e-34ad-47b0-bbfa-e8cc41f0b0a1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/a124b5b4-6524-4e33-9e8c-f69454a8956a/image.png" alt="">
진짜 에셋스토어는 신이다.
UI를 어떻게 짜야 할 지 감도 안잡혔는데 여긴 이미 다 만들어져있다.
이제 여기 코드를 하나하나 뜯어보면
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d0cb37de-6d11-4f24-8a56-59cf6f99f813/image.png" alt="">
ExitToSystem은 exit버튼 스크립트, 종료가 막혀있어서 직접 짜야한다. 별로 어렵지 않으니 나중에 짜기로 함.
LayoutGroupFix는 메인메뉴의 버튼 정렬에 관련된건데</p>
<pre><code>void OnEnable()
{
    if (fixWithDelay == false &amp;&amp; fixOnEnable == true) { LayoutRebuilder.ForceRebuildLayoutImmediate(GetComponent&lt;RectTransform&gt;()); }
    else if (fixWithDelay == true) { StartCoroutine(FixDelay()); }
}

public void FixLayout()
{
    if (fixWithDelay == false) { LayoutRebuilder.ForceRebuildLayoutImmediate(GetComponent&lt;RectTransform&gt;()); }
    else { StartCoroutine(FixDelay()); }
}</code></pre><p>정렬을 UI매니저에 할당해놓은 세팅으로 고정시켜서 오브젝트에서 함부로 바꿀 수 없게 한다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b0f24d2c-ed58-4fa5-9bf1-bc667c32b6e9/image.png" alt="">
여기서 챕터를 고르는 식인데, 우리 게임은 이전 씬을 클리어 하지 못하면 다음 씬으로 이동할 수 없게 해야하니까 잠금설정을 해둬야한다. (씬 연결은 안해서 이동은 못함)
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/25a6f760-3f14-42a9-b7fb-a411cefb6e1d/image.png" alt="">
챕터 버튼에 인터렉트를 걸어 마우스를 올려놓거나 클릭할 때의 온갖 상호작용을 처리해준다.</p>
<blockquote>
<h3 id="1주차에-했던-것">1주차에 했던 것</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/8ddb743e-3d99-4d6f-b42e-0c77cae5a006/image.png" alt="">1주차는 기본 틀을 목표로 잡고
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/4d1136a0-ec80-4923-b4ca-d7697349d207/image.png" alt="">구현사항을 디테일하게 더 계획했다.</p>
<p>근데 이중에서
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/8848dffd-2b7a-4eb8-aeaa-34e5514cd206/image.png" alt="">이만큼밖에 못했다... ㄱ-...나머지는 뭐 천천히 하면 되니까<del>!!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/69efa9a5-bcce-45d6-8659-62c45f6bcae4/image.gif" alt="">게임 시작 시 스플래툰으로 약간.. 분위기를 조성하면서 게임을 시작한다(이미지랑 텍스트는 바꿔야함)!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/eda180f6-8734-4732-9c2e-0fadb0950f8e/image.gif" alt="">게임을 하기 위해 챕터를 누르면 로딩UI까지 부를 수 있게 했다.
구조는 대충 씬1 &gt; (페이드아웃)로딩UI(씬아님)(페이드인) &gt; 씬2 
~</del>진짜완벽하게구현함 이제 이거 계속 리사이클 가능ㅋㅋ~~</p>
<p>어떻게 구현했는지 궁금하다면?
다음화에 계속...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240306 - 최종프로젝트 1일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240306-%EC%B5%9C%EC%A2%85%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240306-%EC%B5%9C%EC%A2%85%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 06 Mar 2024 12:01:17 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
아 뭐쓰지ㄱ-
저번 팀프로젝트 정리는 시간되면 해보도록 하겠다...
일단!!!</p>
<h2 id="최종-프로젝트-회의">최종 프로젝트 회의</h2>
<p>2주 전, 담벼락을 보던 중 마침 내 취향을 딱 저격한 장르...공포게임...
내 최종프로젝트는 이걸로 정했다. 뒤도 안돌아보고 바로 팀원신청을 했다.</p>
<p>장르 : 3D 퍼즐 공포게임
팀 첫날, 하루종일 기획을 했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d3a6cdea-2149-4a70-b938-1e626e8596bc/image.png" alt="">사실 오늘만 한 건 아니고 며칠전부터 회의를 조금씩 했다.
각자가 생각하는 공포게임에서 유저에게 공포감을 줄 수 있는 요소가 무엇인지 각자 생각을 해봤다.
게임스토리의 큰 틀은 &quot;꿈과 현실의 대립&quot;으로 잡았다.</p>
<p>그리고 바로 각자 스토리 짜기로 들어갔다
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d543ebb1-c2a5-4aa7-8e0f-7dbbb35644af/image.png" alt="">나는 불면증-몽유병이라는 키워드를 가지고 써봤다. 그 외에도 팀원들도 좋은 의견들이 많아서 고르기가 쉽지 않았는데...</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/c0a68307-2480-489b-8a0d-d286fc19bf4e/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d9c11f3c-91ef-4402-9402-0e9e130eab28/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/bbb25114-bb9c-40ea-881e-a4ede6715b5b/image.png" alt=""></p>
<p>정말 하루종일...스토리만 짰다...근데 너무 힘들었다...
기획도 아무나 하는게 아닌 것 같다...</p>
<p>이런식으로 팀원들과 의견을 나눈 결과!!!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/4bb4f2fc-4f99-4d0b-8a5a-b2833c7b5110/image.png" alt="">(자체 블러처리ㅋㅋ)게임 흐름과 스토리 구상 종료.
내일은 좀 더 스토리 구체화와 역할배분을 하기로 했다.</p>
<p>정말 알찬 하루...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240227 - 팀과제 2일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240227-%ED%8C%80%EA%B3%BC%EC%A0%9C-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240227-%ED%8C%80%EA%B3%BC%EC%A0%9C-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 27 Feb 2024 11:50:19 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘도 너덜너덜해진 하루...
오늘은 어제 못다한 팀과제 중점적으로 요약.</p>
<blockquote>
<h3 id="팀과제">팀과제</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/9aaa0dbd-6474-4291-89b2-54408b264851/image.png" alt=""></p>
<h3 id="필수-구현-사항"><strong>필수 구현 사항</strong></h3>
<ol>
<li><strong>주인공 캐릭터의 이동 및 기본 동작</strong></li>
<li><strong>레벨 디자인 및 적절한 게임 오브젝트 배치</strong></li>
<li><strong>충돌 처리 및 피해량 계산</strong></li>
<li><strong>UI/UX 요소</strong></li>
<li><strong>추가 구현 사항 중 선택하여 3가지 이상 구현</strong></li>
</ol>
<h3 id="추가-구현-사항"><strong>추가 구현 사항</strong></h3>
<ol>
<li><strong>다양한 적 캐릭터와 그들의 행동 패턴 추가</strong></li>
<li><strong>다양한 무기나 아이템 추가</strong></li>
<li><strong>다양한 환경과 배경 설정</strong></li>
<li><strong>다양한 어려움 모드 또는 난이도 설정</strong>
등등등..</li>
</ol>
<p>이번 팀과제는 자유주제다. 개인과제로 낸 자유주제가 떡밥인 것처럼...^-^...</p>
<blockquote>
<h3 id="스크럼">스크럼</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/0357869a-6685-4682-a14f-bac380f7a40e/image.png" alt=""></p>
<p>이러고 있는동안 팀과제 스크럼은 벌써 6회차가 진행됐다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/755c9ef8-05ea-454a-acd5-22d268ce45c7/image.png" alt="">
물론 어제 말한 것처럼 내 개인과제를 디벨롭 하기로 했다.
<strong>장르는 메탈슬러그형식의 런앤건</strong>으로 변경.</p>
<p>그래서 이제.. 내가 맡은 파트는 플레이어니까? 그럴싸하게 구현했던 플레이어 스크립트를 새로 뜯어서 다시 만들어보기로 했다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/9bc9d40b-87f2-45ae-b0c5-f940d3abb776/image.png" alt="">
근접공격으로 하려고 했는데 메탈슬러그니까 아무래도 여우에게 총을 쥐여줘야 할 것 같아서.. 투사체부터 구현해보기로 했다.</p>
<p>↓↓PlayerAttack.cs</p>
<pre><code>if (curtime &lt;= 0)
{
    if (Input.GetKey(KeyCode.Q))
    {
        Instantiate(bullet, pos.position, transform.rotation);

    }
    curtime = cooltime;
}
curtime -= Time.deltaTime;</code></pre><p>공격 스크립트. 플레이어가 Q를 누르면 투사체(Bullet)이 나간다.
계속 나가면 안되니까 쿨타임을 2정도로 걸어줬다.</p>
<p>↓↓Bullet.cs</p>
<pre><code>RaycastHit2D ray = Physics2D.Raycast(transform.position, transform.right, distance, isLayer); // (시작점, 방향, 길이, 레이어선택)
if(ray.collider != null)
{
    if (ray.collider.tag == &quot;Enemy&quot;) {
        Debug.Log(&quot;명중&quot;);
    }
    DestroyBullet();
}

if(transform.rotation.y == 0) {
    transform.Translate(transform.right * speed * Time.deltaTime);
}
else
{
    transform.Translate(transform.right * -1 * speed * Time.deltaTime);
}</code></pre><p>저번에 배운 Raycast를 썼다!
불릿은 발판과 적을 감지해서 닿았을 때 destroy하도록 한다.
닿지 않고 죽 허공으로 나아갈때는 시간이 지나면 파괴되도록 Invoke함수로 딜레이를 줬다.</p>
<p>이제 대충.. 공격을 구현했으니.. 애니메이션을...만져야하는데.....<del>벌써부터 우울하내....</del>
아자아자...화이팅...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240226 - 개인과제 후기]]></title>
            <link>https://velog.io/@hotchanny_x_x/240226-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@hotchanny_x_x/240226-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 26 Feb 2024 12:01:17 GMT</pubDate>
            <description><![CDATA[<p>반갑다
TIL을 개인과제 1일차만 써놓고 바로 후기로 돌아오는 기가 막힌 정신머리.
근데 어쩔 수가 없다. 나는 늘 시간에 쫓겨 살기 때문에...
개인과제 후기 겸 팀과제 1일차까지 다 작성하려 한다.</p>
<blockquote>
<h2 id="fox-in-the-forest2">Fox In The Forest2</h2>
</blockquote>
<h3 id="내일배움캠프-심화주차-개인과제">내일배움캠프 심화주차 개인과제</h3>
<p>🖥️ 프로젝트 소개
탐험가 &#39;Foxy&#39;가 숲을 탐험하며 몬스터를 피해 숲의 비밀을 찾아내는 게임
장르 : 혼합 (인터렉티브 무비+포인트 앤 클릭 + RPG)</p>
<p>⚙️개발 기간
24.02.19 ~ 24.02.22</p>
<p>개발 환경
Visual Studio 2022
Unity 2022.3.2f</p>
<p>📌주요 기능
필수 요구 사항</p>
<ul>
<li>게임 시작 화면 : 인트로 씬 구성</li>
</ul>
<p>선택 요구 사항</p>
<ul>
<li>스크립트로 버튼에 이벤트 추가</li>
<li>raycast - 플레이어 이동 구현(점프)</li>
<li>씬 전환</li>
<li>대화 스크립트(스토리 진행)</li>
<li>플레이어 체력</li>
<li>포인트 앤 클릭(약간)</li>
<li>애니메이션 전환</li>
<li>플레이어(정지, 이동, 점프, 공격, 몬스터 피격 시)</li>
<li>몬스터(정지, 이동, 공격)</li>
<li>멀티 엔딩(3개) : 베스트, 워스트, 노멀 엔딩</li>
</ul>
<blockquote>
<h2 id="게임-요약">게임 요약</h2>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/3bc305f9-c3e9-4ca8-bc04-33c1fe92d73d/image.png" alt=""></p>
</blockquote>
<p>[↑↑스타트씬] 스타트씬부터 스크립트를 적용했다.
대충 플레이어가 열심히 숲을 뛰어가는 연출을 하기 위해서다.
뒷배경이 움직이는데, 배경에 움직이는 스크립트를 먹여 생동감있는 오프닝 연출을 했다!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/bc4f4b94-20cf-492c-b642-dc77e3dc70c0/image.png" alt="">[↑↑메인씬] 게임은 거의 메인씬에서 아이템, 몬스터, 함정과 상호작용 하는대로 씬이 넘어간다.
메인씬에서 플레이어는 이동, 점프, (구현은 못했지만 공격)등을 할 수 있고,
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/46ddf8fc-5eba-44f5-acd3-d66bdc80fb5c/image.png" alt="">[피격시] 몬스터에 닿았을 때 피격 애니메이션도 연출을 했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/fc88db83-709a-40d3-9fda-cd5823e572d8/image.png" alt="">[↑↑단서1]
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/ede12713-03af-4312-8b27-0ef9638d79f5/image.png" alt="">[↑↑단서2]
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/94f332a9-186e-4de9-bd18-cf967e76ff46/image.png" alt="">[↑↑단서3&amp;엔딩분기점]
맵 곳곳에 있는 아이템을 클릭하면 대화창이 연출되도록 했다.
사실 말이 창이지 씬 이동으로 구현해서 새로운 씬으로 이동하도록 연출한거다.
아무리 머리를 쥐어짜내도 이 방법밖에 떠오르지가 않아서... 그래... 내 최선이었다.
엔딩 분기점을 플레이어의 선택에 따라 엔딩이 달라지는건데, <del>누가봐도 빨간버튼 수상하죠?</del>
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/9b4d33eb-e951-403a-bc91-74fc54705a34/image.png" alt="">[↑↑베스트엔딩씬]플레이어가 상자를 열지 않는 선택을 하면 살아남는다. 반대로 상자를 열게 되면...
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b9d65548-9d7c-41f6-bb75-f2463c031502/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/44db2863-57df-4b55-ab12-18ea204524cb/image.png" alt="">
누가봐도 수상한 상자이기 때문에, 플레이어는 죽을 수 밖에 없다.
이 외에도 다른 엔딩으로는 노말엔딩이 있는데
[↑↑워스트엔딩씬]
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/e8734901-338f-4949-a590-91a5d19cc04f/image.png" alt="">[↑↑노말엔딩씬]플레이어의 체력이 다 닳거나, 함정에 빠지면 바로 즉사다. 노말 엔딩으로 이어진다.</p>
<p>그래서 왜 상자를 열면 죽는가?</p>
<blockquote>
<h3 id="줄거리-스포일러해석">줄거리 스포일러(해석?)</h3>
</blockquote>
<p>맵 곳곳에 있는 플레이어의 독백을 보면
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/0c9f3d51-e146-48c2-a336-e8da88c2f400/image.png" alt="">사람의 뼈가 있는 것을 본 플레이어는 자신이 들어온 숲이 상당히 위험한 곳임을 인지한다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/99ae60ba-020d-4733-913d-5ec489499fb8/image.png" alt="">또한 누군가가 남겨놓은 기록으로 인해 그 무시무시한 상자에 대한 정보를 얻는다.</p>
<p>이런 과정을 거쳐 플레이어가 마주한 최종 선택지에 있는 상자에 대한 선택이 최종 엔딩 결정으로 이어진다.</p>
<p>그 상자는 결국
<strong>플레이어 이전의 탐험가가 발견하고 보물이 있을거라 생각하고 열어보지만</strong> &gt; <strong>저주받은 상자</strong>이기 때문에
<strong>상자를 연 순간부터 천천히 죽어가고</strong> &gt; 죽어 가는 동안 <strong>나중에 숲을 탐험할 플레이어를 위해 작성한 기록</strong>이다.
이후 <strong>숲에 처음 들어온 플레이어</strong>는 그 <strong>선대 탐험가의 뼈와 기록 등을 발견</strong>할 수 있는 것이다.</p>
<p><del>급조한 줄거리지만 만족스럽군...</del></p>
<blockquote>
<h2 id="후기">후기</h2>
</blockquote>
<p>우선 아쉬운 점이 너무 많다. 기존에 생각했던 기능을 구현하는데 또 다른 방법이 있지 않을까 싶어 연구하다가 찾은 raycast라는 방법이 있다.</p>
<pre><code>//RayCast&gt;&gt; 오브젝트 검색을 위해 Ray를 쏘는 방식, 바닥감지
if(rigid.velocity.y &lt; 0)
{
    Debug.DrawRay(rigid.position, Vector3.down, new Color(0, 1, 0));
    RaycastHit2D rayHit = Physics2D.Raycast(rigid.position, Vector3.down, 1, LayerMask.GetMask(&quot;Platform&quot;));
    if (rayHit.collider != null)
    {
        if (rayHit.distance &lt; 0.6f)
            anim.SetBool(&quot;isJumping&quot;, false);</code></pre><p>플레이어 오브젝트 한가운데에서 바닥으로 보이지 않는 레이저를 쏘고, 그 레이저가 바닥을 감지한 경우에만 점프를 누를 수 있다.
게다가 원래 배운대로라면 플레이어 조작을 Input System으로 구현해야했는데, 더 간단하게 할 수 있는게 있지 않을까 생각하다가</p>
<pre><code> void Update()
 {
     if (Input.GetButtonUp(&quot;Horizontal&quot;))
     {
         //키 뗐을 때
         rigid.velocity = new Vector2(rigid.velocity.normalized.x * 0.5f, rigid.velocity.y);
     }

     //방향전환
     if (Input.GetButton(&quot;Horizontal&quot;))
         spriteRenderer.flipX = Input.GetAxisRaw(&quot;Horizontal&quot;) == -1;

     //애니메이션 전환(서있기&lt;&gt;걷기)
     if (Mathf.Abs(rigid.velocity.x) &lt; 0.48) // 속도가 얼마나 떨어졌을 때 모션이 바뀌는지
         anim.SetBool(&quot;isWalking&quot;, false);
     else
         anim.SetBool(&quot;isWalking&quot;, true);

     //애니메이션 전환 - 점프
     if (Input.GetKeyDown(KeyCode.Space) &amp;&amp; !anim.GetBool(&quot;isJumping&quot;))
     {
         rigid.AddForce(Vector2.up * jumpPower, ForceMode2D.Impulse);
         anim.SetBool(&quot;isJumping&quot;, true);
     }

     //애니메이션 전환-공격 : q키를 눌렀을 때 어택 애니메이션이 실행되고 있지 않다면 트리거 진행
     if (Input.GetKeyDown(KeyCode.Q) &amp;&amp; !anim.GetCurrentAnimatorStateInfo(0).IsName(&quot;Attack&quot;))
     {
         anim.SetTrigger(&quot;attack&quot;);
         gameObject.layer = 12;
         Invoke(&quot;OnAttack&quot;, 1);
     }


 }</code></pre><p>거의..약간...주먹구구식으로..코딩을 하게 되었다.
이 외에도 점프 모션이 이상하다거나, 공격이 먹히지 않는다던가, 하는 자잘한 버그들도 있었고...
더 구현하고 싶은 기능들이 많았다...
예를들어.. 플레이어의 공격 기능, 몬스터 체력바, 랜덤 맵 생성, 효과음, 퍼즐, 보스 전투씬 등
여러가지를 더 구현하고 싶었고 혼합 장르 보다는 RPG적 요소를 더 많이 넣어보고 싶었는데, 플레이어 이동과 애니메이션 구현 하나에 꽂혀서 너무 많은 시간을 뺏겼기에 엔딩도 못낼 것 같아 몇 가지 비교적 간단한 기능을 더 추가해서 부랴부랴 끝맺음을 지었다...흑흑...</p>
<p>그래서!!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/a1005c6c-71f4-41da-b58a-26a42c1bf66c/image.png" alt="">이번주차 팀과제는 내 개인과제를 베이스로 <del>또 또</del> FOX IN THE FOREST를 재구성 하기로 했다!</p>
<p>내일의 TIL을 기대하시라..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240219 - 개인과제 1일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240219-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240219-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 19 Feb 2024 11:47:31 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
이번 개인 과제는
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b9d08cbd-dbcf-462b-aa07-57c1d5821c0a/image.png" alt="">4일안에 게임 만들기ㅋㅋ</p>
<p>그래서 내가 선택한 과제는
<strong>&quot;Fox in the Forest&quot;</strong>
대학생 때 유니티 수업 시절 내가 만들었던 기말 프로젝트를 리메이크 할 예정이다.</p>
<p>그때는 <strong>2D스토리+스테이지</strong> 형식의 단순한 <strong>점프맵</strong>이었다면,
이번엔 <strong>2D 포인트 앤 클릭에 살짝 RPG느낌</strong>을 가미한 <strong>약간의 스토리</strong>로 가보고자 한다.</p>
<p>핀터레스트로는
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/3fd5e5f0-009c-4969-88d0-ebe11902a94d/image.png" alt=""></p>
<p>언더테일,
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/cc258bb4-7372-4e50-9357-4b2bc116bcbf/image.png" alt="">
레전드 오브 곡괭이가 있겠다.</p>
<blockquote>
<h3 id="fox-in-the-forest-2">Fox In the Forest 2</h3>
<p>장르 : 2D 포인트 앤 클릭, 탈출
스토리 : <del>귀염둥이</del>플레이어 Foxy가 미스터리한 숲을 탐사하며 숲의 비밀을 파헤쳐 탈출하는 게임.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/14ef6fdd-b3bb-4fb4-8555-e30646885ffb/image.gif" alt="">게임 장르를 바로 정하자마자 만든 메인 시작 씬.
배경 움직이는 저,,, 저 스크립트도 연구해봐야함. 저거 계속 써먹어야함. 진짜로.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/e2e1a7db-9ac0-463b-acf2-701b2a8db104/image.png" alt="">간략하게 구상한 씬 다이어그램.
저장기능까지 넣을 수 있을 진 모르겠지만? 일단 부딪혀봐야 알겠지.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/fe05fa2f-b646-4386-8c00-89dc5beb819e/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/2b2a8d74-730d-468a-9b22-970326f1f6e9/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/625d78a0-bd9e-4f28-9033-f9c80fd57fd6/image.png" alt="">플레이어, 몬스터, 보스몬스터, 배경 등의 에셋은 기말 프로젝트 당시에 썼던 것들 그대로 쓰려 한다.
이번엔 기능까지 완벽하게 구현해야하니까.
에셋 다시 찾아볼 시간 없어!!!!</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/863f71e9-f829-4408-b20f-c0dfa4f0d4c9/image.png" alt="">
일단 오늘 짠 메인화면의 움직이는 배경같은 경우는 데모 에셋에서 친절하게 썼던 코드를 그대로 썼다. 배경에 해당되는 레이어들을 잘게 잘게 쪼개서 움직일 레이어와 고정할 레이어를 분리해준다.</p>
<p>코드 분석을 해보면,</p>
<pre><code>    public float speed;
    private float x;
    public float Move_1;
    public float Move_2;</code></pre><p>이렇게 배경의 속도를 조절하는 변수들을 선언해준다.</p>
<pre><code>void Update () {
    x = transform.position.x;
    x += speed * Time.deltaTime;
    transform.position = new Vector3 (x, transform.position.y, transform.position.z);

    if (x &lt;= Move_1)
    {

        Debug.Log (&quot;hhhh&quot;);
        x = Move_2;
        transform.position = new Vector3 (x, transform.position.y, transform.position.z);
    }
}</code></pre><p>델타타임으로 프레임을 맞춰주고 특정 위치까지 오면 레이어의 움직임이 멈춘다.</p>
<p>처음 코드를 봤을땐 되게 어렵겠구나 싶었는데 그냥 음... 하나씩 뜯어보니 단순히 이미지를 자동으로 옮겨주는 것일 뿐이었다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/96071323-4f8c-499f-a52c-e12d3b7394f8/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/c36b0c09-a46b-450b-b722-ca44ca9b53c1/image.png" alt="">
또한 각각의 레이어마다 똑같이 움직이는 것이 아닌, 어떤 레이어는 더 빨리 움직이고, 어떤 레이어는 더 느리게 움직이고 정도를 맞춰준다.</p>
<p>예전에는 하나도 이해를 못했는데, 이제 어느 정도 이해가 되니까... 확실히 성장한게 느껴진다.
우하학!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0215 - 팀과제 후기]]></title>
            <link>https://velog.io/@hotchanny_x_x/0215-%ED%8C%80%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@hotchanny_x_x/0215-%ED%8C%80%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Fri, 16 Feb 2024 09:06:35 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
이번 팀과제를 하면서 코드타카랑 TIL작성을 할 시간이..
...도저히...
...
... 일단 후기는 정리가 다 끝나고 나서.</p>
<p>엊그제 TIL에서 쓴 대로 나는 <strong>UI 관리, 캐릭터 조작, 퍼마데스 시스템, 피해와 체력 관리</strong>, 그리고 추가로 <strong>사운드</strong>도 담당했다.</p>
<blockquote>
<h3 id="캐릭터-조작">캐릭터 조작</h3>
</blockquote>
<p>사실 캐릭터 조작은 팀원 모두가 구현한거라 내가 했다는게 조금 모호하다.
캐릭터 조작까지는 팀원 모두가 어려움 없이 해낸 후에 각자 자기가 하고싶은 기능을 구현하기 시작했기 때문이다.
그래도 설명을 하자면,
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/1dcafe1b-fa1e-44e4-a1ee-a03f2e7c242b/image.png" alt="">우선 InputSystem을 사용해서 플레이어의 움직임을 받는다.</p>
<pre><code>public void OnMove(InputValue value)
{
    //Debug.Log(&quot;OnMove&quot; + value.ToString());
    Vector2 moveInput = value.Get&lt;Vector2&gt;().normalized;
    CallMoveEvent(moveInput);
}

public void OnLook(InputValue value)
{
    //Debug.Log(&quot;OnLook&quot; + value.ToString());
    Vector2 newAim = value.Get&lt;Vector2&gt;();
    Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
    newAim = (worldPos - (Vector2)transform.position).normalized;

    if(newAim.magnitude &gt;= .9f)
    {
        CallLookEvent(newAim);
    }
}
...</code></pre><p>그 후 PlayerInputController 스크립트에서 조정을 해준다.
근데 이.. 코드를... 나만 쓴게 아니라... 다른 팀원들도 전부 썼더라..</p>
<blockquote>
<h3 id="ui관리">UI관리</h3>
</blockquote>
<p>UI라 함은 내가 맡은 파트나 짜잘한 씬들의 UI만이라고 생각했는데... 오늘 발표 후 튜터님께서 &quot;왜 아이템 UI는 설정하지 않았냐&quot;는 질문에 아무 말도 할 수 없었다. 그것도 했어야 했구나... 하긴 UI 담당이면서 나머지 UI를 설정 안한게.. 말이 안되긴 해...
그래도 일단 구현은 했으니까..
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/11df0c35-63b5-4e93-8ee6-0953b0fad78c/image.png" alt="">게임시작씬
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/f0e40350-032f-41f2-ac4a-ecade37a9a9c/image.png" alt="">게임오버씬
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/613b5173-4938-4301-80a9-5314e5e10200/image.png" alt="">게임클리어씬
그리고 플레이어 애니메이션 등... 단순한 오브젝트 배치긴 한데, 에셋 찾기가 여간 힘든게 아니더라,,,</p>
<blockquote>
<h3 id="퍼마데스-시스템--플레이어-체력-피해-관리">퍼마데스 시스템 / 플레이어 체력, 피해 관리</h3>
</blockquote>
<p>무박 2일동안 과제를 마무리 하면서 제일 많이 시간을 잡아 먹은 파트.
진짜 지금 생각해도 구현한게 기적같다.</p>
<p>우선 HealthController 스크립트를 만든다.</p>
<pre><code>public float cooldownHit;
private float rateOfHit;
private GameObject[] life;
private int qtdLife;</code></pre><p>쓰일 변수들을 생성해준다.
life는 화면 좌상단에 나오는 플레이어의 체력UI와 연결을 시키기 위함.</p>
<pre><code>void Start()
{
    rateOfHit = Time.time;
    life = GameObject.FindGameObjectsWithTag(&quot;Life&quot;);
    qtdLife = life.Length;
}</code></pre><p>스타트 함수에서는 life 변수가 life 태그의 오브젝트로 지정하도록 해준 후
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/935f0fa0-cded-4cf7-a105-10dca8582776/image.png" alt="">해당 이미지들을 배열로 선언한다.(Life, Life(1), Life(2)</p>
<pre><code>void OnCollisionEnter2D(Collision2D other)
{                      
    if (other.gameObject.tag == &quot;Monster&quot;)
    {

        Hurt();
    }
}</code></pre><p>또한 몬스터에게 Monster태그를 달아준 후 해당 태그의 오브젝트와 충돌할 때마다 hurt 메소드가 나오도록 해주고,</p>
<pre><code>void Hurt()
{
    if (rateOfHit &lt; Time.time)
    {
        rateOfHit = Time.time + cooldownHit;
        life[qtdLife - 1].SetActive(false);
        qtdLife -= 1;
    }

    if (qtdLife &lt;= 0)
    {
        GameManager.instance.GameClear = false;
        if(!GameManager.instance.GameClear)
        SceneManager.LoadScene(&quot;GameOverScene&quot;);
    }
}</code></pre><p>hurt 메소드에서는 (충돌 시) 체력이 -1 됨에 따라 배열로 지정해준 체력 UI 이미지도 1개씩 비활성화 되도록 해준다.</p>
<p>이후 해당 배열의 수가 0보다 작거나 같으면 플레이어의 체력이 모두 소진된것이므로 GameOver 씬으로 가도록 한다.
한 스크립트 안에 체력회복 및 피해관리와 퍼마데스 시스템을 모두 구현해냈다!!!</p>
<blockquote>
<h3 id="사운드">사운드</h3>
</blockquote>
<p>사운드는 배경음과 플레이어가 상호작용하는 모든 것에 효과음을 넣고 싶었는데, 시간이 그렇게 많지 않았다....힝...
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/9dbe92b5-08a8-4d33-85b2-0a36064ab25f/image.png" alt="">그래서 간단하게나마 씬마다 오디오소스 오브젝트를 배치해서 씬이 바뀔 때마다 다른 배경음이 나오도록 했다.</p>
<blockquote>
<h3 id="후기">후기</h3>
</blockquote>
<p>시간이...없다는게 어떤 느낌인지 처음 알았다...이때까지의 시간부족 이슈는 진짜 다 가짜 이슈들이었고, 이번이 진짜다.</p>
<p>팀과제 초반, 3D 퍼즐게임을 기획했다가 시간분배를 잘못해서 마감 3일전에 엎어졌다...
이후 2D 로그라이크로 장르를 변경하여 다시 해봤지만 마감이 이틀이 남도록 역할 분배에서 난항을 겪고 기초틀 작업조차 마무리 되지 않았다. 역할 분배가 뭔가... 뭔가 분배를 하면서 뭔가 이상함을 느끼긴 했는데 아니나다를까 관련있는 파트끼리 묶어서 가져갔어야 했는데... 각자 하고싶은대로 가져갔다가... 난리가 났다... 팀장인 내가 <del>비록 사다리타기로 뽑힌거지만</del> 좀 더 주도적으로 계획을 빡빡하게 세웠어야 했는데... 아니다 역시 내 역량 부족이 맞다...</p>
<p>그래서 다음부터는 좀 더 계획을 세울 때 집중해서 빡빡하게 세워야겠다는 생각을 했다.
그러지 못해서 이번 팀과제는 정말,,,정말,,, 죽음의 나날이었으니까,,,</p>
<p>다음 과제도,,,힘,,,내자,,,,아자아자,,,,,</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0214 - 팀과제...n일차...]]></title>
            <link>https://velog.io/@hotchanny_x_x/0214-%ED%8C%80%EA%B3%BC%EC%A0%9C...n%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/0214-%ED%8C%80%EA%B3%BC%EC%A0%9C...n%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 14 Feb 2024 12:04:01 GMT</pubDate>
            <description><![CDATA[<p>반갑다
연휴가 끼고서 시간계산 이슈로... 팀과제를 제대로 하지 못하게 됐다..
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/ec8cd7a4-cd06-44f0-860a-dd0b3961f1da/image.png" alt="">팀원들도 시간 안에 3D구현은 힘들 것 같은지 2D로그라이크로 장르 변경을 하기로 했다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/0d31a277-f2e8-4e1b-88d4-0151fa060fa3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/aaf798fc-e996-44ba-983d-53c49e785c2d/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/f9f26ece-cf38-44c0-8db4-64fc1f0235d1/image.png" alt="">팀원이 그려준 깜찍한 와이어프레임..</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/a2637119-59f0-47c7-97a7-41ec9b154511/image.png" alt="">
와이어프레임을 토대로 다이어그램을 그렸다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/1a629389-5765-48f0-9ebc-ac2c3f11c5e9/image.png" alt="">뒤늦게서야 역할분담도 했다.
캐릭터조작은 이미 완성된 만큼 다른 역할을 좀 더 가져가기로 했다.</p>
<p>...남은 기간 단 이틀.....
할 수 있을까...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[0208- 팀과제 1일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/0208-%ED%8C%80%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/0208-%ED%8C%80%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 08 Feb 2024 11:59:22 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
설 연휴를 앞두고 팀과제가 시작됐다.
ㅋㅋ
ㅋㅋ
ㅋ...
바로 진행하자.</p>
<h3 id="팀과제-요약">팀과제 요약</h3>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b0795691-41df-4ada-90f6-ab4293c8c0e8/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/9a749e4b-5272-480b-9d3a-34aa57d45664/image.png" alt=""></p>
<h3 id="회의-기록">회의 기록</h3>
<ol>
<li><p>장르 선택
4개의 장르 중에서 1개 고르는 데에도 엄청 많이 고민했다.
그래서 선정된 장르... <strong>3D 퍼즐(탈출)!</strong>
왜? <del>재미와 낭만이 있잖아..</del>
그건 아니고 3D 게임 개발에 대한 이해도와 심화적인 부분을 연구해보고 싶어서다.</p>
</li>
<li><p>에셋으로 컨셉 설정
일단 개발에 들어가기 전에... 컨셉을 짜야하는데 에셋은 한정적이니까 차라리 바로 에셋 쇼핑을 하면서 컨셉을 정하기로 했다.
1인칭 시점으로 진행되는 게임인 만큼 맵이 중요했기에, 고르고 골라 선정된 에셋은</p>
</li>
</ol>
<p>-&gt; 유저의 방(캐빈)</p>
<ol start="3">
<li><p>스토리
눈을 감았다 뜨니 TIL 작성 마감까지 1시간, 1시간 안에 TIL 작성 거리를 찾아서 제출하지 않으면,,,(요약)
나머지는 게임이 완성된 후 확인해주길 바란다^^ <del>절대 덜 짜서 그런게 아니다</del></p>
</li>
<li><p>퍼즐 요소
이거 진짜진짜 진짜..하루종일 회의했는데 아직도 의견이 제대로 안 잡혔다.
일단 팀원들끼리 생각하고 있는 퍼즐에 대한 개념이 각자 달라서</p>
</li>
</ol>
<ul>
<li>비밀번호 맞추기</li>
<li>퍼즐을 풀었을 때 아이템이 나옴</li>
<li>특정 키워드를 찾는 퍼즐, 맞춤법 수정 퍼즐 등</li>
<li>특정 아이템을 모으면 탈출</li>
<li>퍼즐 : 퀴즈 -&gt; 골든벨 형식</li>
</ul>
<p>...일단 이정도로 팀원들이 생각나는대로 다 받아 적었다.
이후 내용에서 정리 될 예정.</p>
<ol start="5">
<li><p>와이어 프레임
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/05d82eff-9a15-48e9-97d0-9358666327c6/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/7108115b-4fb2-4f71-80b4-b3973e616fca/image.png" alt=""><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/207eeffc-a552-40a0-9657-1f888b4eb620/image.jpg" alt="">
진짜 허접하게나마 그렸는데 진짜 이렇게밖에 표현이 안된다 아직은... 훌쩍...</p>
</li>
<li><p>역할분담</p>
</li>
</ol>
<ul>
<li>필수 구현사항<ol>
<li><strong>퍼즐 디자인</strong> (난이도: ★★★☆☆)<ul>
<li>다양한 퍼즐을 게임에 디자인하고 구현하여 게임의 핵심 플레이를 제공합니다.</li>
<li>퍼즐의 난이도와 다양성을 고려하여 설계합니다.</li>
</ul>
</li>
<li><strong>플레이어 캐릭터 및 컨트롤</strong> (난이도: ★★★☆☆)<ul>
<li>플레이어 캐릭터를 제작하고, 캐릭터를 조작할 수 있는 컨트롤러를 구현합니다.</li>
<li>필요한 도구나 능력을 제공하여 퍼즐을 해결할 수 있도록 합니다.</li>
</ul>
</li>
<li><strong>퍼즐 해결 시스템</strong> (난이도: ★★★☆☆)<ul>
<li>퍼즐 해결에 필요한 시스템을 구현하고, 퍼즐의 상호작용 및 해결 방법을 설계합니다.</li>
<li>퍼즐 요소의 동작 메커니즘과 규칙을 구현합니다.</li>
</ul>
</li>
<li><strong>장애물 및 트랩</strong> (난이도: ★★★☆☆)<ul>
<li>장애물과 트랩을 게임에 추가하여 플레이어의 도전을 높이고 퍼즐과 조화롭게 결합시킵니다.</li>
</ul>
</li>
<li><strong>목표 지점</strong> (난이도: ★★☆☆☆)<ul>
<li>퍼즐을 풀고 목표 지점에 도달할 수 있는 목표 지점을 제공합니다.</li>
<li>목표 지점 도달로 레벨 완료를 처리합니다.</li>
</ul>
</li>
<li><strong>게임 진행 상태 및 저장</strong> (난이도: ★★★☆☆)<ul>
<li>퍼즐 해결 상태와 게임 진행 상태를 저장하고 관리하는 시스템을 구현합니다.</li>
<li>플레이어의 진척 상황을 추적하고 레벨 별로 관리합니다.</li>
</ul>
</li>
<li><strong>사운드 및 음악</strong> (난이도: ★☆☆☆☆)<ul>
<li>게임에 사운드 효과와 음악을 추가하여 게임의 분위기를 개선합니다.</li>
</ul>
</li>
</ol>
</li>
</ul>
<p>우선 필수 구현사항이 이정도가 있는데, 퍼즐 요소도 그렇고 각자 다른 생각을 가지고 있기도 하고, 첫 3D 과제인다 바로 역할분담을 했다간 비교적 난이도가 낮은 파트 팀원의 공부량이 상대적으로 모자랄 것 같다는 판단을 내렸다.</p>
<p>그래서 우리팀은 연휴동안 각자 필수 구현사항을 할 수 있는 만큼 구현을 한 후에, 제일 괜찮은 팀원의 것을 기초 틀로 해서 살을 붙여넣는 식으로 하기로 했다.</p>
<p>....... 왜 벌써 눈물이 나지.......
일단 화이팅이다.......</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240206 - 개인과제 4일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240206-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-4%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240206-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-4%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 06 Feb 2024 11:59:42 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
발등에 불떨어졌다.
빨리 진행하자.</p>
<h3 id="개인과제">개인과제</h3>
<p>오늘 한 일
UI 엄청나게 만지기.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/cea33d70-80ef-4cc6-b881-f5898a7776b0/image.png" alt="">자 로그인 창에서 하단의 회원가입 버튼을 누르면
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/f55aa98a-02fc-45f2-b5b3-d75100023939/image.png" alt="">짜잔 팝업이 나온다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/0352d0df-8bec-47eb-9f13-a3884be5d62d/image.png" alt="">회원가입 팝업은 회원가입 버튼을 클릭시 보이고, 팝업창에서 회원가입 완료나 취소를 눌러야만 꺼지므로 SetActive로 만져준다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/bc0b8fda-0d3f-45ea-abfc-a664891b0cd7/image.png" alt="">점점 하이어라키 창이 더러워져서 정리를...해야 하는데... 죄다 캔버스라 어떻게 손댈 수가 없네...</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/eaddbbf5-7526-4ed2-8a8c-d2591cc8941e/image.png" alt="">
여기서 이제 유저가 사용할 ID, 이름, 비밀번호를 저장할 스크립트를 짠다
찾아본 방법중에 제일 간..단...해보이는 방법이 바로...
<strong>PlayerPrefs</strong>
얘는 데이터를 메모리 상에 저장하고, 이를 하드 드라이브에 저장한다.</p>
<p>여러가지 함수가 있는데 간단히 정리하면
DeleteAll() : 모든 데이터를 삭제. 이 함수를 사용할 경우 경고 메시지가 출력됨
DeleteKey(String Key) : Key와 대응하는 값을 삭제
HasKey(String Key) : Key가 존재하는지 확인
Save() : 수정된 모든 preferences를 파일에 저장</p>
<p>또한 PlayerPrefs은 int, float, string 타입의 데이터를 저장하도록 <strong>Set 함수</strong>를 제공
SetInt(string Key, int value) :  Key 값으로 int 형 데이터를 저장
SetFloat(string Key, float value) : Key 값으로 float 형 데이터를 저장
SetString(string Key, string value) : Key 값으로 string 형 데이터를 저장</p>
<p>그리고 <strong>Get 함수</strong>도 제공.
GetInt(string Key) : Key 값으로 저장된  int 형 데이터를 불러옴.
GetFloat(string Key) : Key 값으로 저장된 float 형 데이터를 불러옴.
GetString(string Key) : Key 값으로 저장된 string 형 데이터를 불러옴.</p>
<p>어렵다 어려워,,,</p>
<pre><code>using UnityEngine;
using UnityEngine.UI;

public class MembershipRegistration : MonoBehaviour
{
    public InputField IdInput;  //아이디 입력 필드
    public InputField nameInput;   // 이름 입력 필드
    public InputField passwordInput;   // 비밀번호 입력 필드
    public Button registerButton;      // 회원 가입 버튼

    private void Start()
    {
        // 회원 가입 버튼의 onClick 이벤트에 함수를 연결
        registerButton.onClick.AddListener(RegisterUser);
    }

    private void RegisterUser()
    {
        string id = IdInput.text;           //입력된 id 
        string username = nameInput.text;    // 입력된 이름
        string password = passwordInput.text;    // 입력된 비밀번호

        if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(username))
        {
            Debug.LogWarning(&quot;아이디, 이름과 비밀번호는 비어있을 수 없다.&quot;);
            return;
        }

        // id가 이미 존재하는지 확인
        if (PlayerPrefs.HasKey(id))
        {
            Debug.LogWarning(&quot;이미 사용자가 존재함.&quot;);
            return;
        }

        // PlayerPrefs를 사용하여 사용자 데이터를 저장
        PlayerPrefs.SetString(id, username);
        PlayerPrefs.SetString(id, password);
        PlayerPrefs.Save();

        Debug.Log(&quot;사용자 등록 완료: &quot; + username);
    }
}</code></pre><p>일단은 처음 써보는거라 ID, 이름, 비밀번호 형태 상관없이 싹 string으로 밀고 시작했다.
근데 이게 3개의 값이 매칭이 되어야 불러오는데,, 마지막에 SetString에서 좀 문제가 발생했다.
id와 비밀번호만 키:밸류값으로 설정했을때는 문제없이 작동하는데, 이름까지 끼워버리는 순간
그.. 예... 오류가 남...</p>
<p>하...... 오늘도 밤을 지새워야 할 것 같다...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240205 - 개인과제 3일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240205-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240205-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Mon, 05 Feb 2024 11:55:22 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘 한 일은 <strong>개인과제 뿌수기</strong>
2개 다 하고 싶은데 막상 과제 1개 시작하니까,,,갑자기 막막함을 느낌,,,
일단 해보자</p>
<blockquote>
<h3 id="과제1---atm-시스템-만들기">과제1 - ATM 시스템 만들기</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/61742a69-a7ac-4049-9bd2-c86e5a390f88/image.png" alt="">필수 요구사항</p>
<ol>
<li>ATM 화면 구성
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b754d749-5db4-4e6c-ace5-e8f57aeee4dd/image.png" alt=""></li>
</ol>
<ul>
<li>타이틀(스파르타 뱅크 ATM)</li>
<li>이름(필수 요구만 하면 그냥 텍스트로 쓸거지만.. 추가구현 하면 이렇게 하면 안됨.)</li>
<li>잔액(내 계좌에 얼마가 들어있는지, 기본 5만원)</li>
<li>현금(내가 현금을 얼마나 들고있는지, 기본 10만원)</li>
<li>입금버튼(버튼 누르면 입금기능으로 이동)</li>
<li>출금버튼(출금기능으로 이동)</li>
</ul>
<ol start="2">
<li>입금 기능
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/586e8fed-d784-4427-a738-77f646662630/image.png" alt=""></li>
</ol>
<ul>
<li>버튼을 누르면 해당 금액만큼 현금-&gt;잔액으로 이동</li>
<li>직접 입력을 이용하면 입력한 금액만큼 입금</li>
<li>뒤로가기 버튼을 누르면 1번 화면(ATM 메인)으로 이동</li>
</ul>
<ol start="3">
<li>출금 기능</li>
</ol>
<ul>
<li>입금이랑 똑같은데 입금이 아니라 출금.</li>
<li>해당 금액만큼 잔액-&gt;현금으로 이동</li>
</ul>
<p>그리고 선택요구사항
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/640b807a-ec33-47d4-a6b5-252d88582d5b/image.png" alt="">
.... 하.... 일단 해보자.</p>
<blockquote>
<h3 id="과제-시작">과제 시작</h3>
</blockquote>
<p>이번엔 필수+선택요구사항 둘다 뿌수기로 마음먹었다.
그러기로 했다. 이 과제랑 2번째 과제도 욕심나니까 둘다 할거다. 아무튼 할거임</p>
<p>일단 메인씬 2개를 구성해준다
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/8df6bd96-cda8-40b5-beb1-7cb26346d801/image.png" alt="">로그인씬에서 뭔갈 하면 ATM씬으로 넘어갈 수 있도록.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/3eedf3c6-1ff4-47d8-91b3-1f704e2d4c5d/image.png" alt="">로그인씬.
Input Field를 활용하면 회원가입 및 로그인을 만들 수 있다고 한다.
현재는 틀만 만들어놓고 아직 기능 구현은 안해둔 상태.
회원가입창은 팝업으로 띄우도록 해야겠다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/bbeaef5c-60a9-4b7d-a56c-92a4ea4e3479/image.png" alt="">그 전에!! 게임 뷰가 너무 커서 직접 비율을 수정한 후 새로운 뷰를 만들었다.
너무 커서 부담스러웠음..</p>
<p>ATM 메인씬.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d01c240a-c017-422b-a4f7-f13f6d28545f/image.png" alt="">
현재 사용자의 현금과 계좌 잔액을 확인하고 입금, 출금 여부를 결정 할 수 있다.</p>
<p>참고로 기능은 아직 구현 안됐다ㅋㅋ!!
오늘은 틀만들기만 해놓고 스크립트 하나씩 둘씩 붙일 예정이니까...</p>
<p>... 자 이건 이제 내일의 내가 하도록 하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240202 - 개인과제 2일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240202-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240202-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 02 Feb 2024 11:53:50 GMT</pubDate>
            <description><![CDATA[<p>반갑다.</p>
<p>오늘은!
<strong>Unity-깃허브 데스크탑 연동 세팅</strong>에 대해 배웠다.
사실 강의도 들었는데... 오늘의 핫이슈는 역시 이 연동법인 것 같아서 작성한다.</p>
<ol>
<li><p>유니티 프로젝트 새로 추가(경로에 한글 이름 있으면 안됨!!)
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/77081535-c1cc-4535-9042-da4cc487f809/image.png" alt="">이건 일단 예시라 파일 위치에 한글 이름이 있지만... 있으면 안된다고 한다...</p>
</li>
<li><p>깃허브 데스크탑에서 새 레포지토리 생성
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/e47da687-ff56-4b8a-9cba-248017720693/image.png" alt=""></p>
</li>
<li><p>만들었던 유니티 프로젝트로 경로를 설정
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/5436b3eb-31ee-457c-a248-14ca4f1a6644/image.png" alt="">
근데 이때!! 유니티 프로젝트 이름을 레포지토리 이름으로 잘라넣기!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/5db4813d-d24e-4d6a-a159-1e6c596eb6ff/image.png" alt=""></p>
</li>
<li><p>레포지토리 생성 후 퍼블리싱
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/158c76c3-08d5-42f7-9ef8-b179b02d7cf8/image.png" alt=""></p>
</li>
<li><p>깃허브 웹에 잘 올라가있는지 확인!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/acbe6281-998a-47e9-9f25-71152df79823/image.png" alt="">
.git~들과 프로젝트 파일이 같이 있는게 아닌, 바로 프로젝트 파일 내에 있는 모든 파일들이 보여야 정상적으로 올라간 것이다.</p>
</li>
<li><p>연동 잘 되는지 확인!
유니티에서 수정을 하고 푸쉬가 잘 되는지 확인해보자
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/a9b56432-3ff7-48b7-963e-02e20f6c139b/image.png" alt="">대충 폴더 하나를 만들고, 씬 이름을 수정했다.
그리고나서 깃허브 데스크탑에 푸쉬를 하면...
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/fa551141-1999-4793-b14a-78a3046264be/image.png" alt="">짜잔.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/aa027c2b-f454-4c0b-a5a9-6050b838fc22/image.png" alt="">수정사항들 또한 웹 깃허브에 잘 올라간 것을 확인할 수 있다.</p>
</li>
</ol>
<p>이제 이러면 실시간으로 깃허브에 올릴 수 있게 된다. 후후후...
...팀과제를 벌써 2번이나 했는데 이걸 이제 알게 된건... 내가 팀프로젝트 생성을 한번도 안해봐서...
하지만 어제 스크럼 시간에 깃허브 연동 얘기가 나온 김에 잘 알고 있는 팀원에게 배웠다.</p>
<p>...
팀 편성 짱!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240201 - 개인과제 1일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240201-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240201-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 01 Feb 2024 11:57:09 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
엊그제 팀프로젝트 끝나고... 약간의 이슈로... TIL 못적었다...ㄱ-
오늘차 TIL에 적는건,,에반가,,,? 아니 전혀 아니야 그냥 적어야지...</p>
<ol>
<li>개인과제</li>
<li>저번 팀과제 후기</li>
</ol>
<p>=======================================================</p>
<blockquote>
<h3 id="개인과제---강의">개인과제 - 강의</h3>
</blockquote>
<p>이번 강의는 Unity3D게임 구현하기.
근데 나는 분명... 하라는 대로 했는데...왜...
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/cbaed513-c144-4e2c-80ab-22c26efaa1b1/image.png" alt="">여기서는 플레이어가 멀쩡히 보이는데
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/08e328d9-9bb8-45a9-85fc-4a1861b51c23/image.png" alt="">게임 실행만 하면 땅에 박혀서 나올 생각을 안하신다
아오!!!!!!!!왜이러냐고!!!!!!!!!!
.
.
.
정답은 <strong>내가 강의를 제대로 안봐서다.</strong>
강의를 다시 돌려보니 <strong>CameraContainer의 포지션Y값을 1.7로 맞추라고</strong> 했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/dd240048-8900-46cb-955a-64c7db6b0137/image.png" alt="">
이러니 플레이어가 바닥에 박혀있을 수밖에 없지ㅋㅋ 높여주자
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/6e26ccb1-ec14-44f7-a8a0-225b9965cd9a/image.png" alt="">
드디어 플레이어가 지면을 밟을 수 있게 되었다. 하.......</p>
<p>그리고 오늘 강의중 굉장히.. 뭔가 뭔가인? 인상적인? 설명, 낮과 밤 구현 스크립트인 DayNightcycle에서
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/9d4d51bf-3386-4f20-940e-51c0ed0cc857/image.png" alt="">예를들어 지구를 4등분 하면, 절반은 낮이고 절반은 밤이므로 noon은 지구의 0.25에 오는 지점.
해와 달은 반대로 공전하므로 해가 지고 달이 noon에 왔을 때는 0.75. 그 상태를 90도에 곱한다.
( 해 기준 0도 = 0, 90도= 0.25, 180도= 0.5 , 270도=0.75 ... )
그렇게 해서 360도를 기준으로 해가 뜨는 위치와 달이 뜨는 위치를 잡아준다.
... 아직 이해가 추상적으로밖에 되지 않았지만 얼추 알아들었다. <del>공부 다시.</del>
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/14f6254d-18da-42a8-be53-90715ebae2ea/image.png" alt=""><del>그래프 만들다가 눈 빠지는줄</del></p>
<blockquote>
<p>델타타임과 코루틴 (다시!!!!!!!!!공부해!!!!!!!!!!)</p>
</blockquote>
<p>Time.deltaTime : 사용자의 컴퓨터 성능에 따라 변하는 값.
이것도 추상적으로 개념을 이해해서 다시... 공부 해야함...
코루틴 : 특정 코드가 반복적으로 실행되기 위해 Update함수 대신 쓰는 것!!!! (Update문에 전부 때려박을 수 없으니까..)
코루틴 사용법</p>
<ol>
<li>IEnumerator 반환형으로 시작해야함</li>
<li>yield return 반드시 함수 내부에 존재.
ex)<pre><code>IEnumerator 함수이름()
{
 yield return // + 조건
 // 함수 내용
}</code></pre></li>
</ol>
<p>yield return 의 종류</p>
<ol>
<li><p>yield return null; : 다음 프레임에 실행 됨. </p>
</li>
<li><p>yield return new WaitForSeconds( float ); : 매개변수로 입력한 숫자에 해당하는 초만 큼 기다렸다가 실행됨. // 유니티상에서의 시간을 기준으로 체크</p>
</li>
<li><p>yield return new WaitForSecondsRealtime( flaot ); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨. // 현실시간을 기준으로 체크</p>
</li>
<li><p>그외 : yield return + new WaitForFixedUpdate / WaitForEndOfFrame 등...</p>
</li>
<li><p>yield break; // 코루틴 종료</p>
</li>
</ol>
<p>TimeScale 영향 받는 것 &gt;&gt;&gt; 2번, (3번은 영향 안받음)</p>
<p>코루틴 내부에 for문이나 while문을 사용해준다면 Update문은 따로 동작하면서도 마치 업데이트문처럼 매 프레임마다 반복되게 할 수 있다.
만약, 업데이트문에 이런 반복문을 쓰게 되면 해당 반복이 끝날 때까지, 반복문 아래에 있는 코드들은 전혀 실행이 되지 않는다.
그러나 코루틴에서 반복문을 사용하면 Update와는 별도로 동작하기 때문에 모든 스크립트가 정상적으로 동작하게 된다.</p>
<p>이렇게까지 봐도 추상적으로밖에 이해가 되지 않는다... 계속 써봐야 늘겠지...휴...</p>
<blockquote>
<h3 id="저번-팀과제-후기">저번 팀과제 후기</h3>
</blockquote>
<p><del>하하 어제 썼어야 했는데 오늘 씁니다!!</del>
사실은... 저번 개인과제를 엄청나게 말아먹고 자신감이 0이 되다못해 지하를 뚫고 나락을 간 시점에서 팀과제가 시작되었다. 사실은 그냥 강의만 열심히 들어도 할 수 있었던 과제였는데도 현생에서 악운이 여럿이 겹쳐서 도저히 강의를 들을 수 있는 멘탈이 아니었다.</p>
<p>때문에 팀 과제에서 파트 나누기 중에서도 그나마 제일 해볼만해 보이는 파트가 사운드였지만, 아주 크나큰 오산이었다. 사운드 파트는 강의를 찾아보거나 구글링을 해도 해결할 수 없는 부분이 정말 많았다. 이와중에 팀원과의 깃허브 병합과정에서 충돌도 엄청나게 일어나 멘탈이 정말 산산조각이 났다.</p>
<p>그런 와중에도 팀원들은 병합충돌문제의 해결책들을 계속 가져와 해결을 했고, 팀원들 각각이 구현과정에서 문제가 발생해도 어떻게든 해결을 하는 모습을 보여주었는데, 이렇게 모두가 열심히 하는데 나 혼자 멘탈이 나갔다고해서 아무것도 하지 않을 순 없었다. 강의를 보고 해결이 안되면 구글링을 해보고, 그래도 해결이 안되면 튜터님께 찾아가 질문을 하고...</p>
<p>이번 팀과제에서는 어떤 새로운 코드를 배웠다가 중점이라기보다는 팀원들의 모습에 동기부여를 얻고 자신감을 얻은게 더 큰 것 같다. 팀프로젝트를 왜 자꾸 시키나 했더니 이런 것도 배울점이 있으니 시킨다는 것을 확실히 알았고... 다음 프로젝트에서는 더 열심히 해야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240130 - 팀과제 5일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240130-%ED%8C%80%EA%B3%BC%EC%A0%9C-5%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240130-%ED%8C%80%EA%B3%BC%EC%A0%9C-5%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 30 Jan 2024 11:17:10 GMT</pubDate>
            <description><![CDATA[<p>와 어제 TIL 제출한줄 알았더니 임시저장만 해놓고 안낸거 실화냐?? <del>진짜 가슴이 옹졸해진다</del>
지금 쓰려고 들어왔다가 확인했다... 또 머리가 뜨거워지네...
오늘 한 일 요약</p>
<ol>
<li>코드카타</li>
<li>스크럼</li>
<li>팀과제</li>
</ol>
<p>==================================================</p>
<blockquote>
<h3 id="코드카타">코드카타</h3>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/856086b6-4e33-43b4-beab-a5e162a94181/image.png" alt="">
이거... 되게 간단한 것 같은데 또 기억이 나지 않는다...
결국 금단의 답안지를 보게 되는데...</p>
<pre><code>public class Solution {
    public int solution(string s) {
        int answer = int.Parse(s);
        return answer;
    }
}</code></pre><p>Parse로 단 한줄만에 해결
진짜 천재인거같다... 나같이 아예 기억 못하는게 아니라 뭔가를 알고 있어서 한참 코드 짜던 사람들은 저 한줄만 보면 진짜 현타올 것 같기도...</p>
<blockquote>
<h3 id="스크럼">스크럼</h3>
<p>이제 뭘 할까?</p>
</blockquote>
<p>우리 천재 팀원들이 벌써 필수구현사항을 다 구현하고 이제 다음 선택사항을 뭘 할지 고민중이다.
일단은 캐릭터 선택, 모드 추가등을 생각하고 있다고 한다.
모드 추가되면 또 신나는 배경음 넣을 생각에 몸이 근질근질함ㅋㅋ</p>
<blockquote>
<h3 id="팀과제">팀과제</h3>
<p>사운드 넣기</p>
</blockquote>
<p>사실 사운드 넣기로 2가지 방법을 생각해놨다.</p>
<ol>
<li>SoundManager로 배경음 및 효과음 전체 총괄</li>
<li>각각의 씬, 오브젝트, cs파일에 필요한 코드만 붙여넣기
인데... 1번으로 한다면 필요한 오브젝트 각각 찾아서 SoundManager를 붙여줘야하고... 찾다가 빠진거 있으면 다시 찾아봐야하고....</li>
</ol>
<p>그래서 그냥 필요한 파일에 그때그때 붙여주는 방법을 선택했다.
<del>절대 사운드 매니저 만지기 버거워서 그런거 아님.</del></p>
<pre><code>// clawdoll.cs 집게 땅에 닿을 때 사운드
AudioSource CrawSound = GetComponent&lt;AudioSource&gt;();
CrawSound.Play();

Transform clawTransform = collision.transform;
transform.SetParent(clawTransform);
checkMove = false;
boxCollider2D.enabled = false;
gameObject.tag = &quot;ClawDoll&quot;;

// clawdrop.cs 플레이어가 집게에 닿을 때 소리
GameObject.Find(&quot;IfyouCaught&quot;).GetComponent&lt;AudioSource&gt;().Play();</code></pre><p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/797e9d34-c687-418f-b673-2efb8c99040d/image.png" alt="">플레이어가 집게에 닿았을 때는 오브젝트로 실행하도록 따로 빼고.
플레이어가 집게에 닿았을 때, 집게가 땅에 닿았을 때의 효과음을 추가했다.</p>
<p>버튼 효과음도 넣으려 했는데 팀원이 또 다른 버튼을 추가한다고 해서 일단은 놔뒀다.</p>
<p>근데, 문제가 생겼다.
게임오버를 씬이 아닌 팝업으로 처리했다.
씬에다 배경음을 넣는건 아는데...이제 팝업에다 게임오버배경음을 넣어야 하는데....
내일 당장 발표인데......................</p>
<p>그래도 해야지................</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240129 - 팀과제 4일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240129-%ED%8C%80%EA%B3%BC%EC%A0%9C-4%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240129-%ED%8C%80%EA%B3%BC%EC%A0%9C-4%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 30 Jan 2024 10:53:14 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘 한 일</p>
<p>요약</p>
<ol>
<li>코드카타</li>
<li>스크럼 - 트러블 슈팅</li>
<li>팀과제</li>
</ol>
<blockquote>
<h3 id="코드카타">코드카타</h3>
<p>17번 문제</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/14b9c74b-e29c-4a92-854b-e6a01a63c597/image.png" alt="">
일단... 배열을 문자열로 받아서 뒤집어야한다는거 까지는 알겠다.
예전에 자바 공부할 때 배열 뒤집기에 대해서 배운 것 같은데...진짜 까먹었다. <del>미치겠네</del>
결국 또 구글링의 힘을 빌려서...</p>
<pre><code>public int[] solution(long n) {
 string str = n.ToString();
 int[] answer = new int[str.Length];</code></pre><p>string 타입의 str를 만들고 그 안에 long타입으로 입력받은 n을 ToString()을 통해 string타입으로 변환하고 시작코드에 이미 만들어져있던 answer의 길이를 str.Length로 정의해준다.</p>
<pre><code>for(int i=0; i&lt;str.Length; i++){
            answer[i] = int.Parse(str[i].ToString());
        }
        Array.Reverse(answer);
        return answer;</code></pre><p>for문을 str의 길이만큼 돌려서 인덱스 순서대로 answer에다가 str를 string으로 변환시킨것을 Parse를 통해 int형으로 다시 변환.</p>
<p>변환시켜 answer에 담긴 것을 Reverse를 통해 뒤집어준 뒤에 정답을 리턴.
요약 : string &gt; int변환을 거쳐 Array.Reverse()로 배열을 뒤집기</p>
<p>따라서 정답은</p>
<pre><code>using System;
using System.Linq;

public class Solution {
    public int[] solution(long n) {
        string str = n.ToString();
        int[] answer = new int[str.Length];
        for(int i=0; i&lt;str.Length; i++){
            answer[i] = int.Parse(str[i].ToString());
        }
        Array.Reverse(answer);
        return answer;
        }
    }</code></pre><p><strong>왜 이런 과정을 거쳐야 하냐!</strong>
<em>가장 먼저, ToString()은 string타입으로 변환시키는 것은 쉽게 알 수 있지만 왜 변환시키는가를 봐야합니다. 해당 풀이 방법에서는 for문을 통해 str를 인덱스에 접근하는 방식으로 answer배열에 저장하기 때문인데 인덱스로 접근하기 위해서는 string타입으로 바꿔주어야 하기 때문입니다. 그리고 비슷한 이유로 문자열을 인덱스로 접근하게 되면, str[i] 는 Char 타입이 되기 때문에 string으로 다시 복구시켜준다음, int.Parse()를 통해 int형으로 변환시켜줍니다. 마지막으로 Array를 통해 배열에 관련된 함수들을 사용할 수 있는데 그 중에서 Reverse()를 사용하여 배열의 배치를 거꾸로 뒤집어 [1,2,3,4,5] 가 [5,4,3,2,1] 이 되게 합니다.</em></p>
<p>라고 한다. 이번 문제는 분명히 내가 배열 뒤집기를 알고 있었으면서.. 기억력 이슈로 원활하게 코드끼리 이어나가지 못 한게 큰 것 같다...ㄱ-...</p>
<blockquote>
<h3 id="스크럼---트러블-슈팅">스크럼 - 트러블 슈팅</h3>
</blockquote>
<p>오늘은 팀원들과 각자 짠 코드를 합쳤다.
근데...병합 도중 메인씬이 집나가버렸다..
나도 당황 팀원도 당황...급하게 튜터님에게 뛰어가서 해결해왔다.
!!병합도중 씬(또는 파일)이 사라졌을 때!!</p>
<ol>
<li><p>이전 히스토리에서 checkout 하기
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/5b405e05-6284-4ca4-8df3-097ae093cec9/image.png" alt=""></p>
</li>
<li><p>해당 히스토리에 아직 존재하는 씬(또는 파일)을 export package
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/88d76969-727c-4692-a4e2-090bf50d7da0/image.png" alt=""></p>
</li>
<li><p>include dependencies 체크해제(씬에 연결된 것들이 필요하면 체크)하고 컴퓨터에 저장
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/e0775f5c-e813-4aa4-94c2-16ff63e6841d/image.png" alt=""></p>
</li>
<li><p>충돌했던 히스토리로 돌아가서 날아간 씬 import package하기</p>
</li>
</ol>
<p>그럼 복구 가능!
근데 이 방법은 오로지 씬만 사라져서 복구할수있었던거라...이 외에도 다른것들이 사라지면 골치 많이 아플테니 <strong>병합하기전에 꼭 확인할 것...</strong></p>
<blockquote>
<h3 id="팀과제">팀과제</h3>
</blockquote>
<p>오늘은... 팀원들이 올려주는 브런치 기다리는 날...
음악 특성 상 다 만들어진 게임에 효과음만 덧씌우는 느낌이라... 개인공부&amp;그럴싸한 효과음만 찾았다.
아마 오늘 제일 큰 이슈가 트러블슈팅..일 정도로 무난무난하게 보냈다.</p>
<p>귀여운 효과음들 엄청 많이 찾았다ㅋㅋ 빨리 자랑하고싶어서 근질근질....</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240126 - 팀과제 3일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240126-%ED%8C%80%EA%B3%BC%EC%A0%9C-3%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240126-%ED%8C%80%EA%B3%BC%EC%A0%9C-3%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Fri, 26 Jan 2024 11:11:07 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘 한 일? 엄청 많다. <del>나름..</del>
바로 정리하자</p>
<p>요약</p>
<ol>
<li>코드카타</li>
<li>스크럼 - 트러블 슈팅</li>
<li>팀과제</li>
</ol>
<p>=================================================</p>
<blockquote>
<h3 id="코드카타">코드카타</h3>
</blockquote>
<p>오늘의 문제! 두굳구둑ㄷ구굳국두구
16번문제.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/d94405aa-5490-4ab5-84a3-af41ab6e48d7/image.png" alt="">
와 이게 뭔소리지?
&quot;x만큼&quot; 간격이 있는 &quot;n개&quot;의 숫자... 내가 지금 문장을 잘 읽고 있는게 맞나...?
아니 일단.. 그래...
예를 들어 x=2, n=5를 입력받았다면 2부터 시작해 2씩 증가하는 숫자를 5개 지니는 리스트를 리턴해야한다. 그럼 2에서 2씩 증가하는 숫자 5개는 2,4,6,8,10 이니까 [2,4,6,8,10]이라는 리스트를 받아야한다.</p>
<p>.... 이걸 어떻게 구현해야하나요......<del>미치겠네....</del>
일단 진정하고.. 작성 예시 코드를 보자</p>
<pre><code>public class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[] {};
        return answer;
    }
}</code></pre><p>예시코드에서 배열answer를 long타입으로 선언했다. 그럼 new long[] 안에는 n을 넣어야 쓸 수 있을 것 같다.</p>
<pre><code>long[] answer = new long[n];</code></pre><p>그리고 for문으로 시작하자....배열 answer는 x를 i+1만큼 반복하여 더하고, 이걸 n번만큼 반복해서 수행해야하면..</p>
<pre><code>for(int i = 0; i&lt; n; i++){
    answer[i] = x * (i + 1);
    }</code></pre><p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/526d8dc7-a076-497d-a975-b04ce765e9cb/image.png" alt="">일단 테스트는 통과했다. 근데 뭔가 뭔가.. 뭔가임. 엄청 찝찝함.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/5a49c472-b23e-41b1-8b95-2355e7481c86/image.png" alt="">역시나 채점에서 막혔다.</p>
<p>정답은!!
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/6d3d0103-b960-4329-b4ae-d4ab52edfdea/image.png" alt="">진짜 생각도 못했다...잠이 덜 깼나? 아니 오버플로우를 제가... 생각할 수 있었으면,,, 벌써 회사 들어가있겠지요...?
하지만 이제 생각해야해... 개발자 하고 싶잖아.....ㅠ
그래서 전체 코드는</p>
<pre><code>public class Solution {
    public long[] solution(int x, int n) {
        long[] answer = new long[n];
        for(int i = 0; i&lt; n; i++){
            answer[i] = (long)x * (i + 1);
        }
        return answer;
    }
}</code></pre><p>.......하........... 하루하루 문제를 풀 때마다 아맞다 이거!! 아맞다 이거!! 하면서 자꾸 한큐에 못 풀고 꼭 모범답안을 찾아보게 된다....</p>
<blockquote>
<h3 id="스크럼---트러블-슈팅">스크럼 - 트러블 슈팅</h3>
<p><strong>!! 동시에 씬 수정시 컨플릭트 발생하여 한 사람 작업 외에는 다 사라지는 현상 !!</strong></p>
</blockquote>
<p>예방법</p>
<ol>
<li>씬 수정을 같이 할 때, push 하기 전에 컨플릭트 있는 부분이 있을지 사전에 체크.</li>
<li>먼저 push 를 했다면, 나중에 push를 하는 사람이 push 적용 된 것을 pull 하고 컨플릭트 요소 있는지 체크하고 자신의 자료와 병합한 뒤 push.</li>
<li>만약 나중에 push 하는 사람의 작업량이 더 많다면 작업량이 적은 분이 2번의 과정을 거치고 push.</li>
</ol>
<p>어제도 이 얘기를 들어서 나는 아예 처음부터 팀원들과 씬이름이 겹치지 않도록 했다.
이 방법도 말해주니 팀원들이 괜찮다고 했던 것 같다.</p>
<p>일단 내가 작업하고 있는건 나만 알아먹을 수 있으면 되니까...응... 컨플릭트 나면 골치아프잖아요...히히..</p>
<blockquote>
<h3 id="팀과제">팀과제</h3>
</blockquote>
<p>과제를 위해 기초 토대를 만들고 팀원들의 코드들과 상의해서 제일 나은 것을 뽑기로 했다.
일단 현재 내 진행 상황은</p>
<ol>
<li>게임 시작 씬 설정 - 버튼 클릭 시 (메인게임으로) 씬전환</li>
<li>배경음 및 효과음 추가</li>
</ol>
<p>정도로... 아무래도 담당이 사운드다보니까 사운드 고르느라 시간을 좀 많이 써서 메인게임 구현까지는...
아 해야되는데....
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/feadc26f-1005-4398-89c3-b169954eaf38/image.gif" alt="">각각의 버튼들에 커서를 올릴 때와 클릭 시 하이라이트를 주어 유저가 어떤 버튼을 누르는지 잘 보일 수 있도록 했다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/4c7dfdc6-6cfe-42b5-b142-3f59ee85f42a/image.gif" alt="">
현재는 메인게임씬에서 플레이어 움직임 구현까지 해냈다!</p>
<pre><code> public float speed = 3; // 속도：Inspector에 지정
 public float jumppower = 8;  // 점프력：Inspector에 지정</code></pre><p>속도와 점프 크기를 지정해준다. 스테이지마다 플레이어의 난이도를 높여야 할 것을 고려해서 인스펙터창에서 쉽게 바꿀 수 있도록.. 현재는 이 정도로 지정</p>
<pre><code>float vx = 0;
bool leftFlag = false; // 왼쪽 방향인지 
bool pushFlag = false; // 스페이스 키가 눌린 상태인지 
bool jumpFlag = false; // 점프 상태인지 
bool groundFlag = false; // 발이 무언가에 닿았는지 </code></pre><p>플레이어의 방향 여부와 점프 하기 전 충돌 여부를 설정해준다.
공중에서 무한체공 하면 안되니깐...</p>
<pre><code>if (Input.GetKey(&quot;right&quot;)) // 만약 오른쪽 키가 눌리면
{ 
    vx = speed; // 오른쪽으로 진행하는 이동량을 넣는다
    leftFlag = false;
}
if (Input.GetKey(&quot;left&quot;)) // 만약 왼쪽 키가 눌리면
{ // 
    vx = -speed; // 왼쪽으로 진행하는 이동량을 넣는다 
    leftFlag = true;
}
// 만약 스페이스키가 눌렸을 때 발이 무언가에 닿았다면 
if (Input.GetKey(&quot;space&quot;) &amp;&amp; groundFlag)
{ 
    if (pushFlag == false)// 계속 누르고 나가지 않으면
    { 
        jumpFlag = true; // 점프 준비 
        pushFlag = true; // 계속 누른 상태 
    }
} else
{
    pushFlag = false; // 계속 누른 상태 해제 
}</code></pre><pre><code>void OnTriggerStay2D(Collider2D collision)
{ // 발이 무언가에 닿으면 
    groundFlag = true;
}
void OnTriggerExit2D(Collider2D collision)
{ // 발에 아무 것도 닿지 않으면 
    groundFlag = false;
}</code></pre><p>점프할 때 충돌을 트리거로 해서 충돌중인 상태면 점프가능, 충돌x일때 점프 불가로 제어해준다.
아니 근데 점프가 안돼
왜
왜안돼
왜!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
고쳐야겠다...ㄱ-...
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/432a544d-35e2-45cd-ae9e-e0df9b4ec889/image.png" alt="">브금도 넣어서 들려주고싶은데 여기서는 들리지 않는 것 같다ㄱ-..</p>
<p><strong>해결할 것</strong></p>
<ol>
<li>버튼 클릭시 효과음 처리</li>
<li>QUIT 버튼 클릭 시 게임 종료 처리</li>
<li>메인게임씬..대충이라도 더 만들어보기...(플레이어 점프 수정!!!!)</li>
<li>팀원들과 더 많은 에셋 공유</li>
</ol>
<p>배경음 넣는건 쉬웠는데 효과음 넣는게 너무... 어렵다.
아직 공부가 많이 필요하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240125 - 팀과제 2일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240125-%ED%8C%80%EA%B3%BC%EC%A0%9C-2%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240125-%ED%8C%80%EA%B3%BC%EC%A0%9C-2%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Thu, 25 Jan 2024 12:21:45 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘 열심히 기획 회의를 했다.
저번 팀과제와 다르게 이번에는 개발부터 시작이 아니라 맨땅기획부터 다 해야하니까...</p>
<h1 id="24_01_25-2차회의록">24_01_25 2차회의록</h1>
<p><strong>(오전스크럼)</strong></p>
<ol>
<li>화면 사이즈 정하기</li>
</ol>
<p>메인에 화면 정해서 올리기</p>
<ol>
<li>에셋 정하기</li>
</ol>
<p>이거 쓰면 좋을 것 같다는 에셋을 팀 노션에 올리기</p>
<ol>
<li>역할에서 해야 할 것 정리하기(실시간으로 업데이트)</li>
</ol>
<ul>
<li><p>팀원1 : 맵,집게, 게임화면</p>
</li>
<li><p>팀원2 : 게임시작, 게임종료, 게임로직</p>
</li>
<li><p>나 : 사운드, 효과음</p>
</li>
<li><p>팀원3 : 캐릭터, 아이템</p>
</li>
</ul>
<p>오늘 계획
필수 구현 어느정도 완료하는 게 목표
.... 라고는 했지만 오늘은 하루종일 밀린 강의만 들었다. 하하..</p>
<p>=================================</p>
<p><strong>(오후스크럼)</strong></p>
<p>와이어프레임 재구성
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/924b25ea-1880-4e04-84a7-8472433b11d3/image.png" alt="">
팀장님의 귀여운 와이어프레임 그림...
<del>어제 내가 그린 시퀀스그램보다는 확실히 뭔가 직관적으로 보인다.</del></p>
<p>와이어 프레임 내용 정리</p>
<p>[게임 시작화면]</p>
<ul>
<li><input disabled="" type="checkbox"> (제목)과(캐릭터)설정</li>
<li><input checked="" disabled="" type="checkbox"> 게임 시작버튼(인게임으로이동)</li>
<li><input checked="" disabled="" type="checkbox"> 게임 종료(게임끄기)</li>
</ul>
<p>[인게임]</p>
<ul>
<li><input disabled="" type="checkbox"> 집게가 하늘에서 내려와 플레이어와 닿으면 게임 종료</li>
<li><input disabled="" type="checkbox"> 집게가 하늘에서 내려와 땅과 닿으면 다시 올라감</li>
<li><input disabled="" type="checkbox"> 캐릭터가 좌우로 이동함</li>
<li><input disabled="" type="checkbox"> 집게가 땅과 닿으면 점수 하나 획득</li>
<li><input disabled="" type="checkbox"> 집게가 하늘에서 무작위로 생성됨</li>
<li><input disabled="" type="checkbox"> 집게가 생성되는 개수가 늘리기</li>
<li><input disabled="" type="checkbox"> 게임이 시작되면 게임이 초 단위로 흘러감(ex.01분:23초)</li>
<li><input disabled="" type="checkbox"> 사운드</li>
<li><input disabled="" type="checkbox"> 집게가 내려오는 사운드</li>
<li><input disabled="" type="checkbox"> 플레이어가 움직이는 사운드</li>
<li><input disabled="" type="checkbox"> 애니메이션?</li>
<li><input disabled="" type="checkbox"> 아이템이 커졌다 작아졌다 하는 애니메이션</li>
<li><input disabled="" type="checkbox"> 플레이어가 움직이는 애니메이션</li>
<li><input disabled="" type="checkbox"> 집게가 내려올때 집었다 폈다 하는 애니메이션</li>
</ul>
<p>[게임종료]</p>
<ul>
<li><input disabled="" type="checkbox"> 인게임에서 게임이 종료되면 시간이 멈추고 창이 하나 나옴</li>
<li><input disabled="" type="checkbox"> 버틴시간,점수,재시작버튼,메인으로가기버튼이 창에 표시됨</li>
</ul>
<p>역할 재정비</p>
<ol>
<li><p>오브젝트,캐릭터 구현</p>
<ol start="2">
<li><p>UI/UX 게임시작화면,종료창구현</p>
</li>
<li><p>사운드, 효과음</p>
</li>
<li><p>애니메이션, 에셋</p>
</li>
</ol>
</li>
</ol>
<p>오늘 회의의 대부분은 역할 및 와이어프레임 세분화...로 시간을 보냈다.
확실히 진짜 맨땅기획이니까 팀이 좀 많이 헤매는 경향이 있었다.
역할분담부터 시작해서 중간중간 기획이 생각나면 그것도 말하고 또 정리하고, 역할이 또 추가되고... 기획팀이 괜히 있는게 아니다라는게 뼈저리게 느껴지는 하루...</p>
<p>그리고 역할이 제대로 정해졌으니 어울리는 배경음도 하루종일 찾았다.
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/1f1c1b7e-9ae6-4483-9980-fece8f0e51fd/image.png" alt=""><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/6bc6341e-659a-4e0d-b8d9-56b3d4d31429/image.png" alt=""><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/375b88e4-eda7-42c9-809a-b39aa6349b07/image.png" alt=""></p>
<p>내 사랑 언더테일. 내 국밥. 내 빛.
천재 개발자 토비 폭스. 어떻게 작곡 기획 개발까지 혼자 다 했을까... 심지어 브금도 진짜 최고임...
배경음은 적당한 후보들을 골라서 팀원들에게 들려준 후 제일 나은 걸 선정하려고 한다.
일단 브금 선정 엄청 칭찬받았다.... 우히힉!!!!
벌써 게임에 배경음 달아줄 생각에 기분 좋아짐
내일은 각자 만든 기초 토대를 팀원들과 비교해서... 제일 나은 토대를 선정하고 그걸로 프로젝트를 진행한다.</p>
<p>이제 진짜 코딩 뿐이야.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240124 - 팀과제 1일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240124-%ED%8C%80%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240124-%ED%8C%80%EA%B3%BC%EC%A0%9C-1%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Wed, 24 Jan 2024 11:57:23 GMT</pubDate>
            <description><![CDATA[<p>반갑다.
오늘은 2번째 팀과제를 받았다.
무려....
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/b9c5383a-46cb-4dd8-9c8c-06b4ee21e4ec/image.png" alt="">처음에는 추억의 게임...? 너구리 같은건가...? 싶었는데 이미 정해져있었다.</p>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/ad153727-2d7d-4360-9ade-1fad277788ff/image.png" alt=""> &quot;똥피하기&quot; , &quot;닷지&quot;, &quot;벽돌깨기&quot;
오... 의외로 진짜 추억의 게임 리메이크다.</p>
<p>일단 받았으니 해야지... 오늘은 하루종일 팀원들과 우당탕탕 신나는 회의를 했다.</p>
<h2 id="1-장르-정하기">1. 장르 정하기</h2>
<ol>
<li><p>똥 피하기(결정)</p>
</li>
<li><p>벽돌깨기</p>
</li>
<li><p>닷지</p>
</li>
</ol>
<h2 id="15-장르-재해석-투표">1.5. 장르 재해석 투표</h2>
<ul>
<li>똥 피하기</li>
<li>3 대 500 프로젝트</li>
<li>고속도로에 처음가는 초보가 되어 차 피하기</li>
<li>라이덴X? 1945? (미사일이 날라오는 것을 막는 게임(MAD). 단순히 피하는 것을 넘어서 액티브하게 막을 수도 있게?)</li>
<li>팀명처럼 떨어지는 사자성어만 먹는 게임(뷁 같은 이상한 글자는 피하고)</li>
<li>인형뽑기 게임(위에서 집게가 내려와서 인형이 뽑아지면 끝나는 게임)</li>
</ul>
<p>여기서 재투표 과정을 거쳤다.</p>
<p>재투표</p>
<ul>
<li>3 대 500 프로젝트</li>
<li><em>- 미사일 피하기 게임 채택*</em></li>
<li>인형뽑기 게임(위에서 집게가 내려와서 인형이 뽑아지면 끝나는 게임)</li>
</ul>
<p>그래서 최종적으로</p>
<ul>
<li>미사일 날라오는 것을 막는 게임</li>
</ul>
<p>을 했지만? 팀원들과 다시 상의한 결과 </p>
<ul>
<li><strong>!!!진짜 최종 결정!!!</strong></li>
<li>⇒ <strong>인형뽑기 게임</strong>으로 채택되었다.</li>
</ul>
<h2 id="2-장르-게임-진행도-짜기">2. 장르 게임 진행도 짜기</h2>
<p>인형은 위에서 내려오는 집게를 피한다.
집게가 내려오기 전에 전조 현상이 나타난다.(이거 다시 한번 물어봐야할듯...)
<del>(인형뽑기 게임인데 아래에 바닥을 인형으로 해놓고 집게가 몇번 왔다 갔다 하냐에 따라
바닥에 깊이가 내려간다. 플레이어는 인형의 신이여서(?) 특정 버튼을 누르면 인형을 생성할 수 있다.)(폐기)</del>
바닥에 인형이 모두 없어지면 뽑을 인형이 없어져 플레이어가 뽑힌다.(이거도 다시 한번 물어봐야겠다)</p>
<p>게임시작 화면</p>
<ul>
<li>play</li>
<li>instruction</li>
</ul>
<p>요소 </p>
<ul>
<li>집게 </li>
<li>인형 </li>
</ul>
<p>플레이어</p>
<ul>
<li>인형들</li>
</ul>
<p>게임 구조</p>
<ul>
<li>하늘에서 랜덤하게 집게가 떨어진다</li>
<li>플레이어를 좌우로 움직이며 집게를 피할 수 있음</li>
<li>플레이어가 집게를 공격 할 수 있음.</li>
</ul>
<p>우승 조건</p>
<ul>
<li>하늘에서 떨어지는 집게들을 피해서 살아남자</li>
<li>집게를 파괴해서 살아남자</li>
<li>피한 집게 갯수 채우기</li>
<li>피한 집게도 파괴 판정</li>
</ul>
<p>플레이어 아이템
공격 아이템(회의 예정)
방어 아이템(회의 예정)</p>
<ul>
<li>드라이버 - 집게의 악력을 줄여서 획득 확률을 낮춤</li>
</ul>
<p>플레이 스타일</p>
<ul>
<li><strong>챌린지 형식 (끝까지 버티기)</strong> &lt;= 1차 목표,1 스테이지 만들어 보고 결정</li>
<li>스테이지 형식 - x(집게 횟수)  &lt;= 이후 결정</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hotchanny_x_x/post/02c01ea9-cc36-4902-9edf-b36ccfd868c4/image.png" alt="">
게임 로직</p>
<ul>
<li>잡히면 종료, 점수는 집게x10,</li>
</ul>
<p>필수 구현</p>
<ul>
<li><strong>게임 화면</strong>: 메인화면, 게임 진행 화면 등</li>
<li><strong>캐릭터</strong>: 주인공 인형을 만들고, 이를 움직일 수 있도록 구현해</li>
<li>집게 <strong>오브젝트</strong>: 집게 오브젝트를 생성하고, 이를 랜덤한 위치에서 아래로 떨어뜨리는 동작을 구현</li>
<li><strong>충돌 감지</strong>: 캐릭터와 인형 오브젝트가 충돌했는지를 감지하고, 충돌 시 게임이 종료되도록 처리 —&gt; 캐릭터 오브젝트에 HP 도입하면 HP 0일시 종료 후 끌려감</li>
<li><strong>게임 로직</strong>: 게임의 기본 로직을 구현해야 합니다. 즉, 게임 시작, 종료, 점수 등을 관리</li>
</ul>
<p>=========================================================
선택구현</p>
<ul>
<li><strong>게임 난이도 조절</strong>: 난이도를 조절하기 위해 집게가 떨어지는 속도, 집게의 크기, 캐릭터의 이동 속도 등을 조절</li>
<li><strong>배경 음악 및 효과음</strong>: 게임에 배경 음악과 효과음을 추가하여 게임의 분위기를 높임</li>
<li><strong>점수 시스템</strong>: 게임 플레이어의 점수를 기록하고, 최고 점수를 저장하여 랭킹 시스템을 추가</li>
<li><strong>파워업 아이템</strong>: 캐릭터가 집게를 피하기 위한 파워업 아이템을 도입. 예를 들어, 보호막을 얻거나 집게를 없앨 수 있는 아이템을 추가</li>
<li><strong>다양한 캐릭터 선택</strong>: 여러 캐릭터 스킨을 선택할 수 있도록 하는 기능을 추가</li>
<li><strong>화면 효과</strong>: 게임 중에 화면에 특수 효과를 추가하여 게임 경험을 향상</li>
<li><strong>다중 플레이어 모드</strong>: 다른 플레이어와 함께 플레이할 수 있는 로컬 다중 플레이어 모드를 추가</li>
</ul>
<h2 id="3-역할-정하기">3. 역할 정하기</h2>
<p><strong>1. 게임 메인</strong></p>
<ul>
<li>플레이어</li>
<li>아이템</li>
</ul>
<p><strong>2. 게임 메인2</strong></p>
<ul>
<li>맵</li>
<li>집게</li>
</ul>
<p><strong>3. 화면</strong></p>
<ul>
<li>게임 시작 화면</li>
<li>게임 종료화면</li>
<li>(게임 로직)</li>
</ul>
<p><strong>4. 사운드</strong></p>
<p><strong>배경음(필수)</strong></p>
<ul>
<li>메인 화면</li>
<li>플레이 시</li>
</ul>
<p><strong>효과음 (선택)</strong></p>
<ul>
<li>집게 작동 시</li>
<li>잡혔을 시</li>
<li>아이템 사용</li>
<li>플레이어 사망 시</li>
<li>집게에서 회피 시</li>
<li>점수 집계 시</li>
</ul>
<p>======================================================</p>
<p>일단 오늘 회의 결과 이 정도로 정했다.
많은 이야기가 오고갔고 여러가지를 정했는데도 아직 할 게 너무 많다...
맡은 역할이나 구현사항도 다시 좀 더 디테일하게 나눠봐야 할 것 같다.
게임 스토리도 좀 더 구체적으로..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[240123 - 개인과제 2~4일차]]></title>
            <link>https://velog.io/@hotchanny_x_x/240122-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-24%EC%9D%BC%EC%B0%A8</link>
            <guid>https://velog.io/@hotchanny_x_x/240122-%EA%B0%9C%EC%9D%B8%EA%B3%BC%EC%A0%9C-24%EC%9D%BC%EC%B0%A8</guid>
            <pubDate>Tue, 23 Jan 2024 11:26:54 GMT</pubDate>
            <description><![CDATA[<p>요약</p>
<ol>
<li>코드카타</li>
<li>개인과제</li>
</ol>
<h3 id="1-코드카타">1. 코드카타</h3>
<ol start="12">
<li><p>배열의 평균값 구하기
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/a5fb7ac9-11d7-4dc7-b2b4-6192896add73/image.png" alt="">
직관적으로 for문으로 돌려서 배열의 값을 더해준 후 합계변수를 배열의 길이로 나눠야겠다!
라고 생각했다.</p>
<pre><code>public double solution(int[] arr) {

    double answer = 0;

    for(int i=0; i &lt; arr.Length; i++)
    {
        answer += arr[i];
    }
    answer /= arr.Length;
    return answer;
}</code></pre><p>근데...확장 메서드 라는 것이 있다..
그럼 메서드 호출 1줄 + 코드 1줄 이면...끝난다...</p>
<pre><code>using System.Linq;
</code></pre></li>
</ol>
<p>public class Solution {
    public double solution(int[] arr) {
        return arr.Average();
    }
}</p>
<pre><code>~~이런게 있었으면 미리 알려달라고!@!@!@!!@~~
사실 배웠을 지도 모른다... 내가 감자라 기억 못하는 걸 수도 ...

13. 자릿수 더하기
![](https://velog.velcdn.com/images/hotchanny_x_x/post/9d7f9733-4f89-4eab-9ca7-28684dbb36f3/image.png)
자릿수.. 그니까 예를들어 123 = 100x2 + 10x2 + 3x1이니까...생각하자..
각 자릿수들을 나눈 몫을 구해서 더해주면 되겠지?</code></pre><p>answer = n/100+ n/10 + n/1;</p>
<pre><code>근데 나는 이딴거밖에 생각이 나지 않음... 큰일임...여기서 막힘...
3자리수가 아니라 4자릿수면? 5자릿수면? 그것도 아니면 2자릿수면? 어떻게 나눌건데.
그러던 중 기가막힌 풀이를 봤다
</code></pre><p>public int solution(int n) {
        int answer = 0;</p>
<pre><code>    while(n&gt;0){
        answer += n % 10;
        n = n / 10;
    }
    return answer;
}</code></pre><pre><code>n이 0보다 크면
answer에는 n과 10을 나눈 나머지를 저장하고, n에서는 10을 나눈 몫을 저장한다.
예를들어 n=123이면 123/10 의 나머지는 3, 123/10의 몫은 12,
그리고 또 n이 0보다 크니까 12/10의 나머지는 2, 12/10의 몫은 1,
또 n이 0보다 크니까 1/10의 나머지는 1, 1/10의 몫은 0
n이 0보다 크지 않으니까 종료.

와..........진짜 이걸 어떻게 생각해냈지......??
아니 아침이라 머리가 안돌아가서 생각을 못하는건가 내가...?
하튼 진짜 대단하다...
언젠간 나도 생각해낼 수 있을까....

또, 굳이 머리를 쓰지 않아도 되는, 최고의 함수 마스터 코드도 있다.</code></pre><p>using System.Linq;</p>
<p>public class Solution {
    public int solution(int n) {
        int answer = n.ToString().AsEnumerable().Sum((c) =&gt; c ^ 48);
        return answer;
    }
}</p>
<p>```
ㅋㅋ
모르니까 패스.</p>
<h3 id="2-개인과제">2. 개인과제</h3>
<p>일단....망했습니다... 여러 악재가 겹쳐서 도저히 집중이 되지가 않았고...<del>이건 핑계긴 해</del>
구현한거라도 일단... 적어야지....</p>
<ul>
<li><p>에셋 오류
좀 예쁜 에셋으로 써보려 했는데 MyAsset을 불러올 수가,,,없다,,,,
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/169d13c1-03ce-45c3-950c-4abf9196bc8b/image.png" alt="">
급한대로 기본 에셋 다운받은걸로 해결했다. </p>
</li>
<li><p>맵 구성
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/0fa5a060-f793-4917-9120-ef58e42d8bf9/image.png" alt="">
대충 이정도 넓이의 맵
타일맵 찍다가 벽타일이 겹쳐서 좀 화날때도 있었다...</p>
</li>
<li><p>마우스 커서가 가리키는 대로 바라보기
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/c8712a12-4040-4f12-b1ed-c8760206c4a2/image.png" alt="">
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/0f0992dc-48b7-4646-a493-34dfde860b87/image.png" alt=""></p>
</li>
</ul>
<p>아니 왜 커서가 안보이지...? 하여튼 열심히 바라보고있다...
코드는 PlayerLook.cs
<img src="https://velog.velcdn.com/images/hotchanny_x_x/post/09e1e6b7-1f55-4eb8-815e-eb3bf4322d97/image.png" alt="">
transform의 scale값 변경해주는 방식.
세상엔 정말... 천재들이 많은 것 같다..</p>
<p>...여기까지가 구현....
분량이 정말 짧은걸 알지만 그래도 TIL은 적어야 하니까...</p>
<p>빠른 시일 내로 일 해결하고 집중해보겠다....</p>
]]></description>
        </item>
    </channel>
</rss>