midas+son의 크리에이티브(creative) 이야기

20170420_편도

개인사/밥2017. 4. 20. 12:37

[닭다리완전크닭 도시락]

4500원짜리
GS25에서파는 도시락
4월 27일까지
1400원하는 코카콜라 증정

숟가락, 비닐장갑 포함

양도 많고 맛괜찮다.
굿굿
태어나서 먹어본 편도 중
세 손가락 안에 드는 도시락

'개인사 > ' 카테고리의 다른 글

20170505_족발  (0) 2017.05.06
20170420_마라샹궈  (0) 2017.04.21
20170417_편도  (0) 2017.04.17
20170414_라멘  (0) 2017.04.16
20170410_이태리까스  (0) 2017.04.10

UGameViewportClient* Viewport = GetWorld()->GetGameViewport();

FVector2D pos = Viewport->GetWindow()->GetPositionInScreen();    //시작점. 전체 화면일 경우 -8, -8로 나왔다.(Win10)

FVector2D WH = Viewport->GetWindow()->GetViewportSize();    //실행창 크기. 위에 타이틀 바가 있다면 그 크기도 포함


ffmpeg라는 동영상 프로그램을 사용하기 위해 위의 값들이 필요했다.

원하는 위치부터 원하는 사이즈 만큼 

인자 값들을 넣기 위해 아래처럼 스트링을 만들어 영상 캡쳐가 성공했다.

int X = 0;    //ffmpeg에 들어갈 인자 값들이 int가 아니면 작동 안한다.

int Y = 0;

int Width = 0;

int Height = 0;


//가로축 컨트롤 + width

if (pos.X < 0)    //인자값 중 -offset_x 값이 -(음수)여도 동작 안한다.

{

X = 0;

Width = WH.X + pos.X * 2;    //더해진 만큼 좌우 값을 빼준다.  pos.X가 -이므로 

}

else

{

X = pos.X;

Width = WH.X;

}

//세로축 컨트롤 + Height

if (pos.Y < 0)    //인자값 중 -offset_y 값이 -(음수)여도 동작 안한다.

{

Y = 0; 

Height = WH.Y + pos.Y * 2;    //더해진 만큼 좌우 값을 빼준다.  pos.Y가 -이므로 

}

else

{

Y = pos.Y; 

Height = WH.Y;

}


//아래 코드는 ffmpeg를 실행하기 위한 코드

FString FilePath = FPaths::ConvertRelativePathToFull(FPaths::Combine(*FPaths::GameDir(), TEXT("Plugins/ThirdParty/ffmpeg/"), TEXT("ffmpeg.exe")));

FString Args = FString::Printf(TEXT("-f gdigrab -offset_x %d -offset_y %d -video_size %dx%d -i desktop -r 24000/1001 -q 1 -vf crop %s"), X, Y, Width, Height, *Filename);    //Filename은 인자로 받아온 저장될 파일 이름, 해상도는 -video_size 1024x768 이런 식으로 들어가야 함.

FString Cmd = FString::Printf(TEXT("%s %s %s"), *FilePath, *Args, *Filename);


TRACE("%s", *Cmd);

if (FPaths::FileExists(FilePath))

{

RecordHandle = FPlatformProcess::CreateProc(*FilePath, *Args, false, true, false, nullptr, 0, nullptr, nullptr);

}



//PlayerInput 제거 - Controller = GetWorld()->GetFirstPlayerController();

UPlayerInput* PlayerInput = Controller->PlayerInput;

PlayerInput->AxisMappings.Empty();    //컨트롤러 인풋에 있는 Axis맵핑 비우기

PlayerInput->ActionMappings.Empty();    //콘트롤러 인풋에 있는 Action맵핑 비우기

// InputComponent 제거 - InputComponent = Character->GetInputComponent();

InputComponent->ClearBindingValues();    //소유한 AxisValue 초기화

InputComponent->ClearActionBindings();    //바인딩된 Action값 비우기

InputComponent->AxisBindings.Empty();    //바인딩된 Axis값 TArray 비우기


키맵핑을 하던 컨트롤러를 다른 곳으로 Pawn으로 옮겨 재사용하기 위해서는

그 플레이어 컨트롤에 들어있는 Input값을 초기화 해주어야 깔끔하다.

이동하기 전에 가지고 있던 InputComponent까지 지울 필요는 없었겠지만

깔끔하게 해보자고 해서 알아봤다.


혹시 키맵핑(바인딩) 설정 방법을 못보고 왔다면 아래 링크에 들어가 보자.

http://midason.tistory.com/418

오랜만에 유니티 글이네요.


오브젝트 비교하는 구문을 예로 들자면

if (player.gameobject == other.gameobject)
{

//코드...

}

위와 같이 == 로 비교 하는게 편했고 잘 사용해 왔다.


근데 이 간편한 구문보다 약 2배 빠른 비교 방법이 있다는걸 이제 알았다.

원래는 C#의 문법인데 아래 MSDN 참조해보자.

https://msdn.microsoft.com/ko-kr/library/system.object.referenceequals(v=vs.110).aspx


//이건 C# - if(Object.ReferenceEquals(player.gameobject, other.gameobject))

//유니티에선 아래

if(System.Object.ReferenceEquals(player.gameobject, other.gameobject))

{

//코드...

}

주의 할 점은 Reference에 대한 비교이다 보니 

값이 같아도 Reference위치가 다르거나 Value Type이면 False가 떨어진다는 점이다.

null 비교에도 좋다.//System.Object.ReferenceEquals(gameobject, null)

/*

UPlayerInput::AddEngineDefinedAxisMapping은 더이상 바꿀 수 없는 단일 엔진 키맵핑 설정이다. 

캐릭터 하나나 컨트롤 값을 단일로만 사용할 경우 사용한다.

*/

//UPlayerInput::AddEngineDefinedAxisMapping(FInputAxisKeyMapping("NpcMoveForward", EKeys::W, 1.f));

//UPlayerInput::AddEngineDefinedAxisMapping(FInputAxisKeyMapping("NpcMoveForward", EKeys::S, -1.f));

//UPlayerInput::AddEngineDefinedAxisMapping(FInputAxisKeyMapping("NpcMoveRight", EKeys::D, 1.f));

//UPlayerInput::AddEngineDefinedAxisMapping(FInputAxisKeyMapping("NpcMoveRight", EKeys::A, -1.f));

//UPlayerInput::AddEngineDefinedAxisMapping(FInputAxisKeyMapping("NpcLookUp", EKeys::E, 1.f));

//UPlayerInput::AddEngineDefinedAxisMapping(FInputAxisKeyMapping("NpcLookUp", EKeys::Q, -1.f));

//UPlayerInput::AddEngineDefinedActionMapping(FInputActionKeyMapping("NpcRightMouse", EKeys::Zero));

//UPlayerInput::AddEngineDefinedActionMapping(FInputActionKeyMapping("NpcDelete", EKeys::Delete));


/*

컨트롤러에 있는 PlayerInput에 있는 키맵핑수정 가능한 설정이다.

캐릭마다 여러 컨트롤 값을 사용할 경우 유용하다.

*/

UPlayerInput* PlayerInput = GetWorld()->GetFirstPlayerController()->PlayerInput;

PlayerInput->AddAxisMapping(FInputAxisKeyMapping("NpcMoveForward", EKeys::W, 1.f));

PlayerInput->AddAxisMapping(FInputAxisKeyMapping("NpcMoveForward", EKeys::S, -1.f));

PlayerInput->AddAxisMapping(FInputAxisKeyMapping("NpcMoveRight", EKeys::D, 1.f));

PlayerInput->AddAxisMapping(FInputAxisKeyMapping("NpcMoveRight", EKeys::A, -1.f));

PlayerInput->AddAxisMapping(FInputAxisKeyMapping("NpcLookUp", EKeys::E, 1.f));

PlayerInput->AddAxisMapping(FInputAxisKeyMapping("NpcLookUp", EKeys::Q, -1.f));

PlayerInput->AddActionMapping(FInputActionKeyMapping("NpcUnpossess", EKeys::Zero));

PlayerInput->AddActionMapping(FInputActionKeyMapping("NpcDelete", EKeys::Delete));


//인풋컴포넌트에 함수 바인딩

InputComponent->BindAxis("NpcMoveForward", this, &ANpcCharacter::MoveForward);

InputComponent->BindAxis("NpcMoveRight", this, &ANpcCharacter::MoveRight);

InputComponent->BindAxis("NpcLookUp", this, &APawn::AddControllerPitchInput);

InputComponent->BindAction("NpcUnpossess", IE_Pressed, this, &ANpcCharacter::NpcUnpossess);

InputComponent->BindAction("NpcDelete", IE_Pressed, this, &ANpcCharacter::NpcDelete);

프로젝트 설정에서 하나하나 지정하는 것 말고 

C++에서 처리 하는 방식을 찾아 정리하였다.


키맵핑을 삭제 하는 방법은 다음 글로 포스팅 하겠다.

http://midason.tistory.com/420

GetWorld()->GetFirstPlayerController()->Possess(this); //현재 pawn으로 빙의. this는 pawn을 상속받은 클래스

Possess는 소유하다, 지니다는 뜻으로 Controller를 지니게되는 Pawn을 정해준다.

APawn*을 인자로 받는다.(APawn을 상속받은 하위 클래스 포함)

인자로 들어온 pawn으로 Controller와 카메라 시점을 이동할 수 있다.


이것에 대해 아래와 같은 연관되게 되는 함수가 있다.

//현재 Pawn에 대해

//SetupPlayerInputComponent(GetWorld()->GetFirstPlayerController()->InputComponent); //키맵핑 하는 함수

//Possess()함수를 실행하면서 SetupPlayerInputComponent 함수도 같이 실행됨. 그래서 따로 함수 호출을 안해도 된다.


//과거 Pawn에 대해

//GetWorld()->GetFirstPlayerController()->UnPossess();

//이전의 pawn에 있던 Controller가  nullptr이 된다.

위의 함수들은 Possess할 때 자동으로 불리우며

과거와의 연을 끊고 새로운 연을 잇는다고 생각하면 편하다.


정리

Possess()함수를 호출하면 

이전에 Controller가 빙의해있던 pawn은 UnPossess()가 실행 되면서 Controller가 nullptr이 된다.

현재 이동할 pawn이 Controller를 가지게 되고

자동으로 SetupPlayerInputComponent(UInputComponent*)함수를 호출한다.


SetupPlayerInputComponent()함수에서 키맵핑 하는 법은 다음 글에 이어서 하겠다.

20170417_편도

개인사/밥2017. 4. 17. 13:08

[고등어도시락]

비가 추적추적 내리는 홍대의 점심
오늘은 GS25 편도

새로나온듯이
New 라고 적혀있는
고등어 편도를 집음.
가격은 4천원

단점1. 도시락통이 은근히길어서
전자렌지 안에서
안돌아가고 걸림
단점2. 고등어 비린걸
짠맛으로 덮으려는듯한 맛

장점1. 영양많은 고등어가 있다. 끝

'개인사 > ' 카테고리의 다른 글

20170420_마라샹궈  (0) 2017.04.21
20170420_편도  (0) 2017.04.20
20170414_라멘  (0) 2017.04.16
20170410_이태리까스  (0) 2017.04.10
20170408_돼지고기  (0) 2017.04.08

20170414_라멘

개인사/밥2017. 4. 16. 23:56

[라멘]

신촌에 있는
돈코츠라멘 전문점
부탄츄

간장첨가냐 소금첨가냐
국물고르고
면고르고
기본 첨가물(마늘,숙주,파) 양 고르고
토핑 추가하는 방식

토핑은 많을수록 맛있다.
(!!)

가격대는 7000원부터로
일본식 라멘집 치고
가격은 착한편

맛도 진하고 여친도 좋아함

세트로 시킨
교자는 육즙이 좀 시큼한 편
호불호 있을듯

면과 국물만으로는 으뜸 라멘집

웨이팅이 꽤 있지만
바깥에 앉아서
기다리는 자리가 잘되어있음

'개인사 > ' 카테고리의 다른 글

20170420_편도  (0) 2017.04.20
20170417_편도  (0) 2017.04.17
20170410_이태리까스  (0) 2017.04.10
20170408_돼지고기  (0) 2017.04.08
20170407_치맥  (0) 2017.04.07

어느 액터(그외 하위 클래스)가 가지고 있는 Component를

검색하기 위해 아래와 같은 코드를 많이 사용한다.

UMyComponent* MyComp = MyActor->FindComponentByClass<UMyComponent>();

하지만 당연히 될 줄 알았던게 안됐을 때의 통수란...많은 시간 낭비를 하게 만든다.(하루를 날렸다.)


다른 컴포넌트에서 Owner가 되는 액터의 내부 컴포넌트를 찾기 위해 사용했었는데

설마 여기서 nullptr이 나올 줄은 몰랐다.


FindComponentByClass에 대해서 찾아보니 설명에 떡하니 이렇게 나와있었다.

Searches components array and returns first encountered component of the specified class.

first encountered...처음 발견된 것만...가져온다...

그래서 상속을 계속 받다보니 할아버지, 증조 할아버지격 부모 클래스에서 

통일한 Component의 이름을 가진게 있었고

그 컴포넌트에는 비어있었기에 문제가 생겼었던 것이다.


이 문제를 해결하기 위해 find보다는 특정 변수에 값을 담아

Get함수로 가져오게 하였다.


엔진에서 제공해주는 함수라도 다시 알아보고 사용하자.

확실히 어떤 기능인지 알아보지 않고 사용하면 

실수하는 건 자신이라는 걸 생각하자.



packtpub 이라고 IT관련 외국 서적, 강의 판매 사이트가 있다.

구매하면 IT 서적 판매로 ebook이나, pdf로 다운 받을 수 있고

여러분야의 강좌들도 판매한다.(달러$ 결제)


이 사이트에서

4월 11일 부터 4월 30일 까지 하루에 한권씩 책을 무료 나눔한다.

https://www.packtpub.com/packt/offers/free-learning

가입은 이메일로 간편하게 할 수 있다.


오늘까지 3가지 책을 받아보니 

연차는 좀 있는 책들 위주인 것 같다.


원하는 언어나 프로그램에 대한 책이 나올 때가지 기다려보는 것도 괜찮고,

지금은 필요없더라도 하루에 하나씩 받아 가는 것도 나쁘지 않다고 생각한다.


이 사이트에서는 이번달 뿐만이 아니라 이런 이벤트를 종종한다는 것 같다.