<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JunkHwang</title>
    <link>https://junkhwang.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 4 Apr 2026 12:06:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>정크황</managingEditor>
    <item>
      <title>스타크래프트 벌처 만들기</title>
      <link>https://junkhwang.tistory.com/16</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t6V3R/btsFqXPcw7k/hzDxlayUvouegBktHl5Yc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t6V3R/btsFqXPcw7k/hzDxlayUvouegBktHl5Yc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t6V3R/btsFqXPcw7k/hzDxlayUvouegBktHl5Yc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft6V3R%2FbtsFqXPcw7k%2FhzDxlayUvouegBktHl5Yc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;240&quot; height=&quot;224&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[벌처의 주요 속성 파악]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://namu.wiki/w/%EC%8B%9C%EC%B2%B4%EB%A7%A4&quot;&gt;https://namu.wiki/w/%EC%8B%9C%EC%B2%B4%EB%A7%A4&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfsOBn/btsFm5tY8Xr/vuUkMJO8zTJ3UBIuRtTNxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfsOBn/btsFm5tY8Xr/vuUkMJO8zTJ3UBIuRtTNxk/img.png&quot; data-alt=&quot;벌처(시체매)의 주요 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfsOBn/btsFm5tY8Xr/vuUkMJO8zTJ3UBIuRtTNxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfsOBn%2FbtsFm5tY8Xr%2FvuUkMJO8zTJ3UBIuRtTNxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;314&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;벌처(시체매)의 주요 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;생산 비용 및 피해 유형 등 상세 속성을 모두 구현 할 단계는 아니기에 벌처의 기본적이고 중요한 속성을 추려 먼저 구현하고자 한다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[추린 주요 속성]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZxJR7/btsFoDKtqWm/jMXz8Ya6usLPPeoiyLOqZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZxJR7/btsFoDKtqWm/jMXz8Ya6usLPPeoiyLOqZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZxJR7/btsFoDKtqWm/jMXz8Ya6usLPPeoiyLOqZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZxJR7%2FbtsFoDKtqWm%2FjMXz8Ya6usLPPeoiyLOqZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;529&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 큼직한 기능을 우선적으로 작성하였지만 보기 편하고 추가 및 삭제하기 쉽게 노션 앱에 아래와 같이 작성하였다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEtad/btsFkWqX6CX/M4v3HwGrbX1R9WAXRMkN40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEtad/btsFkWqX6CX/M4v3HwGrbX1R9WAXRMkN40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEtad/btsFkWqX6CX/M4v3HwGrbX1R9WAXRMkN40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEtad%2FbtsFkWqX6CX%2FM4v3HwGrbX1R9WAXRMkN40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;257&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌처의 동작과 벌처가 매설하는 스파이더 마인을 서로 각각의 클래스로 동작할 수 있게 동사 형식으로 기능을 분리해두었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 '이동한다' 부터 구현하도록 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벌처의 경우 화면을 클릭한 곳을 향해&amp;nbsp; 일정 속도를 가지고 이동하게된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 구현하기 위해서 벌처의 속도를 알아야하고 클릭한 곳을 알아야하며 벌처를 이동시켜야한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭한 좌표 값을 알아낸다 -&amp;gt;벌처를 좌표로 이동시킨다 -&amp;gt;벌처를 좌표로 일정한 속도로 이동시킨다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 순서로 기능을 구현하고자 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>홍대 IT/게임 클라이언트 프로그래밍</category>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/16</guid>
      <comments>https://junkhwang.tistory.com/16#entry16comment</comments>
      <pubDate>Thu, 29 Feb 2024 00:27:34 +0900</pubDate>
    </item>
    <item>
      <title>유니티 인게임 닉네임 설정</title>
      <link>https://junkhwang.tistory.com/15</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;qdqdqdq.gif&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diTvzQ/btsEFdNFGaY/MHWvgJkvbhIfh6OdHi7vBK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diTvzQ/btsEFdNFGaY/MHWvgJkvbhIfh6OdHi7vBK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diTvzQ/btsEFdNFGaY/MHWvgJkvbhIfh6OdHi7vBK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/diTvzQ/btsEFdNFGaY/MHWvgJkvbhIfh6OdHi7vBK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1555&quot; height=&quot;895&quot; data-filename=&quot;qdqdqdq.gif&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[구현 기능]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 닉네임 설정 조건에 따라 경고문구 발생&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 변경된 닉네임을 좌측 상단 유저 닉네임이 존재하는 곳도 같이 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 변경이 가능한 상태에서는 버튼이 초록색으로 변경&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 닉네임 설정 조건에 따라 경고문구 발생&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1707707402463&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;this.nicknameInputfield.onValueChanged.AddListener((newNickname) =&amp;gt;
{
    //기존 닉네임과 새로운 닉네임이 같지 않다면 &amp;amp;&amp;amp; 글자수가 2&amp;lt; newNickname &amp;lt;6 라면
    if (homeMain.UserNickname != newNickname &amp;amp;&amp;amp; newNickname.Length &amp;gt;= 2 &amp;amp;&amp;amp; newNickname.Length &amp;lt;= 6)
    {
        GreenButtonOn();
    }
    else
    {
        GrayButtonOn();
    }

});

void GreenButtonOn()
{
    this.greenButton.gameObject.SetActive(true);
    this.grayButton.gameObject.SetActive(false);
}

void GrayButtonOn()
{
    this.greenButton.gameObject.SetActive(false);
    this.grayButton.gameObject.SetActive(true);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건에 따라 버튼이 등장하도록 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그린버튼을 눌렀을 때 작동하는 기능 구현&lt;/p&gt;
&lt;pre id=&quot;code_1707707799483&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; this.greenButton.onClick.AddListener(() =&amp;gt;
 {
     
     //Main의 닉네임 값을 새로운 inputfield에 입력된 닉네임으로 변경
     homeMain.UserNickname = this.nicknameInputfield.text;
     
     //inputfield의 placeholder의 text 값을 갱신 
     userNickname.text = this.nicknameInputfield.text;
     
     //UIhome의 닉네임 text 값을 갱신
     uiHome.infoNickname.text = this.nicknameInputfield.text;
     
     //닉네임 인풋 필드를 비워 다음 텍스트 값을 다시 받을 준비
     nicknameInputfield.text = &quot;&quot;;

 });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 작성중 ;;;&lt;/p&gt;</description>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/15</guid>
      <comments>https://junkhwang.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 12 Feb 2024 12:17:02 +0900</pubDate>
    </item>
    <item>
      <title>유니티 싱글톤 패턴을  사용하여 로드씬 관리</title>
      <link>https://junkhwang.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;씬이 변경될 때 연출을 주는 코드까지 만들었고 해당 연출을 여러 씬 전환을 하는데 사용하기 편하게 로드씬 매니저 스크립트를 하나 생성해준다 코드 결합도가 높아지겠지만 씬을 불러오는건 통일해도 별 문제가 없을 것 같다 그리고 로드씬 코드를 계속 만들기 귀찮다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**씬을 관리한다는 이유로 &lt;b&gt;&lt;u&gt;SceneManger라는 이름으로 스크립트를 생성하면&lt;/u&gt;&lt;/b&gt; 유니티 자체에 씬 관리기능을 제공하는 SceneManger()와 이름이 충돌하여 문제가 발생한다.. 야심차게 싱글톤 패턴을 구성하려고 시도해보다 원인을 모르고 굉장히 고생했다..&lt;/p&gt;
&lt;pre id=&quot;code_1707703065450&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using UnityEngine.SceneManagement;

public class LoadSceneManager : MonoBehaviour
{
    public static LoadSceneManager Instance { get; private set; }

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;

            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public&amp;nbsp;static&amp;nbsp;LoadSceneManager&amp;nbsp;Instance&amp;nbsp;{&amp;nbsp;get;&amp;nbsp;private&amp;nbsp;set;&amp;nbsp;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로드씬 매니저의 싱글톤 인스턴스를 선언하고 해당 인스턴스를 접근할 수 있지만 변경은 할 수 없게 set의 경우 private으로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 아래는 인스턴스가 항상 하나만 존재할 수 있도록 해주며 DonDestroyOnLoad해주어 씬이 변경되어도 계속 재탕할 수 있게 하자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707704107088&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public void LoadScene(string scene)
{
    SceneManager.LoadScene(scene);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매게 변수를 string로 해서 씬 이름만 입력하면 씬을 불러올 수 있게 합시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707704178570&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void StarIngame()
{
    LoadSceneManager.Instance.LoadScene(&quot;InGame&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다른 스크립트에서 이런식으로 불러서 계속 시용할 수 있다 그리고 테스트하기 위해 유니티로 돌아가보면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r2kBZ/btsEELYlX0B/g8Dd8b7Kv6ThACgNhG6xmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r2kBZ/btsEELYlX0B/g8Dd8b7Kv6ThACgNhG6xmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r2kBZ/btsEELYlX0B/g8Dd8b7Kv6ThACgNhG6xmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr2kBZ%2FbtsEELYlX0B%2Fg8Dd8b7Kv6ThACgNhG6xmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;300&quot; data-origin-width=&quot;690&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x7kWB/btsEF3qbY4T/mvdkdtJao8t0retKbZJXQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x7kWB/btsEF3qbY4T/mvdkdtJao8t0retKbZJXQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x7kWB/btsEF3qbY4T/mvdkdtJao8t0retKbZJXQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx7kWB%2FbtsEF3qbY4T%2FmvdkdtJao8t0retKbZJXQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;136&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아하 씬 매니저를 만들고 기존 로드씬 부분을 수정해주면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>홍대 IT/게임 클라이언트 프로그래밍</category>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/14</guid>
      <comments>https://junkhwang.tistory.com/14#entry14comment</comments>
      <pubDate>Mon, 12 Feb 2024 11:53:33 +0900</pubDate>
    </item>
    <item>
      <title>씬 전환 연출 주기</title>
      <link>https://junkhwang.tistory.com/13</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ghkghkghk.gif&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5vZWj/btsEEItlsya/3YKSkZyeyqZU1M8a8jY6yk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5vZWj/btsEEItlsya/3YKSkZyeyqZU1M8a8jY6yk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5vZWj/btsEEItlsya/3YKSkZyeyqZU1M8a8jY6yk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c5vZWj/btsEEItlsya/3YKSkZyeyqZU1M8a8jY6yk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;730&quot; data-filename=&quot;ghkghkghk.gif&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/13</guid>
      <comments>https://junkhwang.tistory.com/13#entry13comment</comments>
      <pubDate>Sat, 10 Feb 2024 00:17:17 +0900</pubDate>
    </item>
    <item>
      <title>점프 버튼 만들기</title>
      <link>https://junkhwang.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[구현 목록]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 점프 버튼을 누르면 점프 남은 쿨타임을 버튼에 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 남은 시간에 따라 Fill을 버튼에 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 쿨타임 시간 동안은 재사용 불가능하게 하기&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 점프 버튼을 누르면 점프 남은 쿨타임을 버튼에 표시&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간으로 남은 점프 쿨타임을 유저에게 보여주는게 목표기 때문에 코루틴을 활용합니다&lt;/p&gt;
&lt;pre id=&quot;code_1707467993770&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  IEnumerator JumpSkill()
  {

	while (true)
	{
    
    //점프 쿨 타임을 줄여줘
    jumpCooltime -= Time.deltaTime;

    //남은 쿨타임이 버튼에 있는 텍스트에 출력해줘
    this.cooltimeText.text = jumpCooltime.ToString();
    
    	//점프 쿨타임이 0초 혹은 미만이 되면 while문을 종료해줘
        if (jumpCooltime &amp;lt;= 0)
    {

        break;
    }
yield return null;
}

private void Start()
{
    this.jumpButton.onClick.AddListener(() =&amp;gt;
    {
        Debug.LogFormat(&quot;Skill 버튼 클릭&quot;, jumpButton);

        StartCoroutine(JumpSkill());
        // 스킬이 눌리면 fill의 최대치가 된다
        this.siler.fillAmount = 1;
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhM1nN/btsEECmApHx/6GjIkKx7bcz4Q5UJWg4Jr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhM1nN/btsEECmApHx/6GjIkKx7bcz4Q5UJWg4Jr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhM1nN/btsEECmApHx/6GjIkKx7bcz4Q5UJWg4Jr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhM1nN%2FbtsEECmApHx%2F6GjIkKx7bcz4Q5UJWg4Jr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;423&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어렵지 않게 구현에 성공했으나 float으로 점프 쿨타임을 지정해둔 탓에 버튼의 숫자가 너무 길기에&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707468118326&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;this.cooltimeText.text = jumpCooltime.ToString(&quot;f1&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ToString에 &quot;f1&quot; 을 넣어서 간단하게 소수점 한자리를 제외하고는 날려줍니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baaOLR/btsEFUfqmBn/1Qz0iyW4M2MnKzdn6UgKvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baaOLR/btsEFUfqmBn/1Qz0iyW4M2MnKzdn6UgKvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baaOLR/btsEFUfqmBn/1Qz0iyW4M2MnKzdn6UgKvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaaOLR%2FbtsEFUfqmBn%2F1Qz0iyW4M2MnKzdn6UgKvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;365&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 남은 시간에 따라 Fill을 버튼에 표시&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dClDNm/btsEHGU1I7i/hzK9GHBiJjIR7Nw9992m60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dClDNm/btsEHGU1I7i/hzK9GHBiJjIR7Nw9992m60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dClDNm/btsEHGU1I7i/hzK9GHBiJjIR7Nw9992m60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdClDNm%2FbtsEHGU1I7i%2FhzK9GHBiJjIR7Nw9992m60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;441&quot; height=&quot;440&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 보면 에드리스너를 통해 버튼이 눌림과 동시에 fill값을 1로만든다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fill은 버튼 안에 동그란 이미지 객체를 Fill Amount값으로 조정하여 스킬 쿨타임을 표현해준다 즉 fill=1 은 fill=max 이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본값으로 Fill Amount 값은 0 에 두고 스킬을 눌렀을 때 1로 만든 뒤 시간에 따라 fill값을 줄여주자&lt;/p&gt;
&lt;pre id=&quot;code_1707466616398&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;      //남은 쿨타임 만큼 fill을 깎자
         this.siler.fillAmount = this.siler.fillAmount - (this.siler.fillAmount / jumpCooltime)  ;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번에서 만든 JumpSkill()에 위와 같이 코드를 넣고 실행했더니 스킬 쿨타임에 따라 fill값이 조정되지 않고 순식간에 fill값이 사라져버렸다 ...ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FillAmout의 값이 1인 상태에서 1/12 하고 그 값을 1에서 빼주면 되는게 아닌가?? 하고 곰곰히 생각하는데 잘 모르겠었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무래도 내 코드가 어떤식으로 돌아가는지 직접 보는게 이해도 쉽고 빠르겠다 싶어 액셀을 켰다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H3H4b/btsEFiHDqiK/CKHYEanbAKKhwP6Srk6lKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H3H4b/btsEFiHDqiK/CKHYEanbAKKhwP6Srk6lKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H3H4b/btsEFiHDqiK/CKHYEanbAKKhwP6Srk6lKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH3H4b%2FbtsEFiHDqiK%2FCKHYEanbAKKhwP6Srk6lKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;303&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액셀에서 계산을 해보니 문제 점을 바로 알 수 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frame 1 에서 fill= 1이고 남은 쿨타임이 9.9일때 0.1 즉 Fill값에서 10%라는 값을 빼주고 있는 코드였다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frame이 진행될 수록 그 값은 처참..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연하게도&amp;nbsp; (현재 쿨타임(9초) / 전체 쿨타임(12초)이런식으로 계산해야 하는게 맞다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;filllll.gif&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANBXV/btsEIQQGFic/ItNYepz6KWOZS9T8lIcgp1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANBXV/btsEIQQGFic/ItNYepz6KWOZS9T8lIcgp1/img.gif&quot; data-alt=&quot;액셀에서 계산 증명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANBXV/btsEIQQGFic/ItNYepz6KWOZS9T8lIcgp1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ANBXV/btsEIQQGFic/ItNYepz6KWOZS9T8lIcgp1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;102&quot; data-filename=&quot;filllll.gif&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;액셀에서 계산 증명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707469286539&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IEnumerator JumpSkill()
{
	//while문이 실행되어 쿨타임 값이 변경되기 때문에 원래 쿨타임을 알려주자
    float maxCooltime = jumpCooltime;
    
            while (true)
        {
            //    FillAount의 상태           (현재 쿨타임 / 원래 쿨타임)
              this.siler.fillAmount =      jumpCooltime / maxCooltime;
            
         yield return null;
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 코드 변경 후 실행&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;filllll.gif&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUglOp/btsEHG8ztoR/3j2u40kenTs6Mi1iVnPtFk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUglOp/btsEHG8ztoR/3j2u40kenTs6Mi1iVnPtFk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUglOp/btsEHG8ztoR/3j2u40kenTs6Mi1iVnPtFk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bUglOp/btsEHG8ztoR/3j2u40kenTs6Mi1iVnPtFk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;326&quot; data-filename=&quot;filllll.gif&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼안에 텍스트가 약간 꾸물 꾸물거리긴 하지만 뭐 일단은 크게 거슬리는 이슈는 아니라 넘어가도록 하자..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;으후루꾸꾸루후으으후루꾸꾸루후으으후루꾸꾸루후으으후루꾸꾸루후으으후루꾸꾸루후으으후루꾸꾸루후으으후루꾸꾸&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 쿨타임 시간 동안은 재사용 불가능하게 하기&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707469853698&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;this.jumpButton.onClick.AddListener(() =&amp;gt;
{
    if ( 쿨타임 중이지 않다면~~~ )
    {
        StartCoroutine(JumpSkill());
  
        this.siler.fillAmount = 1;
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 머리에 드는 생각은 if문을 어떻게든 활용해서 쿨타임인지 알 수 있게 하면 되겠다는 생각이 바로들었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음 .. JumpSkill이 fill값을 0으로 만들어주니깐 fill값이 0이 아니라면 쿨타임 상태일 것이다&lt;/p&gt;
&lt;pre id=&quot;code_1707470751625&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private void Start()
    {
        this.jumpButton.onClick.AddListener(() =&amp;gt;
        {
            if ( this.siler.fillAmount == 0)
            {
                StartCoroutine(JumpSkill());
  
                this.siler.fillAmount = 1;
            }
            else
            {
                Debug.Log(&quot;쿨타임 중에는 스킬을 사용할 수 없습니다&quot;);
            }
        });
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코루틴이 실행되면 다시 fillAmount의 값을 1로 변경해주기 때문에 잘 될 것으로 생각하고 실행&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;collll.gif&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1048&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRgNk7/btsEFfc8yCZ/AfaK9AuSTvFMMQzx1RgNi1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRgNk7/btsEFfc8yCZ/AfaK9AuSTvFMMQzx1RgNi1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRgNk7/btsEFfc8yCZ/AfaK9AuSTvFMMQzx1RgNi1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bRgNk7/btsEFfc8yCZ/AfaK9AuSTvFMMQzx1RgNi1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;355&quot; data-filename=&quot;collll.gif&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;1048&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;????&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 왠일로 의도한대로 한번에 잘 되는가 싶었지만 스킬을 다시 사용할 수 있는 일은 일어나지 않았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[발견한 문제]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 텍스트가 0.0 상태에서 사라지지 않았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 스킬이 쿨타임이 0이 되었음에도 어째서인지 다시 스킬을 사용할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707471520039&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (jumpCooltime &amp;lt;= 0)
{
    Debug.Log(&quot;while문 종료&quot;);
    Debug.LogFormat(&quot;fill 값 = {0}&quot;,siler.fillAmount);

    cooltimeText.text = null;
    break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 문제를 해결하기 위해 쿨타임텍스트를 Null로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 문제를 찾기위해 fillAmount의 값이 while문이 종료되었을 때 0이 된건지 확인하기 위한 디버그심기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qNBVB/btsED4cEC5V/w1aqT5Y7J2yqYK4f5psZm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qNBVB/btsED4cEC5V/w1aqT5Y7J2yqYK4f5psZm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qNBVB/btsED4cEC5V/w1aqT5Y7J2yqYK4f5psZm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqNBVB%2FbtsED4cEC5V%2Fw1aqT5Y7J2yqYK4f5psZm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;151&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 문제는 해결이되었지만 두번째 문제의 원인은 정확히 파악이되지 않았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fill값이 0이라는데 왜 애드리스너의 if문 조건을 통과하지 못하는것인지 알기위해 if문에도 디버그 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/10y8a/btsEFgb12HB/9nQKzbAKbafwIIJ1WgzlC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/10y8a/btsEFgb12HB/9nQKzbAKbafwIIJ1WgzlC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/10y8a/btsEFgb12HB/9nQKzbAKbafwIIJ1WgzlC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F10y8a%2FbtsEFgb12HB%2F9nQKzbAKbafwIIJ1WgzlC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;237&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음? 스킬 쿨타임이 다 차고 나서 다시 한번클릭하니 while문의 fill값이 0 -&amp;gt; 1로 변경되었다&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707472379741&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (jumpCooltime &amp;lt;= 0)
{
    Debug.Log(&quot;while문 종료&quot;);
    Debug.LogFormat(&quot;while 의 fill 값 = {0}&quot;,siler.fillAmount);

    cooltimeText.text = null;
    break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while문에서 문제가 발생하니 while문을 다시 살펴보자 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (jumpCooltime &amp;lt;= 0) ... 음 ..점프 쿨타임이 0이하가 된다면...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보니 점프 쿨타임을 0으로 만들고 다시 되돌려주지 않았다...코드 수정...&lt;/p&gt;
&lt;pre id=&quot;code_1707472483379&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;   IEnumerator JumpSkill()
   {

       float maxCooltime = jumpCooltime;

       while (true)
       {

           //점프 쿨 타임을 줄여줘
           jumpCooltime -= Time.deltaTime;

           //남은 쿨타임이 버튼에 출력
           this.cooltimeText.text = jumpCooltime.ToString(&quot;f1&quot;);

           //    FillAount의 상태           (현재 쿨타임 / 원래 쿨타임)
             this.siler.fillAmount =      jumpCooltime / maxCooltime;

           if (jumpCooltime &amp;lt;= 0)
           {
               //점프 쿨타임을 다시 원상복구 시키자
               jumpCooltime = maxCooltime;
               cooltimeText.text = null;
               break;
           }
           yield return null;
       }
   }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dqdqdq.gif&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;753&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c545xu/btsED1NMV2h/rB2dlb360xTKorikdD4mdk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c545xu/btsED1NMV2h/rB2dlb360xTKorikdD4mdk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c545xu/btsED1NMV2h/rB2dlb360xTKorikdD4mdk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c545xu/btsED1NMV2h/rB2dlb360xTKorikdD4mdk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1544&quot; height=&quot;753&quot; data-filename=&quot;dqdqdq.gif&quot; data-origin-width=&quot;1544&quot; data-origin-height=&quot;753&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완-성!&lt;/p&gt;</description>
      <category>홍대 IT/게임 클라이언트 프로그래밍</category>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/12</guid>
      <comments>https://junkhwang.tistory.com/12#entry12comment</comments>
      <pubDate>Fri, 9 Feb 2024 18:58:41 +0900</pubDate>
    </item>
    <item>
      <title>유니티 버튼 활용 프로그래밍</title>
      <link>https://junkhwang.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[구현목표]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 버튼을 클릭하여 On/Off 스위치 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 버튼1을 클릭하면 버튼2와 버튼3의 On/Off 값을 조정가능한 스위치 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 버튼 1을 클릭하면 2,3,4 버튼이 꺼지고 버튼 2를 클릭하면 1,3,4 버튼이 꺼지고 2번 버튼이 켜지는 탭 기능 구현&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; 1. 버튼을 클릭하여 On/Off 스위치 구현&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1581&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUAVrf/btsEuM3B8fP/UvL7hKpWP61Wx0dYKHTrN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUAVrf/btsEuM3B8fP/UvL7hKpWP61Wx0dYKHTrN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUAVrf/btsEuM3B8fP/UvL7hKpWP61Wx0dYKHTrN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUAVrf%2FbtsEuM3B8fP%2FUvL7hKpWP61Wx0dYKHTrN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;335&quot; data-origin-width=&quot;1581&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707224511166&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    [SerializeField] private GameObject onGo;
    [SerializeField] private GameObject offGo;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 버튼1 오브젝트에 버튼을 관리해줄 스크립트를 붙이고 해당 스크립트에 관리 될 on과 off의 게임오브젝트 연결&lt;/p&gt;
&lt;pre id=&quot;code_1707224778407&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[SerializeField] private Button btn;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 버튼1 오브젝트 버튼 컴포넌트를 사용하기 위해 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707227179977&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private bool isActivate;

void Start()
{
        Debug.LogFormat(&quot;Start()의 isActive 값 = {0}&quot;,isActivate);

    btn.onClick.AddListener(() =&amp;gt; //버튼을 눌렀을 때 발생하는 이벤트 함수
    {
        Debug.LogFormat(&quot;에드리스너의 isActive 값 = {0}&quot;,isActivate);
        OnOff();
    });
}

//버튼을 눌렀을 때 발생 할 메서드
void OnOff()
{
    isActivate = !isActivate; //isActive의 Bool값을 OnOff() 메서드가 호출 될 때 마다 바꾸어 버튼 On/Off 상태를 판단

    Debug.LogFormat(&quot;에드리스너의 isActive 값 = {0}&quot;,isActivate);

    onGo.SetActive(isActivate); // onGo 오브젝트를 isActive값에 맞게 Set 해줘
    offGo.SetActive(!isActivate); // offGo 오브젝트를 isActive값에 '! = 반대 되게 ' Set 해줘
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.유니티에서 SetActive() 함수는 bool값을 판단해 오브젝트를 활성화 SetActive (True) 및 비활성화 SetActive (False) 해줄수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. OnOff를 관리해줄 메서드를 생성하여 해당 메서드에서 bool 값을 던져 스위치의 상태를 파악 및 변경한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT9tKK/btsEtsYHG83/1zWt7pRfsKxqbq3vjRa6j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT9tKK/btsEtsYHG83/1zWt7pRfsKxqbq3vjRa6j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT9tKK/btsEtsYHG83/1zWt7pRfsKxqbq3vjRa6j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT9tKK%2FbtsEtsYHG83%2F1zWt7pRfsKxqbq3vjRa6j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;61&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addli.gif&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qOe0T/btsEy4PfKkx/m0mkmBniPh5O0duB2Ev7uk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qOe0T/btsEy4PfKkx/m0mkmBniPh5O0duB2Ev7uk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qOe0T/btsEy4PfKkx/m0mkmBniPh5O0duB2Ev7uk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/qOe0T/btsEy4PfKkx/m0mkmBniPh5O0duB2Ev7uk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;410&quot; data-filename=&quot;addli.gif&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;951&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;start에서 isActive 값이 기본적으로 False임을 알 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OnOff() 메서드가 호출될 때 즉, 버튼을 눌러 AddListener 이벤트가 발생할 때 마다 SetActive값의 변경으로 스위치 On/Off 기능을 정상적으로 수행하고 있음을 알 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 버튼1을 클릭하면 버튼2와 버튼3의 On/Off 값을 조정가능한 스위치 구현&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hx6fL/btsEy8xlAjg/AhZ0Lwk7a8t2DK75pZbktk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hx6fL/btsEy8xlAjg/AhZ0Lwk7a8t2DK75pZbktk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hx6fL/btsEy8xlAjg/AhZ0Lwk7a8t2DK75pZbktk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHx6fL%2FbtsEy8xlAjg%2FAhZ0Lwk7a8t2DK75pZbktk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;411&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 1번에서 만든 버튼을 다시 만드는것은 매우 귀찮기 때문에 Button 1 을 프리팹으로 만들고 이름만 Button으로 변경해주고 버튼을 3개 생성하였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 새로운 버튼은 서로 같은 형태의 프리팹이기 때문에 현재 구분할 수 없다 3번째 버튼을 눌러서 1번 2번 버튼이 뭔지 알면서 각 버튼의 상태를 변경하기 위해서는 배열이 필요하다&lt;/p&gt;
&lt;pre id=&quot;code_1707231914777&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//방법1 
private TestButton[] btns = new TestButton[3];

btns[0] = GameObject.Find(&quot;Button1&quot;).GetComponent&amp;lt;TestButton&amp;gt;();
btns[1] = GameObject.Find(&quot;Button2&quot;).GetComponent&amp;lt;TestButton&amp;gt;();
btns[2] = GameObject.Find(&quot;Button3&quot;).GetComponent&amp;lt;TestButton&amp;gt;();


//방법2
    [SerializeField] private TestButton[] btns;
    [SerializeField] private Button btn1;
    [SerializeField] private Button btn2;
    [SerializeField] private Button btn3;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 아주 원시적으로 해결해줄 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707234028771&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using UnityEngine.UI;

public class TestButton : MonoBehaviour
{
    [SerializeField] private GameObject btnPrefab;
    private Button[] buttons;
    private bool isActive;



    private void Start()
    {
        buttons = GameObject.FindObjectsOfType&amp;lt;Button&amp;gt;();

        buttons[0].onClick.AddListener(() =&amp;gt;
        {
            SetOnOffAllButton();
        });
    }

    public void SetOnOffAllButton()
    {
        isActive = !isActive;
        for (int i = 0; i &amp;lt; buttons.Length; i++)
        {
            buttons[i].transform.Find(&quot;On&quot;).gameObject.SetActive(true);
            buttons[i].transform.Find(&quot;Off&quot;).gameObject.SetActive(false);
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이것 저것 찾던중 배열을 지정해주는게 너무 귀찮다면 버튼 배열을 선언해버리고 버튼 배열에 스크립트가 붙어있는 오브젝트 한에서 Button오브젝트를 다 배열로 만들어주고 Find를 이용해 해당 배열에서 On 오브젝트 Off 오브젝트를 관리할수도있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 방법 역시 굉장한 단점이 존재하는데 위와 같이 코드를 작성하고 실행한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;buttons[0]의 자리는 새롭게 배열의 값이 변경 되었을 때 가장 최신 버튼 오브젝트가 가져가고 내가 원하는 인덱스 번호에 내가 원하는 버튼을 붙일 수는 없는 것 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확하지는 않은데 인덱스 번호가 부여되는 방식이 어떻게 되는지 궁굼해서 몇 번 테스트해보니 그랬었다 그 자동차 주차장 원리 .. 뭐 그거 흠..그거 같은데 좀 더 찾아봐야겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하면 배열의 값이 동적으로 변경하지 않고 배열의 양이 굉장히 많다면 사용해볼만한것 같음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;what.gif&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;951&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4hxnN/btsEyQjp5y2/z84zR8cYp1evx3kifeLeF1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4hxnN/btsEyQjp5y2/z84zR8cYp1evx3kifeLeF1/img.gif&quot; data-alt=&quot;첫 실행 시 배열 button[0] 3번째 버튼이였지만, 새로 버튼을 추가하니 4번째 버튼이 button[0]이 되었다..!!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4hxnN/btsEyQjp5y2/z84zR8cYp1evx3kifeLeF1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/4hxnN/btsEyQjp5y2/z84zR8cYp1evx3kifeLeF1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1413&quot; height=&quot;951&quot; data-filename=&quot;what.gif&quot; data-origin-width=&quot;1413&quot; data-origin-height=&quot;951&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;첫 실행 시 배열 button[0] 3번째 버튼이였지만, 새로 버튼을 추가하니 4번째 버튼이 button[0]이 되었다..!!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>홍대 IT/게임 UI&amp;amp;UX 프로그래밍</category>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/11</guid>
      <comments>https://junkhwang.tistory.com/11#entry11comment</comments>
      <pubDate>Tue, 6 Feb 2024 22:50:37 +0900</pubDate>
    </item>
    <item>
      <title>Apple Catch</title>
      <link>https://junkhwang.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;제작 과정 중 실수 부터 정리&lt;/p&gt;
&lt;pre id=&quot;code_1707144615933&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private AudioSource audioSource;

 private void Start()
 {
     audioSource = GetComponent&amp;lt;AudioSource&amp;gt;();
 }



private void OnTriggerEnter(Collider other)
{
    Debug.LogFormat(&quot;잡았다 =&amp;gt;{0}&quot;,other.gameObject);
    Debug.LogFormat(&quot;Tag == {0}&quot;,other.tag);

    if (other.tag == &quot;Fruit&quot;)
    {
        this.audioSource.PlayOneShot(fruitSfx);
        this.score += appleScore;
        Debug.Log(&quot;과일 먹었다&quot;);
        Debug.Log(score);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GetComponent를 하지 않고 오디오 소스를 계속 호출하면서 Null이 뜨는데 원인파악에 상당히 많은 시간을 사용했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Log를 찍어봤는데 Tag의 값이 널이 뜨지 않았기에 더욱 혼란스러웠던 것 같다 아주 기초적인 부분인 것 같은데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전반적으로 내가 사용하는 혹은 사용하려는 기능을 막 가져다 붙이는게 아니라 어떤 방식으로 구동되는지에 대한 관심이 필요한 것 같다 유니티 도큐먼트를 애용하자..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707144894884&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public IEnumerator RandomDrop()
{
    while (true)
    {
        float rand = Random.RandomRange(-1.5f, 1.5f);
        int itemPosX = Mathf.RoundToInt(rand);

        rand = Random.RandomRange(-1.5f, 1.5f);
        int itemPosZ = Mathf.RoundToInt(rand);


        if (Time.time &amp;gt; dropItemTime)
        {
            dropItemTime = Time.time + timeRate;

            int ran = Random.Range(0, 2);

            if (ran == 0)
            {
                
                createApple();
                this.apple.transform.position = new Vector3(itemPosX, 2.5f, itemPosZ);
            }
            if (ran == 1)
            {
                
                createBomb();
                this.bomb.transform.position = new Vector3(itemPosX, 2.5f, itemPosZ);
            }
            if ((setTime-Time.deltaTime ==0))
            {
                Debug.Log(&quot;break&quot;);
                break;
            }
        }
        yield return null;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코루틴...친해지고 싶은 코루틴..별이 무려 다섯개나 붙은 강력한 친구이지만 내가 너무 약해서그런지 아직 친하지않다&lt;/p&gt;
&lt;pre id=&quot;code_1707145001656&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (ran == 0)
{
    this.apple.transform.position = new Vector3(itemPosX, 2.5f, itemPosZ);
    createApple();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드중 일부를 이런식으로 작성해서 Apple오브젝트가 사방팔방으로 순간이동하는 버그가 발생했었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이또한 잘 생각해보면 생성된 Apple의 위치값을 지정해주는 방식이 정상적인데 생성전에 포지션을 변경해버리니 기존에 생성된 Apple들이 이곳 저곳 방황하게 되었다 이또한 코드를 생각없이 붙이는데 급급해서 생긴 실수 같다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각하고,,설계하고,,,타이핑 하자...&lt;/p&gt;</description>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/9</guid>
      <comments>https://junkhwang.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 5 Feb 2024 23:59:07 +0900</pubDate>
    </item>
    <item>
      <title>디자인 패턴, 직렬화&amp;amp;역직렬화, 동기&amp;amp;비동기</title>
      <link>https://junkhwang.tistory.com/8</link>
      <description>&lt;blockquote data-ke-size=&quot;size16&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;[디자인 패턴]&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 반복적으로 발생하는 프로그래밍 문제에 대한 일반적인 해결책을 제공하며 코드를 더욱 효율적이고 유지 관리하기 쉬운 형태로 만들 수 있도록 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인&amp;nbsp;패턴의&amp;nbsp;주요&amp;nbsp;장점:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드 재사용성 향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 유지 관리 및 확장성 향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 코드 결합도 감소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 팀 협업 향상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티 게임 개발에 자주 사용되는 디자인 패턴:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 싱글톤 패턴 : 게임 내에서 유일한 인스턴스를 유지해야 하는 개체를 만들 때 사용 (게임 매니저,오디오 매니저)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 팩토리 패턴 : 객체 생성코드를 추상화, 다양한 유형의 객체 관리에 유용 (적 유닛, 아이템 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 옵저버 패턴 : 한 객체의 상태 변화를 다른 객체에 알릴 때 사용 (UI 업데이트, 이벤트 처리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 상태 패턴 : 객체의 상태에 따라 동작이 달라지는 경우 사용 (플레이어 캐릭터의 공격, 이동 상태)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 전략 패턴 : 알고리즘을 객체로 캡슐화하여 동적으로 변경할 수 있도록 함 (적 캐릭터의 AI,플레이어 캐릭터의 공격 방식 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴을 전반적으로 요약하면 &lt;b&gt;코드의 효율성, 유지 관리성, 확장성등&amp;nbsp;&lt;/b&gt;일종의 수학의 정석 처럼 코드의 정석 뭐 이런 느낌인 것 같다 클린 코드..? 같은 느낌&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[직렬화 &amp;amp; 역직렬화]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[직렬화]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직렬화의 정의 : 객체의 데이터를 바이트 배열과 같은 연속된 데이터 형식으로 변환하는 '과정'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직렬화의 장점 :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터를 파일로 저장하여 나중에 다시 불러올 수 있음 (오늘 수업중 나왔던 로컬 저장?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터 공유 및 재사용성 강화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 네트워크를 통해 게임 데이터를 전송할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서의 직렬화 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. [SerializeField] 어트리뷰트를 사용하여 직렬화할 변수를 지정합니다. &lt;br /&gt;2. UnityEditor.SerializeUtility 클래스를 사용하여 직렬화 및 역직렬화 코드를 직접 작성할 수 있음&lt;br /&gt;3. ScriptableObject 클래스를 상속받아 직렬화 가능한 커스텀 데이터 클래스를 만들 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[역직렬화]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역직렬화의 정의 : 직렬화된 데이터를 다시 객체로 변환하는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역지렬화의 장점 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 저장된 게임 데이터를 다시 불러와 게임을 재개 및 편집 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다른 개발자가 공유한 게임 데이터를 불러와 사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 네트워크를 통해 받은 게임 데이터를 사용할 수 이씀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서의 역직렬화 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.UnityEditor.SerializeUtility 클래스를 사용하여 직렬화 및 역지렬화 코드를 작성할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ScriptableObject 클래스를 상속받아 직렬화 가능한 커스텀 데이터 클래스 제작 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직렬화 &amp;amp; 역직렬화 요약하면&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저의 재화,아이템,진행도 등 등 전반적인 데이터 저장 및 관리를 하기 위해 주로 사용되는 것 같다&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;[동기 &amp;amp; 비동기]&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[동기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기의 정의 : 함수가 반환되기 전에 함수 내 모든 코드가 완료될 때까지 기다리는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기 방식의 장점:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드 실행 순서를 명확하게 이해하기 쉽다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 간단하고 직관적인 코딩 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기 방식의 단점:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드 실행 속도가 느려질 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다른 작업에 영향을 미칠 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 동기:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.대부분의 c#코드는 동기 방식으로 진행된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.MonoBehaviour 클래스의 모든 메서드는 동기 방식으로 실행된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.WaitForSeconds&amp;nbsp;함수를&amp;nbsp;사용하여&amp;nbsp;동기&amp;nbsp;방식으로&amp;nbsp;일정&amp;nbsp;시간&amp;nbsp;동안&amp;nbsp;기다릴&amp;nbsp;수&amp;nbsp;있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[비동기]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기의 정의 : 함수가 반환되기 전에 일부 코드를 실행하고 다른 작업을 수행하도록 허용하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 방식의 장점:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 코드 실행 속도를 높일 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 다른 작업에 영향을 줄 수 없도록 코드를 분리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 방식의 단점 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.코드 실행 순서를 이해하기 어려울 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 훨신 복잡한 코딩 방식이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 비동기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[IEnumerator]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스를 사용하여 비동기 &lt;b&gt;코루틴&lt;/b&gt;을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yield 키워드를 사용하여 코루틴 실행을 일시 중지하고 나중에 다시 시작할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[async/await]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키워드를 사용하여 비동기 함수를 만들 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기 방식 코드처럼 작성하면서 비동기 작업을 수행할 수 있도록 한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;async 키워드를 사용하여 비동기 함수를 선언하고 await 키워드를 사용하여 비동기 작업을 기다린다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[UnityWebRequest]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스를 사용하여 비동기 방식으로 웹 요청을 수행할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서&amp;nbsp;웹&amp;nbsp;요청을&amp;nbsp;수행하는&amp;nbsp;데&amp;nbsp;사용되는&amp;nbsp;클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기/비동기 요약하면 동기 방식의 경우 직관적이고 작업하기에 간편하지만 사용자가 원하는 기능 자체가 다소 복잡하다면 구현하기에는 다소 어려울 수도 있어보인다 비동기 방식은 시작부터 좀 복잡하지만 사용자가 원하는 기능에 제약이 많이 줄어들고 유니티의 전반적인 규칙을 제어하고 활용할 수 있을 것 같다 .. 유니티와 c#의 이해도가 깊을 수록 가치가 높은 방식 같아 보임&lt;/p&gt;</description>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/8</guid>
      <comments>https://junkhwang.tistory.com/8#entry8comment</comments>
      <pubDate>Mon, 5 Feb 2024 23:46:18 +0900</pubDate>
    </item>
    <item>
      <title>Shooting 게임 만들기</title>
      <link>https://junkhwang.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;일정하게 총알 발사하기&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1707075411624&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BattleSheepControllerH : MonoBehaviour
{
    [SerializeField] private float moveSpeed;
    [SerializeField] BulletGeneratorH BulletGeneratorH;
    [SerializeField] private Transform playerPostion;
    [SerializeField] private float shootRate; // 총알 발사 속도 조절기
    private float nextShoot;
    void Start()
    {

    }


    void Update()
    {
        // [비행기 이동 구현]
        float postionX = Input.GetAxisRaw(&quot;Horizontal&quot;);
        float postionY = Input.GetAxisRaw(&quot;Vertical&quot;);
        Vector3 dir = new Vector3(postionX, postionY, 0);
        this.transform.Translate(dir * this.moveSpeed * Time.deltaTime);



        // [총알 발사]
        if (Input.GetKey(KeyCode.Space) &amp;amp;&amp;amp; Time.time &amp;gt; nextShoot)
        {
            //총알 발사 속도 제한
            nextShoot = Time.time + shootRate;

            
            //총알 작동 방식을 구현하고 총알의 프리팹 shooting()을 통해서 총알 인스턴스를 호출 -&amp;gt; 스크립트 내부의 클래스호출해야 하기때문에 스크립트정보를 알려줘야함
            GameObject playerShoot = this.BulletGeneratorH.Shooting();
            playerShoot.transform.position = this.playerPostion.position; // player 몸통에서 총알이 발사 되어야 함 -&amp;gt; 총알의 위치 지정

        }
        

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스페이스 바를 난타하기도 힘들고 균일하게 총알이 발사되지 않는 현상을 수정하기 위해&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n초 마다 총알이 발사 될 수 있게 하고 싶었다.. n초 마다는 Time이니깐 유니티 다큐멘테이션을 찾아봤다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2760&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG3Xfp/btsEoKqcAHz/uMJzsxKwVjhUNKhKgNSdS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG3Xfp/btsEoKqcAHz/uMJzsxKwVjhUNKhKgNSdS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG3Xfp/btsEoKqcAHz/uMJzsxKwVjhUNKhKgNSdS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG3Xfp%2FbtsEoKqcAHz%2FuMJzsxKwVjhUNKhKgNSdS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2760&quot; height=&quot;764&quot; data-origin-width=&quot;2760&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Time.time은 프로젝트 재생 시작 후 경과한 시간 초 단위로 반환합니다. 흠..들어가서 확인해보니원하는 코드가 아예 작성이 되어있었다 &lt;a href=&quot;https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-time.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-time.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1707075665096&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Time-time - Unity 스크립팅 API&quot; data-og-description=&quot;The time at the beginning of this frame (Read Only).&quot; data-og-host=&quot;docs.unity3d.com&quot; data-og-source-url=&quot;https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-time.html&quot; data-og-url=&quot;https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-time.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-time.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unity3d.com/kr/2022.3/ScriptReference/Time-time.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Time-time - Unity 스크립팅 API&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The time at the beginning of this frame (Read Only).&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.unity3d.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>홍대 IT/게임 클라이언트 프로그래밍</category>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/7</guid>
      <comments>https://junkhwang.tistory.com/7#entry7comment</comments>
      <pubDate>Mon, 5 Feb 2024 05:00:59 +0900</pubDate>
    </item>
    <item>
      <title>첫 클라이언트 개발자 업무.. 아주 간단한 런게임</title>
      <link>https://junkhwang.tistory.com/6</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동생이 본인 포트폴리오에 사용하기 위해 본인의 리소스를 활용해 단순 영상용 게임 제작을 의뢰했다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;숙제하기에도 벅찬데 실제 개발자가 된것 처럼 연습하기 좋겠다 생각하여 대충 해주기로 했다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2LjjV/btsEnUmfOtc/C2bn2k3rKLAhjJCzFRl7r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2LjjV/btsEnUmfOtc/C2bn2k3rKLAhjJCzFRl7r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2LjjV/btsEnUmfOtc/C2bn2k3rKLAhjJCzFRl7r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2LjjV%2FbtsEnUmfOtc%2FC2bn2k3rKLAhjJCzFRl7r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;989&quot; height=&quot;200&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;plyer로 사용할 이미지가 모두 붙어져있어 유니티 기능을 활용하여 잘라쓰려했으나&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EzdLG/btsEkwGMXei/WsltgGHrpMjebwB4Yhn7F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EzdLG/btsEkwGMXei/WsltgGHrpMjebwB4Yhn7F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EzdLG/btsEkwGMXei/WsltgGHrpMjebwB4Yhn7F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzdLG%2FbtsEkwGMXei%2FWsltgGHrpMjebwB4Yhn7F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;166&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알 수 없는 에러발생..에러 내용을 찾아보니 패키지 매니저가 없어서 생긴 문제로 확인되었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RZhtE/btsEoM2nKPE/ehXIMggqkehxM7VInN7FMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RZhtE/btsEoM2nKPE/ehXIMggqkehxM7VInN7FMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RZhtE/btsEoM2nKPE/ehXIMggqkehxM7VInN7FMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRZhtE%2FbtsEoM2nKPE%2FehXIMggqkehxM7VInN7FMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;438&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/skiiO/btsEkUnxKsU/QdTKnKStS1OkYScCBONWB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/skiiO/btsEkUnxKsU/QdTKnKStS1OkYScCBONWB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/skiiO/btsEkUnxKsU/QdTKnKStS1OkYScCBONWB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FskiiO%2FbtsEkUnxKsU%2FQdTKnKStS1OkYScCBONWB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;152&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 패키지를 다운 받고 자르고 싶은 이미지에 들어가서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUmgkJ/btsEnWdkfgT/TFvSZJ6sPjjoHL5szdFxZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUmgkJ/btsEnWdkfgT/TFvSZJ6sPjjoHL5szdFxZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUmgkJ/btsEnWdkfgT/TFvSZJ6sPjjoHL5szdFxZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUmgkJ%2FbtsEnWdkfgT%2FTFvSZJ6sPjjoHL5szdFxZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;153&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티플라이 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pOYm3/btsEnjGoVyt/hL1NubXI9asi2ul0HKTG4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pOYm3/btsEnjGoVyt/hL1NubXI9asi2ul0HKTG4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pOYm3/btsEnjGoVyt/hL1NubXI9asi2ul0HKTG4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpOYm3%2FbtsEnjGoVyt%2FhL1NubXI9asi2ul0HKTG4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;317&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프라이트 에디터에 들어가 Type을 오토매으로 바꿔주었다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SLqmO/btsEqxRq1Q1/RqgPBGIeKZJKOKTjif2HX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SLqmO/btsEqxRq1Q1/RqgPBGIeKZJKOKTjif2HX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SLqmO/btsEqxRq1Q1/RqgPBGIeKZJKOKTjif2HX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSLqmO%2FbtsEqxRq1Q1%2FRqgPBGIeKZJKOKTjif2HX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;206&quot; height=&quot;230&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와우 자동으로 한장의 이미지를 적당한 크기로 잘라주었다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;1014&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3zHBk/btsElJeZHcf/p9vadrvETU8Pwy5GzTjAGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3zHBk/btsElJeZHcf/p9vadrvETU8Pwy5GzTjAGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3zHBk/btsElJeZHcf/p9vadrvETU8Pwy5GzTjAGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3zHBk%2FbtsElJeZHcf%2Fp9vadrvETU8Pwy5GzTjAGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;513&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;1014&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대충 리소스 이미지로 배경을 클라이언트가 원하는대로 배치하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 간단하게 캐릭터 움직임 및 애니메이션을 만들었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706960733454&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Runtime.CompilerServices;
using UnityEngine;
using UnityEngine.UIElements;

public class PlayerController : MonoBehaviour
{
    [SerializeField] private Rigidbody2D rb;
    [SerializeField] private float moveForce;
    [SerializeField] private float jumpForce;
    [SerializeField] private Animator animator;
    [SerializeField] private PlayerController playerController;

   
    void Start()
    {
        //animator = GetComponent&amp;lt;Animator&amp;gt;();
    }



    void Update()
    {
        int dirX = 0;

        if (Input.GetKey(KeyCode.RightArrow))
        {
            dirX = 1;
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            dirX = -1;
            
        }

        if (Mathf.Abs(this.rb.velocity.x) &amp;lt; 3 &amp;amp;&amp;amp; dirX !=0)
        {
            this.rb.AddForce(this.transform.right * dirX * moveForce);
            this.rb.transform.localScale = new Vector3(dirX * 1.1f,1.1f,1.1f);
            this.animator.SetInteger(&quot;state&quot;, 0);
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            this.rb.AddForce(this.transform.up * jumpForce);

            this.animator.SetInteger(&quot;state&quot;, 1);

        }
        

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 자연스러운 연출을 위해 카메라를 player를 따라 갈 수 있도록 붙여주었다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU9zZa/btsEm8LR618/DOnO3G0Kv9UsvM31smOFjk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU9zZa/btsEm8LR618/DOnO3G0Kv9UsvM31smOFjk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU9zZa/btsEm8LR618/DOnO3G0Kv9UsvM31smOFjk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bU9zZa/btsEm8LR618/DOnO3G0Kv9UsvM31smOFjk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1898&quot; height=&quot;963&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;963&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y값 까지는 움직이지 않는게 좋다고 생각하여 코드 일부분 수정..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706960831322&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    [SerializeField] GameObject player;
    [SerializeField] float cameraSpeed;

    // Update is called once per frame
    void Update()
    {
        Vector3 dir = player.transform.position - this.transform.position;
        Debug.Log(dir);
        Vector3 moveVector = new Vector3(dir.x * cameraSpeed * Time.deltaTime, 0.0f, 0.0f);
        this.transform.Translate(moveVector);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 인게임 영상&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fire.gif&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zUyoE/btsEnVMgPdk/yE12HNeBkpgm1mMoTmKMPK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zUyoE/btsEnVMgPdk/yE12HNeBkpgm1mMoTmKMPK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zUyoE/btsEnVMgPdk/yE12HNeBkpgm1mMoTmKMPK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zUyoE/btsEnVMgPdk/yE12HNeBkpgm1mMoTmKMPK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;370&quot; data-filename=&quot;Fire.gif&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 점프와 점프 애니메이션을 GetKeyDown에 구현해 무한 점프 이슈와 앞버튼을 누르면 애니메이션이 짤리는 이슈가 있지만 연출을 위한 게임이라 가성비있게 대충 만들었다&lt;/p&gt;</description>
      <category>홍대 IT/게임 클라이언트 프로그래밍</category>
      <author>정크황</author>
      <guid isPermaLink="true">https://junkhwang.tistory.com/6</guid>
      <comments>https://junkhwang.tistory.com/6#entry6comment</comments>
      <pubDate>Sat, 3 Feb 2024 20:51:14 +0900</pubDate>
    </item>
  </channel>
</rss>