블루프린트 입문1일차 입니다 형변환 질문합니다!


안녕하세요!! 언리얼엔진 막 깔아서 튜토리얼 보고 조작법을 익히고 따라하는데 한가지 궁금한점이 생겼어요!!!


블루프린트 클래스를 만들어서 이벤트를 작성하는 곳에서


cast to MyCharacter 라는걸 사용하던데 이런게 무얼 하는건지 궁금합니다.


형변환을 한다고 하던데 제가 c++공부하면서 배운건 타입이 다를때 형변환을 해줘야 한다라고만 알고있는데,


이것만 가지고는 잘 와닿지가 않아 질문합니다.!! c++의 그 형변환과는 조금 다른건가요?


1. 먼저 형변환을 한다는것이 무엇이고 하는 이유가 무엇인가요??? 


2. cast to MyCharater를 하면 부모클래스가 자식클래스에 맞게 형변환이 되는건가요???


1. 형변환을 해주는 액터클래스와 어떤식으로든 상호작용을 하기위함입니다.

Character 클래스를 MyCharacter라는 자식클래스로 형변환이 필요한 경우를 예를 들어보자면,

Character 클래스에는 없지만 MyCharacter 클래스에 있는 변수/함수 등 에 접근하고자 할 때 필요해지죠.

Character 클래스에 접근하고자 하는 변수/함수 등이 이미 존재하고, My Character가 그 자손 클래스라면 굳이 MyCharacter까지 형변환을 할 필요는 없습니다. 하지만 예를들어 근접공격을 한다고 가정 했을때, Character 클래스에서 파생된 자손 클래스 Friendly와 Enemy가 있다 치고, 근접공격 콜리전에 두개의 액터가 동시에 닿았다고 한다면 오버랩핑중인 Character 클래스에 형변환을 하여 데미지를 입힌다면 두캐릭터 모두에 데미지가 입혀지고, 오버랩핑된 Character 클래스중에 Enemy에 형변환을 해주면 Enemy 클래스에만 데미지가 들어가는 거죠.


2번 질문의 경우 조금 더 설명을 덧붙이자면,

형변환이 필요할 경우는 보통 어떤 액터의 정보를 어떤식으로든 가져오게 될 때 인데요.

그 가져와진 액터의 클래스가 형변환 하고자 하는 액터의 부모 혹은 같은 클래스 이면 형변환이 가능하죠.

하지만 형변환 하고자하는 클래스와 다른 액터, 예컨데 스위치액터와 캐릭터액터가 있다고 치면

스위치 액터에서 캐릭터 액터로 형변환을 시도(그럴일이 애초에 없겠지만)하면 그 형변환은 실패하게되고, 엔진 내에서도 친절하게 형변환이 실패한다고 알려주니 형변환 실패에 대한 걱정은 굳이 하실 필요가 없습니다.




[출처] 블루프린트 입문1일차 입니다 형변환 질문합니다! (언리얼 엔진 공식 카페 (Unreal Engine)) |작성자 파랑곰도리


문제: 숫자를 입력받아 그 숫자가 소수인지 아닌지 확인하고 소수라면

"소수입니다"를 출력하시오.

아니면 "소수가 아닙니다."를 출력하시오.


소수: 1과 그 자신으로 밖에 나눌 수 없는 정수. 1,2,3,13 등



/* 내가 푼 오답



#include <iostream> 

using namespace std;


int main()

{

int num = 0;


while (!num)

{

cout << "숫자를 입력하세요: ";

cin >> num;


if (num % num == 0 and num % num == 1)

{


cout << "소수 입니다. ";

break;

}

else

{

cout << "소수가 아닙니다.";

}

}

}



*/








정답


#include<iostream>


using namespace std;


int main()

{

int n, i;

bool isPrime = true;


cout << "정수를 입력하세요: ";

cin >> n;



for (i = 2; i <= n / 2; ++i)

{

if (n % i == 0)

{

isPrime = false;

break;

}

}

if (isPrime)

cout << "소수입니다. ";

else

cout << "소수가 아닙니다";


}








/*

숫자 맞추기 게임

1부터 100까지의 랜덤한 숫자를 맞춘다. 

사용자가 입력한 숫자가 랜덤한 숫자보다 크면 크다고 출력

작으면 작다고 출력. 

맞췄으면 맞췄다고 한 뒤 종료.

못 맞추면 계속해서 다시 숫자를 받아야 한다. 


숫자맞추기 게임은 함수로 만들어서 main에서 호출 

*/



































void RanNumGame()

{

srand(time(NULL));

int RanNum = rand() % 100 + 1;

cout << RanNum << endl; // 랜덤 숫자 확인용. 실제론 주석처리해야 함. 


int InputNum;



while (true)

{

cout << "숫자를 입력하세요: ";

cin >> InputNum;

if (RanNum == InputNum)

{

cout << "정답을 맞췄습니다. ";

break;

}

else if (RanNum > InputNum)

{

cout << "입력한 수보다 랜덤숫자가 큽니다.";

}

else

{

cout << "입력한 수보다 랜덤숫자가 작습니다.";

}

}

}


int main()

{

RanNumGame();



}










-1부터 100까지의 숫자를 출력한다. 

-3과 6과 9가 들어가면 문자로 '짝'을 출력하고

-이외 숫자는 그냥 숫자만 출력한다. 





















힌트: int를 문자형으로




















#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

using namespace std;


int main()

{

for (int i = 1; i < 100; i++)

{

char buf[4];

// 

strcpy(buf, to_string(i).c_str() );

// cout << buf[0] << endl;


if (buf[0] == '3' || buf[0] == '6' || buf[0] == '9'|| 

buf[1] == '3' || buf[1] == '6' || buf[1] == '9'

)

{

cout << "짝 " ;

}

else

{

cout << i << " ";

}

}

}
















/*

C++ STL의 vector에 회원의 이름을 5개 저장하고 입력된 순서대로 다시 화면에 표시해보세요. 

C++ STL의 queue에 1부터 5까지 입력하고 입력된 순서대로 다시 화면에 표시해보세요. 


*/



#include <iostream>

#include <string>

#include <vector>

#include <queue>

using namespace std;



int main()

{

vector<string> vecName;


vecName.push_back("이재명");

vecName.push_back("홍준표");

vecName.push_back("유시민");

vecName.push_back("김부선");

vecName.push_back("김성태");


cout << "** 벡터의 원소 ** " << endl;

vector<string>::iterator pos = vecName.begin();

for (; pos != vecName.end(); pos++)

{

cout << (*pos) << ' ';

}


queue<int>q;

q.push(1);

q.push(2);

q.push(3);

q.push(4);

q.push(5);


cout << "\n\n" << "** 큐의 원소 ** " << endl;

while (!q.empty()) {

int tmp = q.front();

cout << tmp << " ";


q.pop();

}


}




@main.cpp


#include<QApplication>

#include <QPushButton>

#include<QSpinBox>

#include<QSlider>

#include<QHBoxLayout>


int main(int argc, char* argv[])

{

  QApplication a(argc, argv);

  // 윈도우로 동작할 QWidget을 만든다

  QWidget * window = new QWidget;

  QSpinBox* spinBox = new QSpinBox;

  // slider를 가로(Horizontal)로

  QSlider* slider = new QSlider(Qt::Horizontal);


  // spinBox의 최소값과 최대값을 지정한다

  spinBox -> setRange(0, 200);


  // slider에도 마찬가지로 지정해준다

  slider -> setRange(0, 200);


  // 이제 레이아웃을 정해줘야 한다.

  // 위에서 만든 spinBox와 slider를 윈도우위젯(QWidget * window =)에 올리는 작업

  // layout을 만들자

  QHBoxLayout* layout = new QHBoxLayout;

  // addWidget 하자.

  layout -> addWidget(spinBox);

  layout -> addWidget(slider);


  // 방금 만든 2개의 레이아웃을 올리자

  window -> setLayout(layout);

  window->show();

  return a.exec();


}



이런 식으로 나온다. 아직 연결이 안됐다. 연결해줘야 한다. 




@연결된 버전 
@main.cpp


#include<QApplication>
#include<QSpinBox>
#include<QSlider>
#include<QHBoxLayout>

int main(int argc, char* argv[])
{
  QApplication a(argc, argv);
  // 윈도우로 동작할 QWidget을 만든다
  QWidget * window = new QWidget;
  QSpinBox* spinBox = new QSpinBox;
  // slider를 가로(Horizontal)로
  QSlider* slider = new QSlider(Qt::Horizontal);

  // spinBox의 최소값과 최대값을 지정한다
  spinBox -> setRange(0, 200);

  // slider에도 마찬가지로 지정해준다
  slider -> setRange(0, 200);

  // spinbox가 valueChanged하면 받는 곳(slider)을 그만큼 setValue 하시오.
  QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)) );

  // 위의 것 반대로
  QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)) );



  // 이제 레이아웃을 정해줘야 한다.
  // 위에서 만든 spinBox와 slider를 윈도우위젯(QWidget * window =)에 올리는 작업
  // layout을 만들자
  QHBoxLayout* layout = new QHBoxLayout;
  // addWidget 하자.
  layout -> addWidget(spinBox);
  layout -> addWidget(slider);

  // 방금 만든 2개의 레이아웃을 올리자
  window -> setLayout(layout);
  window->show();

  return a.exec();

}



이제 스핀박스를 움직이거나 슬라이더를 움직이면 같이 연동된다. 



@ main.cpp



#include<QApplication>

#include <QPushButton>


int main(int argc, char* argv[])

{

  QApplication app(argc, argv);

  QPushButton button("Close");

// connect라는 함수는 클릭을 하면 프로그램이 종료되는 것을 연결하도록 되어 있다. 

// 그냥 공식

  QObject::connect(&button, SIGNAL(clicked(bool)) , &app , SLOT(quit()));

  button.show();

  return app.exec();

}



================================================================================

QObject::connect(        )

sender 어떤 어느 곳에서 &button 에서

SIGNAL 어떤 시그널이 발생했다면  clicked란 시그널이 발생했다면 

receiver 받는 곳이 있어서 &app QApplication의 주소

SLOT 어떤 일을 하라  quit란 일을 하라. 









@최근 학원에서 하고 있는 QT 프로그래밍을 전혀 못 따라가겠다. 


기본적인 클래스 문법을 다루는 것이 익숙지 않다 

수학적 기초 지식이 부족하다

수학적 기초 지식이 어떻게 코딩에 연결되는 지 잘 모른다 

이렇게 모르는 것들이 있을 때 어느 부분을 구조적으로 파야 하는 지 잘 모른다 


@현재 하고 있는 것들

기존 코드들을 한줄 한줄 해석해보고 있다. 하지만 코드 짤 때 그것이 어떤 의미인 지 제대로 듣지 않는 이상 그 코드를 해석하는 것도 쉬운 일이 아니다. 

간단한 수식들도 다 수학-물리 법칙에 따라 구성돼 있기 때문이다. 


@하고자 하는 행동

C++ 지식을 보강하고 수학 지식들을 조금씩 정리해 나간다

모르는 것들은 한줄 한줄의 의미가 이해될 때까지 파보자. 











새프로젝트 실행(win32가 없어서 다른 방법 씀)

프로젝트 속성페이지에서 위와 같은 입력 각각 해줌. 


+ Recent posts