UKismetSystemLibrary::LineTraceMulti()GetWorld()->AsyncLineTraceByChannel()UDamageTypearr1, arr2가 주어진다.#include <string>
#include <vector>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
for(int i = 0 ; i < static_cast<int>(arr1.size()) ; i++)
{
answer.push_back(vector<int>());
for (int j = 0 ; j < static_cast<int>(arr1[i].size()) ; j++)
{
answer[i].push_back(arr1[i][j]+arr2[i][j]);
}
}
return answer;
}
answer를 따로 만들지 않고 arr1을 정답 배열처럼 재활용하면 코드가 더 짧아질 수 있다.answer.push_back(vector<int>())는 answer.push_back({}) 또는 answer.emplace_back()으로 더 간단하게vector<int> sumColumn;
//두번째 for문
answer.push_back(sumColumn);
sumColumn.clear();
vector<int>는 자료형이고, vector<int>()는 실제 빈 벡터 객체.class AGameManager : publie AActor
void LoadData
void SaveData
void StartNewGame
void SpawnEnemies...
DataManager 와 GameplayManager 로 분리

DamageCalculator(ACharacter* Target)Target->CalculateTakeDamage()
Project Setting - Collision - Object Channel / 프리셋

프리셋 새로 생성할 때 CollisionEnabled 의 경우, 물리엔진 안 쓸거면 무조건 꺼 두는 게 맞다 (부하 문제). Query Only
ObjectType(위에): 이 프리셋 적용할 오브젝트 채널
아래는 상호작용 방식
액터들 Details-Collision에서 이 프리셋 집어넣으면 된다.
Cube 같은 스태틱 메쉬들은 콜리전 프리셋이 Default
Simple Collision - Complex Collision. 보통 이 두 가지 Collision 채널? 모양? 을 가지고 있다.
스태틱 메쉬 - Details - Collisino - Simple & Complex : 평소엔 Simple. 특정 Query에 대해서 Complex 복합 사용 가능.

여기서 bool bTraceComplex
...:: 으로 쓰는 것.void StartTrace 함수 만들고cpp에 #include "Kismet/KismetSystemLibrary.h"UKismetSystemLibrary::LineTraceMulti(
const UObject* WorldContextObject, //GetWorld()
const FVector Start, //시작지점
const FVector End, //끝지점-GetActorForwardVector()로 계산
ETraceTypeQuery TraceChannel,
bool bTraceComplex, //위에 말한 Simple&Complex
const TArray<AActor*>& ActorsToIgnore,
EDrawDebugTrace::Type DrawDebugType, //::ForOneFrame 넣으면 됨
TArray<FHitResult>& OutHits, 미리 TArray선언해두기
bool bIgnoreSelf,
FLinearColor TraceColor,
FLinearColor TraceHitColor,
float DrawTime)
ETraceTypeQuery: 트레이스 채널 타입UEngineTypes::ConvertToTraceType(ECC_Visibility) 로Visibility, Camera도 원래는 Collision ChannelTArray<AActor*> 미리 선언해 두 고 .Add(this); 해두기.bool bIgnoreSelf : 이거 하나만 한다고 완벽한 건 아니라 (추가 Component 등 문제 일으킬 수 있음)ActorsToIgnore 이랑 bIgnoreSelf 둘 다 자기 넣기UKismetSystemLibrary::LineTraceSingleHitResult 만 TArray 가 아닌 그냥 FHitResult로void ATraceTest::StartASyncTrace()
{
FTraceDelegate TraceDelegate;
TraceDelegate.BindUObject(this, &ATraceTest::OnAsyncTraceCompleted);
FCollisionResponseParams ResponseParams;
ResponseParams.CollisionResponse.WorldDynamic = ECR_Block;
FCollisionQueryParams QueryParams;
QueryParams.AddIgnoredActor(this);
QueryParams.bTraceComplex = false;
GetWorld()->AsyncLineTraceByChannel(
EAsyncTraceType::Multi,
GetActorLocation(),
GetActorForwardVector() * 1000.f + GetActorLocation(),
ECC_Visibility,
QueryParams,
ResponseParams,
&TraceDelegate
);
}
FTraceDelegate 델리게이트가 this 오브젝트 기반으로 트레이스를 실행하고OnASyncTraceCompleted 함수를 Trace로 무언갈 찾았을 때 실행한다.FCollisionResponseParams, FCollisinoQueryParams 로 콜리전 설정 관리.CollisionResponse.WorldDynamic : 맵에 액터별로 콜리전 설정에서 WorldDynamic 설정을 할 수 있는데, 이 설정을 한 대상에 대해서만 다른 방식의 콜리전 방식을 설정할 수 있다.UKismetSystemLibrary::LineTraceMulti 대신 GetWorld()->AsyncLineTraceByChannel 호출로 트레이스 만듦. 두 방법은 결과값은 비슷하다.Kismet은 개발용, C++ 코드가 사아아알짝 더 가벼움. 근데 귀찮음.#include "Kismet/GameplayStatics.h" 필요.
UPROPERTY 들 밖에 없다. 분기점 같은 느낌이라고 보면 됨.DamageType 클래스 만들고, 생성자 만들고, 거기에 부모클래스 UPROPERTY 들 가져와서 초기값 세팅해 주면 됨.float DamageImpulse : 물리적 충격량bool bScaleMomentumByMass : 무거워질수록 더 쎄게bool bCausedByWorld : 데미지 근원지가 World 그 자체.UPROPERTY(EditAnywhere, BlueprintReadOnly)
float BurnDuration;
float AMasterProject02Character::TakeDamage(
float DamageAmount,
FDamageEvent const& DamageEvent,
AController* EventInstigator,
AActor* DamageCauser
)
{
float InitialDamage = Super::TakeDamage(DamageAmount, DamageEvent, EventInstigator, DamageCauser);
const UDamageType* DT = DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>();
if (DT && DT->bCausedByWorld) // DT가 있는지 확인은 항상 해줘야 한다. 포인터 쓸 때 특히
{
//낙사, 트랩, 은신공격 등등... 효과들을 여기에 넣는다
UE_LOG(LogTemp, Warning, TEXT("Damage Received ByWorld"));
}
if (DT && EventInstigator)
{
UE_LOG(LogTemp, Warning, TEXT("Damage Received ByEnemy!"));
}
return InitialDamage;
}
Super::에서 할 수 있다.InitialDamage *= (1.f + FireDamage->ArmorPenetration); 이런 식으로 가져올 수 있다.