<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>정신차료~</title>
    <link>https://getup-up.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 4 Aug 2026 18:32:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>리리쟝</managingEditor>
    <image>
      <title>정신차료~</title>
      <url>https://tistory1.daumcdn.net/tistory/5007622/attach/cc495a67a0df424297616c0df94714fb</url>
      <link>https://getup-up.tistory.com</link>
    </image>
    <item>
      <title>230820</title>
      <link>https://getup-up.tistory.com/43</link>
      <description>&lt;pre id=&quot;code_1692518546561&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Fill out your copyright notice in the Description page of Project Settings.


#include &quot;BTService_Detect.h&quot;
#include &quot;HamsterDemoCharacter.h&quot;
#include &quot;MonsterAIController.h&quot;
#include &quot;BehaviorTree/BlackboardComponent.h&quot;
#include &quot;DrawDebugHelpers.h&quot;

UBTService_Detect::UBTService_Detect()
{
	NodeName = TEXT(&quot;Detect&quot;);
	Interval = 1.0f;
}

void UBTService_Detect::TickNode(UBehaviorTreeComponent&amp;amp; OwnerComp, uint8* NodeMemory, float DeltaSeconds)
{
	Super::TickNode(OwnerComp, NodeMemory, DeltaSeconds);

	APawn* ControllingPawn = OwnerComp.GetAIOwner()-&amp;gt;GetPawn();
	if (ControllingPawn == nullptr)
	{
		UE_LOG(LogTemp, Log, TEXT(&quot;Detect Failed - ControllingPawn nullptr&quot;));
		return;
	}

	UWorld* World = ControllingPawn-&amp;gt;GetWorld();
	FVector Center = ControllingPawn-&amp;gt;GetActorLocation();
	float DetectRadius = 800.0f;

	if (World == nullptr)
		return;

	TArray&amp;lt;FOverlapResult&amp;gt; OverlapResults;
	FCollisionQueryParams CollisionQueryParam(NAME_None, false, ControllingPawn);
	bool bResult = World-&amp;gt;OverlapMultiByChannel(
		OverlapResults,
		Center,
		FQuat::Identity,
		ECollisionChannel::ECC_GameTraceChannel3,
		FCollisionShape::MakeSphere(DetectRadius),
		CollisionQueryParam
	);

	if (bResult)
	{
		for (auto OverlapResult : OverlapResults)
		{
			AHamsterDemoCharacter* HamsterDemoCharacter = Cast&amp;lt;AHamsterDemoCharacter&amp;gt;(OverlapResult.GetActor());

			if (HamsterDemoCharacter &amp;amp;&amp;amp; HamsterDemoCharacter-&amp;gt;GetController()-&amp;gt;IsPlayerController())
			{
				OwnerComp.GetBlackboardComponent()-&amp;gt;SetValueAsObject(AMonsterAIController::TargetKey, HamsterDemoCharacter);
				DrawDebugSphere(World, Center, DetectRadius, 16, FColor::Green, false, 0.2f);
				DrawDebugPoint(World, HamsterDemoCharacter-&amp;gt;GetActorLocation(), 10.0f, FColor::Blue, false, 0.2f);
				DrawDebugLine(World, ControllingPawn-&amp;gt;GetActorLocation(), HamsterDemoCharacter-&amp;gt;GetActorLocation(), FColor::Blue, false, 0.2f);
				return;
			}
		}
	}
	else
	{
		OwnerComp.GetBlackboardComponent()-&amp;gt;SetValueAsObject(AMonsterAIController::TargetKey, nullptr);
	}

	DrawDebugSphere(World, Center, DetectRadius, 16, FColor::Red, false, 0.2f);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플레이어가 일정 범위 내에 있을 때 이를 감지하여 플레이어를 따라오는, BTService 를 기반으로 한 Detect&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;프로젝트 폴더의 config -&amp;gt;DefaultEngine.ini 에서 오브젝트에 배정된 트레이스 채널을 확인할 수 있다.&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>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/43</guid>
      <comments>https://getup-up.tistory.com/43#entry43comment</comments>
      <pubDate>Sun, 20 Aug 2023 17:05:04 +0900</pubDate>
    </item>
    <item>
      <title>230817 Blackboard, Behavior Tree</title>
      <link>https://getup-up.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;비헤이비어 트리&lt;/b&gt;에서 태스크는 독립적으로 실행될 수 없고, 반드시 &lt;b&gt;컴포짓 노드Composite Node&lt;/b&gt; 를 거쳐 실행되어야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포짓 노드에는 대표적으로 &lt;b&gt;셀렉터Selector&lt;/b&gt;와 &lt;b&gt;시퀀스Sequence&lt;/b&gt;가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Sequence: 연결된 Task들을 false 결과가 나올 때까지 왼쪽에서 오른쪽으로 수행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Selector: 지정된 조건을 기준으로 조건에 맞는 노드를 실행함&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; ExecuteTask&lt;/b&gt;라는 멤버 함수를 실행하는데, ExecuteTask는 다음 넷 중 하나의 값을 반환해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Aborted&lt;/b&gt;: 태스크 실행 중 중단됨. 결과적으로 실패함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Failed&lt;/b&gt;: 태스크를 수행했지만 실패함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Succeeded&lt;/b&gt;: 태스크를 성공적으로 수행함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- InProgress&lt;/b&gt;: 태스크를 계속 수행하는 중임. 실행 결과는 향후 알려줄 예정임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ExecuteTask 함수의 실행 결과에 따라 컴포짓 내의 다음 태스크를 계속 수행할지, 중단할지 여부가 결정됨. 현재 사용 중인 시퀀스 컴포짓은 자신에 속한 태스크를 실패할 때까지 계속 실행함.&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>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/42</guid>
      <comments>https://getup-up.tistory.com/42#entry42comment</comments>
      <pubDate>Thu, 17 Aug 2023 14:11:48 +0900</pubDate>
    </item>
    <item>
      <title>C++ Link</title>
      <link>https://getup-up.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H4s55GgAg0I&quot;&gt;https://www.youtube.com/watch?v=H4s55GgAg0I&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=H4s55GgAg0I&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/0MMWO/hyTFk3TUXu/bISGWrIfugcAk8BfBmPPyk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;How the C++ Linker Works&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/H4s55GgAg0I&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C++&amp;nbsp;Linking&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;liking: source(C++) file to~ actual executable binary &lt;br /&gt;&lt;br /&gt;&lt;b&gt;compilation&amp;nbsp;=&amp;nbsp;compile&amp;nbsp;+&amp;nbsp;link&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;find&amp;nbsp;where&amp;nbsp;each&amp;nbsp;symbol&amp;nbsp;is&amp;nbsp;&amp;amp;&amp;nbsp;link&amp;nbsp;them&amp;nbsp;together &lt;br /&gt;files&amp;nbsp;are&amp;nbsp;actually&amp;nbsp;seperated,&amp;nbsp;so&amp;nbsp;we&amp;nbsp;need&amp;nbsp;to&amp;nbsp;link&amp;nbsp;them&amp;nbsp;together&amp;nbsp;in&amp;nbsp;one&amp;nbsp;program&amp;nbsp;-&amp;gt;&amp;nbsp;purpose&amp;nbsp;of&amp;nbsp;linker &lt;br /&gt;분리되어있지 않은 한 파일의 코드일지라도 main() 을 찾아서 시작해야 하므로 사실상 main 과 다른 function들을 링크해야 함 &lt;br /&gt;&lt;br /&gt;LNK&amp;nbsp;error&amp;nbsp;=&amp;nbsp;linking&amp;nbsp;error &lt;br /&gt;&lt;br /&gt;static&amp;nbsp;function()&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;this&amp;nbsp;function&amp;nbsp;is&amp;nbsp;only&amp;nbsp;declared&amp;nbsp;for&amp;nbsp;this&amp;nbsp;unit &lt;br /&gt;&lt;br /&gt;if&amp;nbsp;cannot&amp;nbsp;find&amp;nbsp;the&amp;nbsp;exact&amp;nbsp;one&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;linking&amp;nbsp;error! &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>끄적끄적</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/41</guid>
      <comments>https://getup-up.tistory.com/41#entry41comment</comments>
      <pubDate>Wed, 16 Aug 2023 19:03:08 +0900</pubDate>
    </item>
    <item>
      <title>230816 AI</title>
      <link>https://getup-up.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jm450_/UE4-AI-Controller%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-AI%EA%B5%AC%ED%98%84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@jm450_/UE4-AI-Controller%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-AI%EA%B5%AC%ED%98%84&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692161631913&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[UE4] AI Controller를 사용한 AI구현&quot; data-og-description=&quot;언리얼 엔진에서 캐릭터는 controller의 지배를 받는다. 이를 빙의(Poss)라고 부른다.player character가 만들어지게 되면 player controller가 종속적으로 만들어지게 되고 player character는 player controller에&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@jm450_/UE4-AI-Controller%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-AI%EA%B5%AC%ED%98%84&quot; data-og-url=&quot;https://velog.io/@jm450_/UE4-AI-Controller를-사용한-AI구현&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bo1zV3/hyTCCSCoIR/YVrItPY49FKBlfEAvVfFH1/img.png?width=2749&amp;amp;height=497&amp;amp;face=0_0_2749_497,https://scrap.kakaocdn.net/dn/bazvqI/hyTCF2RuFG/WatkZKhkz2Yj16tpOJrhGk/img.png?width=2749&amp;amp;height=497&amp;amp;face=0_0_2749_497,https://scrap.kakaocdn.net/dn/pEIdF/hyTFiSt8xL/PoTMIjpVXXKSv26XWzlFU0/img.png?width=2093&amp;amp;height=854&amp;amp;face=0_0_2093_854&quot;&gt;&lt;a href=&quot;https://velog.io/@jm450_/UE4-AI-Controller%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-AI%EA%B5%AC%ED%98%84&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@jm450_/UE4-AI-Controller%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%9C-AI%EA%B5%AC%ED%98%84&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bo1zV3/hyTCCSCoIR/YVrItPY49FKBlfEAvVfFH1/img.png?width=2749&amp;amp;height=497&amp;amp;face=0_0_2749_497,https://scrap.kakaocdn.net/dn/bazvqI/hyTCF2RuFG/WatkZKhkz2Yj16tpOJrhGk/img.png?width=2749&amp;amp;height=497&amp;amp;face=0_0_2749_497,https://scrap.kakaocdn.net/dn/pEIdF/hyTFiSt8xL/PoTMIjpVXXKSv26XWzlFU0/img.png?width=2093&amp;amp;height=854&amp;amp;face=0_0_2093_854');&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;[UE4] AI Controller를 사용한 AI구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;언리얼 엔진에서 캐릭터는 controller의 지배를 받는다. 이를 빙의(Poss)라고 부른다.player character가 만들어지게 되면 player controller가 종속적으로 만들어지게 되고 player character는 player controller에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;AIController 에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙보드, 비헤이비어 트리 만들고 생성자에서 연결해주기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OnPossess -&amp;gt; 빙의 시 실행되는 함수 / OnUnpossess -&amp;gt; 빙의 해제 시 실행되는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RunAI() -&amp;gt; AI를 실행시켜 주는듯 (블랙보드랑 트리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StopAI() -&amp;gt; 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;MonsterCharacter의 생성자에서&lt;/p&gt;
&lt;pre id=&quot;code_1692163256992&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	AIControllerClass = AMonsterAIController::StaticClass();
	AutoPossessAI = EAutoPossessAI::PlacedInWorldOrSpawned;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;AI컨트롤러 클래스를 AMonsterAIController로 지정하고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;( Type::StaticClass() 를 사용하면 컴파일 타임에서 UClass 타입의 정보를 얻어온다. GetClass는 런타임에서 객체의 클래스를 조회할 때 사용되므로 StaticClass() 와 GetClass() 의 결과는 다를 수 있다. )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PlacedInWorldOrSpawned -&amp;gt; 레벨에 배치되거나 새롭게 스폰되는 MonsterCharacter 마다 MonsterAIController 가 생성되고, 플레이어의 조종을 받는 캐릭터가 아니면 AIController의 지배를 받음.&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>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/40</guid>
      <comments>https://getup-up.tistory.com/40#entry40comment</comments>
      <pubDate>Wed, 16 Aug 2023 14:26:41 +0900</pubDate>
    </item>
    <item>
      <title>230805</title>
      <link>https://getup-up.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Projectile 에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총을 쏨 &amp;gt; 총알이 어딘가에 맞았음(안사라지고) &amp;gt; 맞은 물체를 가져와서 &amp;gt; 맞은 물체가 떄릴수있는애면 &amp;gt; 데미지를 줘&amp;nbsp; &lt;br /&gt;OnFire &amp;gt; OnHit &amp;gt; HitResult.GetActor &amp;gt; if(Damagable) &amp;gt; HitResult의 TakeDamage 호출&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;683&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SPImu/btsp7pOCUEo/ytMfKG1lgR2fUy43kMIDp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SPImu/btsp7pOCUEo/ytMfKG1lgR2fUy43kMIDp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SPImu/btsp7pOCUEo/ytMfKG1lgR2fUy43kMIDp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSPImu%2Fbtsp7pOCUEo%2FytMfKG1lgR2fUy43kMIDp0%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;683&quot; height=&quot;525&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OtherActor = 맞은 애(hit result)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;비정적 멤버 참조는 특정 개체에 상대적이어야 합니다&quot;&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;&lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/284088/why-static-methods-cant-call-non-static-methods-directly&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://softwareengineering.stackexchange.com/questions/284088/why-static-methods-cant-call-non-static-methods-directly&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691245459017&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;Why static methods can't call non-static methods directly?&quot; data-og-description=&quot;I don't understand why most programming language don't allow developers/users to call non-static method from static method directly? What is the reason behind it? p.s. I know, you can create objec...&quot; data-og-host=&quot;softwareengineering.stackexchange.com&quot; data-og-source-url=&quot;https://softwareengineering.stackexchange.com/questions/284088/why-static-methods-cant-call-non-static-methods-directly&quot; data-og-url=&quot;https://softwareengineering.stackexchange.com/questions/284088/why-static-methods-cant-call-non-static-methods-directly&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/o51zz/hyTzfBj2bx/fFX11jx9gLSwZIaL4OQCmK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/284088/why-static-methods-cant-call-non-static-methods-directly&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://softwareengineering.stackexchange.com/questions/284088/why-static-methods-cant-call-non-static-methods-directly&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/o51zz/hyTzfBj2bx/fFX11jx9gLSwZIaL4OQCmK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;Why static methods can't call non-static methods directly?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I don't understand why most programming language don't allow developers/users to call non-static method from static method directly? What is the reason behind it? p.s. I know, you can create objec...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;softwareengineering.stackexchange.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/39</guid>
      <comments>https://getup-up.tistory.com/39#entry39comment</comments>
      <pubDate>Sun, 6 Aug 2023 00:57:52 +0900</pubDate>
    </item>
    <item>
      <title>230804</title>
      <link>https://getup-up.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;캐릭터의 캡슐컴포넌트의 콜리전 프리셋을 HamsterCharacter로 변경해줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwEgiQ/btspXlMoW4A/WKbIUVqZ87IeeJIrmg6jg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwEgiQ/btspXlMoW4A/WKbIUVqZ87IeeJIrmg6jg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwEgiQ/btspXlMoW4A/WKbIUVqZ87IeeJIrmg6jg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwEgiQ%2FbtspXlMoW4A%2FWKbIUVqZ87IeeJIrmg6jg1%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;387&quot; height=&quot;418&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;418&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;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvrKpB/btspUgZdGbQ/tHQr3K9vdqTSJ3BZmgOJ5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvrKpB/btspUgZdGbQ/tHQr3K9vdqTSJ3BZmgOJ5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvrKpB/btspUgZdGbQ/tHQr3K9vdqTSJ3BZmgOJ5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvrKpB%2FbtspUgZdGbQ%2FtHQr3K9vdqTSJ3BZmgOJ5K%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;509&quot; height=&quot;288&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;288&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하다 보니까 firstperson 에 구현되어있는 기존의 projectile을 활용하려면 좀 다른 방법을 찾아야 할 것 같았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@yoo06/%EC%96%B8%EB%A6%AC%EC%96%BC-%EC%97%94%EC%A7%84-HitScan%EA%B3%BC-Projectile-%EB%B9%84%EA%B5%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@yoo06/%EC%96%B8%EB%A6%AC%EC%96%BC-%EC%97%94%EC%A7%84-HitScan%EA%B3%BC-Projectile-%EB%B9%84%EA%B5%90&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691141939996&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;언리얼 엔진 HitScan과 Projectile 비교&quot; data-og-description=&quot;언리얼 엔진에서의 HitScan 과 projectile 방식의 비교&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@yoo06/%EC%96%B8%EB%A6%AC%EC%96%BC-%EC%97%94%EC%A7%84-HitScan%EA%B3%BC-Projectile-%EB%B9%84%EA%B5%90&quot; data-og-url=&quot;https://velog.io/@yoo06/언리얼-엔진-HitScan과-Projectile-비교&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7jCW9/hyTxMGvC6P/T5PTHfgZ3VIIjrymcTKZBK/img.png?width=740&amp;amp;height=466&amp;amp;face=0_0_740_466,https://scrap.kakaocdn.net/dn/ckWSbR/hyTxPXxsZg/OUF99OKXbkUfziO2D2HIG0/img.png?width=740&amp;amp;height=466&amp;amp;face=0_0_740_466,https://scrap.kakaocdn.net/dn/boiwEy/hyTxVi90x0/OR3IiinFdiJeloiUQ8CxFK/img.png?width=1921&amp;amp;height=1270&amp;amp;face=0_0_1921_1270&quot;&gt;&lt;a href=&quot;https://velog.io/@yoo06/%EC%96%B8%EB%A6%AC%EC%96%BC-%EC%97%94%EC%A7%84-HitScan%EA%B3%BC-Projectile-%EB%B9%84%EA%B5%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@yoo06/%EC%96%B8%EB%A6%AC%EC%96%BC-%EC%97%94%EC%A7%84-HitScan%EA%B3%BC-Projectile-%EB%B9%84%EA%B5%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7jCW9/hyTxMGvC6P/T5PTHfgZ3VIIjrymcTKZBK/img.png?width=740&amp;amp;height=466&amp;amp;face=0_0_740_466,https://scrap.kakaocdn.net/dn/ckWSbR/hyTxPXxsZg/OUF99OKXbkUfziO2D2HIG0/img.png?width=740&amp;amp;height=466&amp;amp;face=0_0_740_466,https://scrap.kakaocdn.net/dn/boiwEy/hyTxVi90x0/OR3IiinFdiJeloiUQ8CxFK/img.png?width=1921&amp;amp;height=1270&amp;amp;face=0_0_1921_1270');&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;언리얼 엔진 HitScan과 Projectile 비교&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;언리얼 엔진에서의 HitScan 과 projectile 방식의 비교&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;&lt;a href=&quot;https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/3/4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/3/4/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1691148075727&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;3.4 - 월드와 상호작용하는 프로젝타일&quot; data-og-description=&quot;일인칭 슈팅 프로젝트에서 프로젝타일이 월드와 상호작용하도록 하는 법을 배워봅니다.&quot; data-og-host=&quot;docs.unrealengine.com&quot; data-og-source-url=&quot;https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/3/4/&quot; data-og-url=&quot;https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/3/4/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/3/4/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/3/4/&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;3.4 - 월드와 상호작용하는 프로젝타일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일인칭 슈팅 프로젝트에서 프로젝타일이 월드와 상호작용하도록 하는 법을 배워봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.unrealengine.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;피격 판정을 낼 때는 두 가지 방법이 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Projectile 투사체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바람, 중력 등의 영향을 받는 현실적인 총알, 연산 多, 부하 &amp;uarr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HitScan&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Line Trace(RayCast), 연산 少, 부하 &amp;darr;&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;Projectile에 이미 OnHit가 구현되어 있으니 OnHit에 TakeDamage를 추가하면 되지 않을까?&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;683&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4CpuX/btsp7JlsjOX/Dq0GV21YMATb1AXpCeMOU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4CpuX/btsp7JlsjOX/Dq0GV21YMATb1AXpCeMOU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4CpuX/btsp7JlsjOX/Dq0GV21YMATb1AXpCeMOU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4CpuX%2Fbtsp7JlsjOX%2FDq0GV21YMATb1AXpCeMOU0%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;683&quot; height=&quot;525&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;525&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;Character의 Controller 를 받아와서 Projectile 에 넘겨줘야 함 (takedamage에서 사용)&amp;nbsp;&lt;/p&gt;</description>
      <category>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/38</guid>
      <comments>https://getup-up.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 4 Aug 2023 23:41:39 +0900</pubDate>
    </item>
    <item>
      <title>230801</title>
      <link>https://getup-up.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;projectile&amp;nbsp;총&amp;nbsp;쏘는&amp;nbsp;거&amp;nbsp;트레이스&amp;nbsp;채널&amp;nbsp;확인&amp;nbsp;/&amp;nbsp;attack&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;b&gt;콜리전과 트레이스 채널에 대한 메모&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리&amp;nbsp;엔진의&amp;nbsp;활용을&amp;nbsp;위해서는&amp;nbsp;&lt;b&gt;콜리전Collision&lt;/b&gt;이라는&amp;nbsp;&lt;b&gt;물리적&amp;nbsp;충돌&amp;nbsp;영역&lt;/b&gt;을&amp;nbsp;설정해야&amp;nbsp;함&amp;nbsp;&lt;br /&gt;언리얼&amp;nbsp;엔진에서&amp;nbsp;콜리전의&amp;nbsp;제작&amp;nbsp;방법은&amp;nbsp;다음과&amp;nbsp;같음.&lt;br /&gt;-&amp;nbsp;스태틱메시&amp;nbsp;애셋:&amp;nbsp;스태틱메시&amp;nbsp;애셋에&amp;nbsp;콜리전&amp;nbsp;영역을&amp;nbsp;심을&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;에디터에서&amp;nbsp;설정&amp;nbsp;가능.&amp;nbsp;설정&amp;nbsp;시&amp;nbsp;스태틱메시&amp;nbsp;컴포넌트에서&amp;nbsp;비주얼과&amp;nbsp;충돌&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;기능을&amp;nbsp;설정하여&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;있음.&lt;br /&gt;-&amp;nbsp;기본&amp;nbsp;도형Primitive&amp;nbsp;컴포넌트:&amp;nbsp;구체,&amp;nbsp;박스,&amp;nbsp;캡슐&amp;nbsp;등의&amp;nbsp;기본&amp;nbsp;도형으로&amp;nbsp;충돌&amp;nbsp;영역을&amp;nbsp;지정함.&amp;nbsp;스켈레탈&amp;nbsp;메시를&amp;nbsp;움직일&amp;nbsp;때&amp;nbsp;주로&amp;nbsp;사용함.&lt;br /&gt;-&amp;nbsp;피직스&amp;nbsp;애셋:&amp;nbsp;특정&amp;nbsp;상황에서&amp;nbsp;캐릭터의&amp;nbsp;관절이&amp;nbsp;흐느적거리는&amp;nbsp;Ragdoll&amp;nbsp;효과를&amp;nbsp;구현할&amp;nbsp;때&amp;nbsp;사용함&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;상호작용을&amp;nbsp;가능하게&amp;nbsp;하려면&amp;nbsp;물리&amp;nbsp;설정을&amp;nbsp;알아야&amp;nbsp;함.&amp;nbsp; &lt;br /&gt;1.&amp;nbsp;콜리전&amp;nbsp;채널과&amp;nbsp;기본&amp;nbsp;반응 &lt;br /&gt;2.&amp;nbsp;콜리전&amp;nbsp;채널의&amp;nbsp;용도 &lt;br /&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;충돌체에는&amp;nbsp;반드시&amp;nbsp;&lt;b&gt;하나의&amp;nbsp;콜리전&amp;nbsp;채널을&amp;nbsp;설정&lt;/b&gt;해야&amp;nbsp;함.&amp;nbsp;콜리전&amp;nbsp;채널은&amp;nbsp;액터의&amp;nbsp;종류에&amp;nbsp;따라&amp;nbsp;부여되는&amp;nbsp;컴포넌트가&amp;nbsp;달라짐. &lt;br /&gt;-&amp;nbsp;WorldStatic:&amp;nbsp;움직이지&amp;nbsp;않는&amp;nbsp;정적인&amp;nbsp;기본&amp;nbsp;액터에&amp;nbsp;사용함.&amp;nbsp;주로&amp;nbsp;스태틱메시&amp;nbsp;액터에&amp;nbsp;있는&amp;nbsp;스태틱메시&amp;nbsp;컴포넌트에&amp;nbsp;사용함. &lt;br /&gt;-&amp;nbsp;WorldDynamic:&amp;nbsp;움직이는&amp;nbsp;액터에&amp;nbsp;사용함.&amp;nbsp;블루프린트에&amp;nbsp;속한&amp;nbsp;스태틱메시&amp;nbsp;컴포넌트에&amp;nbsp;사용함.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;Pawn:&amp;nbsp;플레이어가&amp;nbsp;조종하는&amp;nbsp;물체에&amp;nbsp;사용함.&amp;nbsp;캐릭터의&amp;nbsp;충돌을&amp;nbsp;담당하는&amp;nbsp;캡슐&amp;nbsp;컴포넌트에&amp;nbsp;설정. &lt;br /&gt;-&amp;nbsp;Visibility:&amp;nbsp;배경&amp;nbsp;물체가&amp;nbsp;시각적으로&amp;nbsp;보이는지&amp;nbsp;탐지하는&amp;nbsp;데&amp;nbsp;사용함.&amp;nbsp;탐지에서&amp;nbsp;폰은&amp;nbsp;제외됨.&amp;nbsp;마우스롤&amp;nbsp;물체를&amp;nbsp;선택하는&amp;nbsp;피킹Picking&amp;nbsp;기능을&amp;nbsp;구현할&amp;nbsp;때&amp;nbsp;사용함. &lt;br /&gt;-&amp;nbsp;Camera:&amp;nbsp;카메라&amp;nbsp;설정을&amp;nbsp;위해&amp;nbsp;카메라와&amp;nbsp;목표물&amp;nbsp;간에&amp;nbsp;장애물이&amp;nbsp;있는지&amp;nbsp;탐지하는&amp;nbsp;데&amp;nbsp;사용함.&amp;nbsp;(GTA&amp;nbsp;방식의&amp;nbsp;뷰를&amp;nbsp;쓸&amp;nbsp;때&amp;nbsp;장애물이&amp;nbsp;캐릭터를&amp;nbsp;가리면&amp;nbsp;카메라를&amp;nbsp;장애물&amp;nbsp;앞으로&amp;nbsp;줌인하는&amp;nbsp;기능에&amp;nbsp;Camera&amp;nbsp;채널이&amp;nbsp;사용되었음) &lt;br /&gt;-&amp;nbsp;PhysicsBody:&amp;nbsp;물리&amp;nbsp;시뮬레이션으로&amp;nbsp;움직이는&amp;nbsp;컴포넌트에&amp;nbsp;설정함. &lt;br /&gt;-&amp;nbsp;Vehicle:&amp;nbsp;탈&amp;nbsp;것에&amp;nbsp;사용 &lt;br /&gt;-&amp;nbsp;Destructible:&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;폰의&amp;nbsp;CapsuleComponent&amp;nbsp;&amp;gt;&amp;nbsp;Collision&amp;nbsp;Enabled&amp;nbsp;에서 &lt;br /&gt;- Query: 두 물체의 충돌 영역이 서로 겹치는지 테스트하는 설정. 충돌 영역이 겹치면(오버랩Overlap) 관련 컴포넌트에 BeginOverlap 이벤트가 발생함. 지정 영역에 물체가 충돌하는지 탐지하는 레이캐스트Raycast와 스윕Sweep도 Query에 속함.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;Physics:&amp;nbsp;물리적인&amp;nbsp;시뮬레이션을&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;설정. &lt;br /&gt;-&amp;nbsp;Query&amp;nbsp;and&amp;nbsp;Physics:&amp;nbsp;두&amp;nbsp;기능을&amp;nbsp;모두&amp;nbsp;사용하는&amp;nbsp;설정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;액터마다&amp;nbsp;필요한&amp;nbsp;기능을&amp;nbsp;파악해&amp;nbsp;Query와&amp;nbsp;Physics&amp;nbsp;설정을&amp;nbsp;구분하여&amp;nbsp;지정하는&amp;nbsp;것이&amp;nbsp;효과적임.&amp;nbsp; &lt;br /&gt;콜리전&amp;nbsp;채널&amp;nbsp;간의&amp;nbsp;반응은&amp;nbsp;다음과&amp;nbsp;같음 &lt;br /&gt;-&amp;nbsp;무시Ignore:&amp;nbsp;콜리전이&amp;nbsp;있어도&amp;nbsp;충돌&amp;nbsp;X &lt;br /&gt;-&amp;nbsp;겹침Overlap:&amp;nbsp;물체가&amp;nbsp;뚫고&amp;nbsp;지나갈&amp;nbsp;수&amp;nbsp;있지만&amp;nbsp;이벤트&amp;nbsp;발생&amp;nbsp;X &lt;br /&gt;- 블록Block: 물체가 뚫고 지나가지 못하도록 막음&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;하는 콜리전 채널 (WorldStatic,WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible) &lt;br /&gt;트레이스&amp;nbsp;채널:&amp;nbsp;어떤&amp;nbsp;&lt;b&gt;행동에&amp;nbsp;설정&lt;/b&gt;하는&amp;nbsp;콜리전&amp;nbsp;채널&amp;nbsp;(Visibility,&amp;nbsp;Camera) &lt;br /&gt;공격이란&amp;nbsp;공격&amp;nbsp;애니메이션이&amp;nbsp;일어나는&amp;nbsp;특정&amp;nbsp;타이밍에&amp;nbsp;공격&amp;nbsp;범위&amp;nbsp;안에&amp;nbsp;위치한&amp;nbsp;액터가&amp;nbsp;있는지&amp;nbsp;감지하고&amp;nbsp;감지된&amp;nbsp;액터에게&amp;nbsp;대미지를&amp;nbsp;전달하는&amp;nbsp;행위라고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있음 &lt;br /&gt;어떠한&amp;nbsp;행동에&amp;nbsp;대한&amp;nbsp;물리&amp;nbsp;판정이&amp;nbsp;필요할&amp;nbsp;때도&amp;nbsp;물리&amp;nbsp;엔진을&amp;nbsp;활용&amp;nbsp;가능함 &lt;br /&gt;행동&amp;nbsp;판정을&amp;nbsp;위한&amp;nbsp;트레이스&amp;nbsp;채널이&amp;nbsp;제공됨. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;트레이스&amp;nbsp;채널의&amp;nbsp;활용&amp;nbsp;예시)&lt;/b&gt; &lt;br /&gt;프로젝트&amp;nbsp;설정&amp;nbsp;&amp;gt;&amp;nbsp;Collision&amp;nbsp;&amp;gt;&amp;nbsp;트레이스&amp;nbsp;채널에&amp;nbsp;Attack을&amp;nbsp;추가,&amp;nbsp;기본&amp;nbsp;반응을&amp;nbsp;무시로&amp;nbsp;설정&amp;nbsp; &lt;br /&gt;Preset&amp;nbsp;설정&amp;nbsp;&amp;gt;&amp;nbsp;앞서&amp;nbsp;제작한&amp;nbsp;콜리전&amp;nbsp;프리셋&amp;nbsp;ABCharacter에서&amp;nbsp;Attack&amp;nbsp;트레이스&amp;nbsp;채널과의&amp;nbsp;설정은&amp;nbsp;블록으로&amp;nbsp;지정하면 &lt;br /&gt;Attack&amp;nbsp;트레이스&amp;nbsp;채널을&amp;nbsp;사용하는&amp;nbsp;액터의&amp;nbsp;물리적&amp;nbsp;행동은,&amp;nbsp;캐릭터의&amp;nbsp;캡슐&amp;nbsp;컴포넌트에&amp;nbsp;설정한&amp;nbsp;ABCharacter&amp;nbsp;콜리전&amp;nbsp;프리셋에만&amp;nbsp;반응하게&amp;nbsp;됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격&amp;nbsp;판정을&amp;nbsp;내리는&amp;nbsp;로직을&amp;nbsp;위해&amp;nbsp;트레이스&amp;nbsp;채널을&amp;nbsp;사용해&amp;nbsp;&lt;b&gt;물리적&amp;nbsp;충돌&amp;nbsp;여부를&amp;nbsp;가리는&amp;nbsp;함수&lt;/b&gt;인&amp;nbsp;&lt;b&gt;SweepSingleByChannel&lt;/b&gt;을&amp;nbsp;사용. &lt;br /&gt;기본&amp;nbsp;도형을&amp;nbsp;인자로&amp;nbsp;받은&amp;nbsp;후&amp;nbsp;시작&amp;nbsp;지점에서&amp;nbsp;끝&amp;nbsp;지점까지&amp;nbsp;쓸면서sweep&amp;nbsp;해당&amp;nbsp;영역&amp;nbsp;내에&amp;nbsp;물리&amp;nbsp;판정이&amp;nbsp;일어났는지&amp;nbsp;조사함. &lt;br /&gt;위&amp;nbsp;함수의&amp;nbsp;인자로&amp;nbsp;넣은&amp;nbsp;요소들 &lt;br /&gt;-&amp;nbsp;HitResult:&amp;nbsp;물리적&amp;nbsp;충돌이&amp;nbsp;탐지된&amp;nbsp;경우&amp;nbsp;관련된&amp;nbsp;정보를&amp;nbsp;담을&amp;nbsp;구조체 &lt;br /&gt;-&amp;nbsp;Start:&amp;nbsp;탐색을&amp;nbsp;시작할&amp;nbsp;위치 &lt;br /&gt;-&amp;nbsp;End:&amp;nbsp;탐색을&amp;nbsp;끝낼&amp;nbsp;위치 &lt;br /&gt;-&amp;nbsp;Rot:&amp;nbsp;탐색에&amp;nbsp;사용할&amp;nbsp;도형의&amp;nbsp;회전 &lt;br /&gt;-&amp;nbsp;TraceChannel:&amp;nbsp;물리&amp;nbsp;충돌&amp;nbsp;감지에&amp;nbsp;사용할&amp;nbsp;트레이스&amp;nbsp;채널&amp;nbsp;정보 &lt;br /&gt;-&amp;nbsp;CollisionShape:&amp;nbsp;탐색에&amp;nbsp;사용할&amp;nbsp;기본&amp;nbsp;도형&amp;nbsp;정보.&amp;nbsp;구체,&amp;nbsp;캡슐,&amp;nbsp;박스&amp;nbsp;사용 &lt;br /&gt;-&amp;nbsp;Params:&amp;nbsp;탐색&amp;nbsp;방법에&amp;nbsp;대한&amp;nbsp;설정&amp;nbsp;값을&amp;nbsp;모아둔&amp;nbsp;구조체 &lt;br /&gt;-&amp;nbsp;ResponseParams:&amp;nbsp;탐색&amp;nbsp;반응을&amp;nbsp;설정하기&amp;nbsp;위한&amp;nbsp;구조체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;언리얼&amp;nbsp;엔진은&amp;nbsp;게임에서&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;총&amp;nbsp;32개의&amp;nbsp;콜리전&amp;nbsp;채널을&amp;nbsp;제공함. &lt;br /&gt;32개&amp;nbsp;중&amp;nbsp;8개는&amp;nbsp;언리얼&amp;nbsp;엔진이&amp;nbsp;기본으로&amp;nbsp;사용,&amp;nbsp;6개는&amp;nbsp;엔진에서&amp;nbsp;다른&amp;nbsp;용도로&amp;nbsp;사용하도록&amp;nbsp;예약되어있음. &lt;br /&gt;게임&amp;nbsp;프로젝트에서&amp;nbsp;우리는&amp;nbsp;18개만&amp;nbsp;사용&amp;nbsp;가능함.&amp;nbsp; &lt;br /&gt;게임&amp;nbsp;프로젝트에서&amp;nbsp;새로&amp;nbsp;생성하는&amp;nbsp;오브젝트&amp;nbsp;채널과&amp;nbsp;트레이스&amp;nbsp;채널은&amp;nbsp;ECC_GameTraceChannel&amp;nbsp;1번부터&amp;nbsp;18번까지&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;배정받음. &lt;br /&gt;이는&amp;nbsp;프로젝트의&amp;nbsp;Config&amp;nbsp;폴더의&amp;nbsp;DefaultEngine.ini에서&amp;nbsp;확인&amp;nbsp;가능함. &lt;br /&gt;&lt;br /&gt;콜리전&amp;nbsp;채널&amp;nbsp;지정&amp;nbsp;&amp;gt;&amp;nbsp;FCollisionShape::MakeSphere&amp;nbsp;함수로&amp;nbsp;탐지에&amp;nbsp;사용할&amp;nbsp;도형&amp;nbsp;제작&amp;nbsp;&amp;gt;&amp;nbsp;도형의&amp;nbsp;탐색&amp;nbsp;영역&amp;nbsp;지정&amp;nbsp;&amp;gt;&amp;nbsp;탐색&amp;nbsp;방법&amp;nbsp;설정&amp;nbsp;&amp;gt;&amp;nbsp;탐색&amp;nbsp;반응&amp;nbsp;설정&amp;nbsp;&amp;gt;&amp;nbsp;액터&amp;nbsp;충돌&amp;nbsp;탐지&amp;nbsp;시&amp;nbsp;해당&amp;nbsp;액터에&amp;nbsp;대한&amp;nbsp;정보를&amp;nbsp;얻기&amp;nbsp;위해&amp;nbsp;구조체를&amp;nbsp;넘겨줌 &lt;br /&gt;&lt;br /&gt;언리얼&amp;nbsp;실행&amp;nbsp;환경은&amp;nbsp;메모리에&amp;nbsp;떠&amp;nbsp;있는&amp;nbsp;언리얼&amp;nbsp;오브젝트가&amp;nbsp;사용&amp;nbsp;중인지&amp;nbsp;아닌지를&amp;nbsp;주기적으로&amp;nbsp;검사한&amp;nbsp;후&amp;nbsp;사용하지&amp;nbsp;않는&amp;nbsp;물체는&amp;nbsp;메모리에서&amp;nbsp;자동으로&amp;nbsp;제거함&amp;nbsp;(가비지&amp;nbsp;콜렉션Garbage&amp;nbsp;Collection) &lt;br /&gt;오브젝트의&amp;nbsp;사용&amp;nbsp;여부는&amp;nbsp;다른&amp;nbsp;오브젝트가&amp;nbsp;해당&amp;nbsp;오브젝트를&amp;nbsp;참조하는지로&amp;nbsp;판단함. &lt;br /&gt;FHitResult의&amp;nbsp;멤버&amp;nbsp;변수&amp;nbsp;Actor의&amp;nbsp;선언이&amp;nbsp;일반&amp;nbsp;참조로&amp;nbsp;선언된다면&amp;nbsp;해당&amp;nbsp;함수에서의&amp;nbsp;참조로&amp;nbsp;제거되어야&amp;nbsp;할&amp;nbsp;액터가&amp;nbsp;메모리에&amp;nbsp;그대로&amp;nbsp;남아있는&amp;nbsp;문제가&amp;nbsp;발생함. &lt;br /&gt;해당&amp;nbsp;문제를&amp;nbsp;방지하기&amp;nbsp;위해&amp;nbsp;FHitResult는&amp;nbsp;참조로부터&amp;nbsp;자유롭게&amp;nbsp;포인터&amp;nbsp;정보를&amp;nbsp;전달해주는&amp;nbsp;약&amp;nbsp;포인터TWeakObjectPtr&amp;nbsp;방식으로&amp;nbsp;멤버&amp;nbsp;변수를&amp;nbsp;선언함. &lt;br /&gt;약&amp;nbsp;포인터로&amp;nbsp;지정된&amp;nbsp;액터는&amp;nbsp;IsValid&amp;nbsp;함수를&amp;nbsp;사용해&amp;nbsp;해당&amp;nbsp;액터가&amp;nbsp;유효한지&amp;nbsp;점검한&amp;nbsp;후&amp;nbsp;사용해야&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;디버그&amp;nbsp;드로잉Debug&amp;nbsp;Drawing을&amp;nbsp;활용하여&amp;nbsp;공격&amp;nbsp;범위&amp;nbsp;파악&amp;nbsp;등의&amp;nbsp;디버깅을&amp;nbsp;로그를&amp;nbsp;보지&amp;nbsp;않고도&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;&lt;br /&gt;언리얼&amp;nbsp;엔진이&amp;nbsp;제공하는&lt;b&gt;&amp;nbsp;대미지&amp;nbsp;프레임워크&lt;/b&gt;를&amp;nbsp;사용하면&amp;nbsp;대미지에&amp;nbsp;관련된&amp;nbsp;여러&amp;nbsp;기능을&amp;nbsp;처리할&amp;nbsp;수&amp;nbsp;있음. &lt;br /&gt;언리얼&amp;nbsp;엔진의&amp;nbsp;액터&amp;nbsp;클래스&amp;nbsp;AActor는&amp;nbsp;TakeDamage&amp;nbsp;함수가&amp;nbsp;구현되어&amp;nbsp;있음. &lt;br /&gt;-&amp;nbsp;DamageAmount:&amp;nbsp;전달할&amp;nbsp;대미지의&amp;nbsp;세기 &lt;br /&gt;-&amp;nbsp;DamageEvent:&amp;nbsp;대미지&amp;nbsp;종류 &lt;br /&gt;-&amp;nbsp;EventInstigator:&amp;nbsp;공격&amp;nbsp;명령을&amp;nbsp;내린&amp;nbsp;가해자 &lt;br /&gt;-&amp;nbsp;DamageCauser:&amp;nbsp;대미지&amp;nbsp;전달을&amp;nbsp;위해&amp;nbsp;사용한&amp;nbsp;도구 &lt;br /&gt;대미지&amp;nbsp;전달&amp;nbsp;행위에는&amp;nbsp;피해를&amp;nbsp;입히는&amp;nbsp;주체인&amp;nbsp;가해자와&amp;nbsp;대미지를&amp;nbsp;받는&amp;nbsp;피해자가&amp;nbsp;있음. &lt;br /&gt;대미지를&amp;nbsp;가한&amp;nbsp;진정한&amp;nbsp;가해자는&amp;nbsp;폰이&amp;nbsp;아니라&amp;nbsp;폰에게&amp;nbsp;명령을&amp;nbsp;내린&amp;nbsp;플레이어&amp;nbsp;컨트롤러이므로&amp;nbsp;EventInstigator에는&amp;nbsp;컨트롤러의&amp;nbsp;정보를&amp;nbsp;보내야&amp;nbsp;함. &lt;br /&gt;&lt;br /&gt;액터&amp;nbsp;설정의&amp;nbsp;Can&amp;nbsp;be&amp;nbsp;Damaged&amp;nbsp;속성을&amp;nbsp;해제하면&amp;nbsp;대미지의&amp;nbsp;결과가&amp;nbsp;모두&amp;nbsp;0이&amp;nbsp;되는&amp;nbsp;무적&amp;nbsp;상태가&amp;nbsp;됨. &lt;br /&gt;&lt;br /&gt;무기는&amp;nbsp;캐릭터에&amp;nbsp;트랜스폼으로&amp;nbsp;배치하는&amp;nbsp;것이&amp;nbsp;아니라&amp;nbsp;메시에&amp;nbsp;착용해야&amp;nbsp;애니메이션에&amp;nbsp;따라&amp;nbsp;움직임. &lt;br /&gt;언리얼&amp;nbsp;엔진은&amp;nbsp;캐릭터에&amp;nbsp;무기&amp;nbsp;등을&amp;nbsp;부착하기&amp;nbsp;위해&amp;nbsp;소켓&amp;nbsp;시스템을&amp;nbsp;제공함. &lt;br /&gt;&lt;br /&gt;액터에&amp;nbsp;고정으로&amp;nbsp;무기를&amp;nbsp;장착하지&amp;nbsp;않고&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;무기를&amp;nbsp;교체할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;하려면&amp;nbsp;무기를&amp;nbsp;액터로&amp;nbsp;분리해&amp;nbsp;만드는&amp;nbsp;것이&amp;nbsp;좋음. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;907&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qA9sx/btspCmdNFSp/RYKqksnGhgLnGDGwK3rXA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qA9sx/btspCmdNFSp/RYKqksnGhgLnGDGwK3rXA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qA9sx/btspCmdNFSp/RYKqksnGhgLnGDGwK3rXA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqA9sx%2FbtspCmdNFSp%2FRYKqksnGhgLnGDGwK3rXA1%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;907&quot; height=&quot;231&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Projectile은 기본 반응이 블록으로 되어 있음&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;915&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBYicg/btspokORzME/kIQ8hxjHK6153bk6kH8lh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBYicg/btspokORzME/kIQ8hxjHK6153bk6kH8lh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBYicg/btspokORzME/kIQ8hxjHK6153bk6kH8lh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBYicg%2FbtspokORzME%2FkIQ8hxjHK6153bk6kH8lh1%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;915&quot; height=&quot;340&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;340&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;336&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oR0YH/btspNPTieTV/CEyE31MXneqJIW0C3wjkE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oR0YH/btspNPTieTV/CEyE31MXneqJIW0C3wjkE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oR0YH/btspNPTieTV/CEyE31MXneqJIW0C3wjkE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoR0YH%2FbtspNPTieTV%2FCEyE31MXneqJIW0C3wjkE1%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;336&quot; height=&quot;617&quot; data-origin-width=&quot;336&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/37</guid>
      <comments>https://getup-up.tistory.com/37#entry37comment</comments>
      <pubDate>Tue, 1 Aug 2023 19:29:55 +0900</pubDate>
    </item>
    <item>
      <title>230725 DataTable을 출력하기</title>
      <link>https://getup-up.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://wergia.tistory.com/154#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://wergia.tistory.com/154#google_vignette&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690278419325&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[UE4] Programming - 데이터 테이블(Data Table)&quot; data-og-description=&quot;데이터 테이블(Data Table) 사용하기 작성 기준 버전 :: 4.21.1 게임을 제작할 때 레벨업에 필요한 경험치량이나 스킬의 계수 등 추후에 밸런스 수정 작업이 필요한 값들은 함부로 코드에 상수로 넣어&quot; data-og-host=&quot;wergia.tistory.com&quot; data-og-source-url=&quot;https://wergia.tistory.com/154#google_vignette&quot; data-og-url=&quot;https://wergia.tistory.com/154&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/r3CMl/hyTqqRvpXM/andi8R56fJHATCml2sO8Gk/img.png?width=741&amp;amp;height=372&amp;amp;face=0_0_741_372,https://scrap.kakaocdn.net/dn/cbxk0W/hyTqD4pmR9/K0yaq1DcTfoQswQxjAqzqK/img.png?width=741&amp;amp;height=372&amp;amp;face=0_0_741_372,https://scrap.kakaocdn.net/dn/Qc4Tc/hyTqrCUa4I/1zFaEVgHJ226OAzL2INJA1/img.png?width=826&amp;amp;height=518&amp;amp;face=0_0_826_518&quot;&gt;&lt;a href=&quot;https://wergia.tistory.com/154#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://wergia.tistory.com/154#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/r3CMl/hyTqqRvpXM/andi8R56fJHATCml2sO8Gk/img.png?width=741&amp;amp;height=372&amp;amp;face=0_0_741_372,https://scrap.kakaocdn.net/dn/cbxk0W/hyTqD4pmR9/K0yaq1DcTfoQswQxjAqzqK/img.png?width=741&amp;amp;height=372&amp;amp;face=0_0_741_372,https://scrap.kakaocdn.net/dn/Qc4Tc/hyTqrCUa4I/1zFaEVgHJ226OAzL2INJA1/img.png?width=826&amp;amp;height=518&amp;amp;face=0_0_826_518');&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;[UE4] Programming - 데이터 테이블(Data Table)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터 테이블(Data Table) 사용하기 작성 기준 버전 :: 4.21.1 게임을 제작할 때 레벨업에 필요한 경험치량이나 스킬의 계수 등 추후에 밸런스 수정 작업이 필요한 값들은 함부로 코드에 상수로 넣어&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;wergia.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://algorfati.tistory.com/69&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://algorfati.tistory.com/69&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1690278423876&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Unreal] 테이블 데이터 이용 방법 (DataTable)&quot; data-og-description=&quot;Data Table 대량의 데이터를 table 형태로 관리해야하는 상황도 생길 수 있다. 이런 경우 unreal engine의 data table을 사용하면 유용하다. 소스코드 #include &amp;quot;Engine/DataTable.h&amp;quot; USTRUCT() struct FPhysicsPoseData : public &quot; data-og-host=&quot;algorfati.tistory.com&quot; data-og-source-url=&quot;https://algorfati.tistory.com/69&quot; data-og-url=&quot;https://algorfati.tistory.com/69&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chubMh/hyTqrpnebj/HIxJXBElK9VwqF9hCwG3nk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/pEpgh/hyTqpLR9Ft/G1qi3K8RQYseqXCRZjaU50/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/y0lRP/hyTqoe5I5O/0uUwZLUEI20PnRpauBdQo1/img.jpg?width=750&amp;amp;height=422&amp;amp;face=0_0_750_422&quot;&gt;&lt;a href=&quot;https://algorfati.tistory.com/69&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://algorfati.tistory.com/69&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chubMh/hyTqrpnebj/HIxJXBElK9VwqF9hCwG3nk/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/pEpgh/hyTqpLR9Ft/G1qi3K8RQYseqXCRZjaU50/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/y0lRP/hyTqoe5I5O/0uUwZLUEI20PnRpauBdQo1/img.jpg?width=750&amp;amp;height=422&amp;amp;face=0_0_750_422');&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;[Unreal] 테이블 데이터 이용 방법 (DataTable)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Data Table 대량의 데이터를 table 형태로 관리해야하는 상황도 생길 수 있다. 이런 경우 unreal engine의 data table을 사용하면 유용하다. 소스코드 #include &quot;Engine/DataTable.h&quot; USTRUCT() struct FPhysicsPoseData : public&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;algorfati.tistory.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;
&lt;pre id=&quot;code_1690301223513&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UHamsterGameInstance::UHamsterGameInstance()
{
	FString DialogueDataPath = TEXT(&quot;/Game/FirstPerson/Data/HamsterDialogueSample2.HamsterDialogueSample2&quot;);
	static ConstructorHelpers::FObjectFinder&amp;lt;UDataTable&amp;gt; DT_HamDialogue(*DialogueDataPath);
	if (DT_HamDialogue.Succeeded())
	{
		UE_LOG(LogTemp, Log, TEXT(&quot;Dialogue TableData succeeded&quot;));
	}
	else
	{
		UE_LOG(LogTemp, Log, TEXT(&quot;Dialogue TableData not succeeded&quot;));
		return;
	}

	HamsterDialogueTable = DT_HamDialogue.Object;
	HamsterDialogueTable-&amp;gt;GetAllRows(&quot;&quot;, OUT DialogueArray);
}

FHamsterDialogueData* UHamsterGameInstance::GetDialogueData(int index)
{
	if (DialogueArray.Num() &amp;lt;= index)
	{
		return HamsterDialogueTable-&amp;gt;FindRow&amp;lt;FHamsterDialogueData&amp;gt;(FName(*(FString::FormatAsNumber(index))), TEXT(&quot;&quot;));
	}
	else
	{
		return DialogueArray[index];
	}
} //항목 하나씩 가져오는 함수


TArray&amp;lt;FHamsterDialogueData*&amp;gt; UHamsterGameInstance::GetAllDialogueData()
{
	return DialogueArray;

} //DialogueArray 전체를 가져오는 함수&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690301302622&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void ATalkableObject::BeginPlay()
{
	auto HamsterGameInstance = Cast&amp;lt;UHamsterGameInstance&amp;gt;(UGameplayStatics::GetGameInstance(GetWorld()));
	DialogDatas = HamsterGameInstance-&amp;gt;GetAllDialogueData();

    .
    .
    .
}

bool ATalkableObject::BeginInteract(UHamsterInteractorComponent* InteractorComponent)
{
	if (!TalkPopup-&amp;gt;IsVisible()) //뷰포트에 없으면 위젯 띄우기
	{
		TalkPopup-&amp;gt;AddToViewport();
	}

	if (CurrentDialogIndex &amp;gt;= DialogDatas.Num())
	{
		CurrentDialogIndex = 0;
		
		if (TalkPopup-&amp;gt;IsVisible())
		{
			UE_LOG(LogTemp, Log, TEXT(&quot;talkable end interact - close talkpopup&quot;));
			TalkPopup-&amp;gt;RemoveFromParent();
		}
	}
	else
	{
		TextName-&amp;gt;SetText(FText::FromString(DialogDatas[CurrentDialogIndex]-&amp;gt;Name));
		TextLine-&amp;gt;SetText(FText::FromString(DialogDatas[CurrentDialogIndex++]-&amp;gt;Line));
	}

	return true;
}&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임인스턴스는 레벨 내내 계속 살아있는데 토커블의 다이얼로그를 가지고 있으면 웃김&lt;br /&gt;나중에&amp;nbsp;빼야&amp;nbsp;할듯? &lt;br /&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;</description>
      <category>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/36</guid>
      <comments>https://getup-up.tistory.com/36#entry36comment</comments>
      <pubDate>Tue, 25 Jul 2023 18:47:09 +0900</pubDate>
    </item>
    <item>
      <title>230721</title>
      <link>https://getup-up.tistory.com/35</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mingyu0403.tistory.com/259#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mingyu0403.tistory.com/259#google_vignette&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689931538728&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Unreal C++] 데이터 테이블 만들고, 사용하기 (CSV 파일)&quot; data-og-description=&quot;참고 자료 '이득우의 언리얼 C++ 게임 개발의 정석' Chapter 11 &amp;amp; wergia.tistory.com/154 데이터 테이블을 사용하는 이유 게임 데이터를 파일로 따로 관리하면 체계적으로 관리할 수 있고, 더 편하게 사용&quot; data-og-host=&quot;mingyu0403.tistory.com&quot; data-og-source-url=&quot;https://mingyu0403.tistory.com/259#google_vignette&quot; data-og-url=&quot;https://mingyu0403.tistory.com/259&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/masz7/hyTo05dXzD/Cn2Yvm1zCoKONrUJ3AwGO1/img.png?width=800&amp;amp;height=798&amp;amp;face=0_0_800_798,https://scrap.kakaocdn.net/dn/wi7vI/hyTnJquTMh/0JxnKksQsELThR2KIIRnQK/img.png?width=800&amp;amp;height=798&amp;amp;face=0_0_800_798,https://scrap.kakaocdn.net/dn/2zz1o/hyTo8PIuYS/T55dG4lDhonKC6nw5Oiwp1/img.png?width=950&amp;amp;height=574&amp;amp;face=0_0_950_574&quot;&gt;&lt;a href=&quot;https://mingyu0403.tistory.com/259#google_vignette&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mingyu0403.tistory.com/259#google_vignette&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/masz7/hyTo05dXzD/Cn2Yvm1zCoKONrUJ3AwGO1/img.png?width=800&amp;amp;height=798&amp;amp;face=0_0_800_798,https://scrap.kakaocdn.net/dn/wi7vI/hyTnJquTMh/0JxnKksQsELThR2KIIRnQK/img.png?width=800&amp;amp;height=798&amp;amp;face=0_0_800_798,https://scrap.kakaocdn.net/dn/2zz1o/hyTo8PIuYS/T55dG4lDhonKC6nw5Oiwp1/img.png?width=950&amp;amp;height=574&amp;amp;face=0_0_950_574');&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;[Unreal C++] 데이터 테이블 만들고, 사용하기 (CSV 파일)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;참고 자료 '이득우의 언리얼 C++ 게임 개발의 정석' Chapter 11 &amp;amp; wergia.tistory.com/154 데이터 테이블을 사용하는 이유 게임 데이터를 파일로 따로 관리하면 체계적으로 관리할 수 있고, 더 편하게 사용&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mingyu0403.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zuJ2tjZW770&quot;&gt;https://www.youtube.com/watch?v=zuJ2tjZW770&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=zuJ2tjZW770&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bOKkny/hyTo98XD6E/Gh1O4B34D7AfZ9QeIj5LWk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/zuJ2tjZW770&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689937195356&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;HamsterGameInstance.h&quot;

UHamsterGameInstance::UHamsterGameInstance()
{
	FString DialogueDataPath = TEXT(&quot;/Game/FirstPerson/Data/HamsterDialogueSample.HamsterDialogueSample&quot;);
	static ConstructorHelpers::FObjectFinder&amp;lt;UDataTable&amp;gt; DT_HamDialogue(*DialogueDataPath);
	if (DT_HamDialogue.Succeeded())
	{
		UE_LOG(LogTemp, Log, TEXT(&quot;Dialogue TableData succeeded&quot;));
	}
	else
	{
		UE_LOG(LogTemp, Log, TEXT(&quot;Dialogue TableData not succeeded&quot;));
	}

	HamsterDialogueTable = DT_HamDialogue.Object; //이건 뭘까 아직 모르겠음



}

FHamsterDialogueData *UHamsterGameInstance::GetDialogueData(FString Name)
{
	return HamsterDialogueTable-&amp;gt;FindRow&amp;lt;FHamsterDialogueData&amp;gt;(FName(Name), FString(&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;GetDialogueData를 TalkableObject에서 가져다가 쓰면 될 것 같은데, 어떻게 써야할지 감이 안 온다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/35</guid>
      <comments>https://getup-up.tistory.com/35#entry35comment</comments>
      <pubDate>Fri, 21 Jul 2023 20:00:19 +0900</pubDate>
    </item>
    <item>
      <title>0718 대화 내용을 엑셀 데이터로 불러오기</title>
      <link>https://getup-up.tistory.com/34</link>
      <description>&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_1689689058325&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma once

#include &quot;ArenaBattle.h&quot;
#include &quot;Engine/DataTable.h&quot;
#include &quot;Engine/GameInstance.h&quot;
#include &quot;Engine/StreamableManager.h&quot;
#include &quot;ABGameInstance.generated.h&quot;

USTRUCT(BlueprintType)
struct FABCharacterData : public FTableRowBase
{
	GENERATED_BODY()

public:
	FABCharacterData() : Level(1), MaxHP(100.0f), Attack(10.0f), DropExp(10), NextExp(30) {}

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		int32 Level;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		float MaxHP;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		float Attack;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		int32 DropExp;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		int32 NextExp;
};&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;이와 동일하게, GameInstance를 상속받는 HamsterGameInstance를 만들고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 안에 DataTable 구조체를 만들기로 했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(GameInstance는 게임 시작부터 종료까지 유지되어 데이터를 관리하는 데 유용함)&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;a href=&quot;https://secretroute.tistory.com/entry/1409221002&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://secretroute.tistory.com/entry/1409221002&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://kyoun.tistory.com/183&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://kyoun.tistory.com/183&lt;/a&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1689691725304&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;USTRUCT(BlueprintType)
struct FHamsterGameData : public FTableRowBase
{
	GENERATED_BODY()

public:
	FHamsterGameData() : Name(&quot;StartName&quot;), Line(&quot;StartLine&quot;), CanTalkMore(true) {}

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		FString Name;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		FString Line;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = &quot;Data&quot;)
		bool CanTalkMore;

};&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;엑셀 파일을 csv로 변환해서 임포트 해주면 된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bljqMJ/btsn26KFwt3/w0F1pJVFkzJLviRdxZyKK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bljqMJ/btsn26KFwt3/w0F1pJVFkzJLviRdxZyKK1/img.png&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;156&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;48.28&quot; style=&quot;width: 47.7189%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bljqMJ/btsn26KFwt3/w0F1pJVFkzJLviRdxZyKK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbljqMJ%2Fbtsn26KFwt3%2Fw0F1pJVFkzJLviRdxZyKK1%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;332&quot; height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kyb93/btsn7xVfG2H/jTaOJGsB4JDKAR4gTkrL51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kyb93/btsn7xVfG2H/jTaOJGsB4JDKAR4gTkrL51/img.png&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;218&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.1183%;&quot; data-widthpercent=&quot;51.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kyb93/btsn7xVfG2H/jTaOJGsB4JDKAR4gTkrL51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkyb93%2Fbtsn7xVfG2H%2FjTaOJGsB4JDKAR4gTkrL51%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;497&quot; height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CanTalkMore를 bool 로 선언해도 엑셀 내에서는 텍스트라서 제대로 인식될지 잠깐 걱정했는데, 다행히 제대로 인식된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[햄] 작업일기</category>
      <author>리리쟝</author>
      <guid isPermaLink="true">https://getup-up.tistory.com/34</guid>
      <comments>https://getup-up.tistory.com/34#entry34comment</comments>
      <pubDate>Tue, 18 Jul 2023 23:51:27 +0900</pubDate>
    </item>
  </channel>
</rss>