2024/02 10

C++ 개인 필기(14) 변환

타입 변환 유형(비트열 재구성 여부) 1. 값 타입 변환 (의미를 유지하기 위해, 원본 객체와 다른 비트열 재구성) int a=123456789 //2의 보수 float b= (float)a //부동소수점 ->1.234567e ... -> 메모리에 다른 값 구성 (비트열 재구성) 2. 참조 타입 변환 (비트열을 재구성 하지 않고 관점만 바꾸는것) int a= 123456789 ->메모리의 데이터는 같지만 (관점만 바뀌어) float b= (float)a ->엉뚱한 값 구성 ->참조 타입 변환은 포인터 타입 변환과 동일한 룰을 같는다. 안전도 분류 (1) 안전한 변환 특징) 의미가 항상 100프로 완전히 일치하는 경우 같은 타입이면서 크지만 더 큰 가방으로 이동 작은 가방 -> 큰 가방 good (업캐스팅..

c++ 2024.02.26

언리얼엔진5 C++로 정복하기(8) 객체들에게 왜 대부분 포인터가 붙을까?

언리얼엔진5 에서 c++로 코딩하다보면 헤더파일부분에서 객체를 선언할때 대부분 포인터가 붙는걸 알 수 있는데 왜 그럴까..? 언리얼 객체 관리 시스템과 관련이 있는데, UGameplayStatics나 USoundBase, UCameraComponent 와 같은 것들은 언리얼 엔진의 엑터나 엑터 컴포넌트와 같은 게임 오브젝트들로 이들은 동적으로 생성되고 관리된다.. 게임 오브젝트들은 실행 시간동안 생성되고 파괴될 수 있는데, 포인터를 사용하여 이러한 객체에 대한 참조를 유연하게 할당하고 해제할 수 가 있다. 그리고 성능 최적화 부분에서 객체는 크기가 크고 복잡한데 객체 자체를 값으로 전달하는 것보다 포인터를 전달하는것이 훨씬더 효율적인데, 포인터를 사용하면 객체의 실제 데이터를 복사할 필요 없이 객체에 접..

언리얼 엔진 5 2024.02.20

언리얼엔진5 C++로 정복하기(7) 델리게이트, 인라인

언리얼 엔진에서 델리게이트는 특정 이벤트나 상황이 발생했을때 호출될 함수들의 리스트를 관리한다. 델리게이트는 발생하는 함수들을 등록하여 이벤트 발생 시 등록된 모든 함수를 호출한다. 언리얼엔진에서는 델리게이트를 사용한다면 AddDynamic 함수를 사용하는데 이것은 언리얼 엔진의 멀티캐스트 델리게이트에 함수를 동적으로 바인딩하기 위해 사용되는 매크로이다. 함수를 AddDynamic을 사용하여 델리게이트를 바인딩 할려면 그 함수는 UFUNCITON() 매크로를 사용하여 언리얼 엔진의 리플렉션 시스템에 등록해야한다. 왜냐면 AddDynamic()이 런타임에 함수를 델리게이트에서 바인딩 하기 때문.. 언리얼로 코딩을 하다보면 가끔 FORCEINLINE 을 함수 선언 앞에 붙일때가 있다. 컴파일러에게 특정 함수..

언리얼 엔진 5 2024.02.19

C++ 개인 필기(13) 동적 할당

HEAP -> 필요할대만 사용, 필요없으면 반낪 생성, 소멸시점 관리 동적 할당 : malloc, free / new, delete, /new[], delete[] //유저 영역 (메모장 or 게임)(독립적 실행) //커널영역 (운영체제의 핵심코드 실행) //유저 영역 [ ] malloc(sizeof(void ))를 통해 메모리 낭비 해결 ->메모리 할당 후 시작 주소를 가리키는 포인터를 반환 (메모리 부족시 NULL) void * ->포인터는 포인터, 포인터를 타고가면 뭐가 있는지 모르니깐 너가 적당히 변환해서 사용해라 -> Warrior *w1=(Warrior)ptr; w1->xx 처럼 할당 malloc/free 세트 ->free(ptr) 하지 않을 시에 메모리 누수 힙 오버 플로우->유효한 힙 범위..

c++ 2024.02.14

C++ 개인 필기(12) static

struct vs class c++ 에서 struct, class 는 종이 한장 차이 struct는 기본 접근 지정자= public, class 는 private 왜? c++은 c언어에서 파생되어 발전해서 호환성을 지키기 위해서.. struct는 그냥 구조체(데이터 묶음) 표현 class 객체 지향 프로그래밍의 특징 static 변수 -> 정적=고정된, 공통적으로 모든 객체가 같은 값을 가지면.. warrior, attack=1 static int attack; ->클래스 밖에 빼는 느낌 (전역 변수) AActor::attack=1; -> 외부선언 누구나 동일한 공격을 가진다. -> warrior 클래스의 종속적 함수에 static일때 초기화 하면 .data, 안하면 .bss 영역 static -> 생명..

c++ 2024.02.13

C++ 개인 필기(11) 클래스의 연산자

Class Position 이 있을때 Position pos3 = pos1 + pos2 -> 어떻게 해야할까? 연산자 vs 함수 -> 연산자는 피연산자의 개수/타입 고정 연산자 오버로딩 이란? 우리만의 클래스에 pos1+pos2 와 같은 연산자를 지원하게 만들고 싶을때 사용 1. 연산자 함수 정의 ->함수도 멤버함수와 전역함수가 있는 것처럼 연산자 함수도 2가지 방식 존재 pos1+pos2 만들기 Postion operator+() { Position pos , x=x1+x2, y=y1+y2, return pos;} pos3= pos1+pos2 == pos3=pos.operator+(pos2) 멤버 연산자 함수 a op b 형태에서 왼쪽을 기준으로 실행 (a가 클래스여야 가능 , a 를 기준 피연산자라함..

c++ 2024.02.07

C++ 개인 필기(10) 초기화 리스트

변수 초기화를 해야하는 이유 -> 초기화를 안하면 쓰레기값이 들어가기 때문 초기화 방법 1. 생성자 내에서 2. c++11 방법 -> 선언과 동시에 초기화 3. 초기화 리스트 ->선처리 영역에서 초기화 클래스 생성시 Warrior() 1순서 Warrior(AActor) 2순서 ~Warrior() 포함관계 -> 초기화 리스트를 사용해야 기타 생성자만 실행된다. 즉 초기화 리스트가 더 좋다. 정의함과 동시에 초기화가 필요한 경우 (참조, const) ->초기화 리스트에서 실행

c++ 2024.02.06

언리얼엔진5 C++로 정복하기(6) 적 타격

적을 타격하는 기능에 대해 간략히 알아보자 takedamage 나 onhit 내장함수도 있지만 박스 트레이서로 타격을 해보자플레이어가 들 무기 cpp파일에 오버랩 함수를 정의하자. (매개변수는 프리미티브 헤더파일에 매개변수가 작성되있어 복사 하여 붙여넣으면 된다.)무기에 박스 콜라이더 컴포넌트를 추가하고 UFUNCTION으로 정의하여 박스 오버랩 함수를 AddDynamic 으로 불러오자 (델리게이트 바인딩)자신의 무기 부분에 무기 칼날의 시작 부분을 BoxTraceStart로 지정 무기 칼날의 끝부분을 BoxTraceEnd 로 지정을 하고 TArray라는 동적 배열을 이용해 무기를 들고있는 자신은 오버랩 액터로서 제외하고 한번 맞은 대상은 배열에 추가해 투히트가 안되도록 반복문을 사용한다. 다음 UKis..

언리얼 엔진 5 2024.02.05

언리얼엔진5 C++로 정복하기(5) 몽타주(Monatage) 애니메이션

마우스 좌클릭을 눌렀을때 공격하는 애니메이션을 만들려면 어떻게 해야할까? 간단하게 알아보자! 몽타쥬 애니메이션으로 공격 기능을 사용해본 결과 언리얼엔진이 유니티보다 애니메이션 짜기 훨씬 쉽다는걸 알 수 있다.. 유니티에서 기능이 있는지 모르겠지만 애니메이션 중간에 파티클 이펙트, 사운드까지 추가 할 수 있다.. 얼마나 좋은가! 일단 플레이어 헤더파일에서 UAnimMonatge 를 선언하여 블루프린트에 애니메이션 몽타주를 삽입할 수 있도록 한다. 애니메이션 몽타주를 만들어서 기깔나게 애니메이션을 만들어보자 중간에 소리도 넣고 해보자! 만들어진 몽타주를 블루프린트에 넣어주고 프로젝트 세팅에서 입력칸에 마우스 좌클릭시 공격이라는 입력을 추가한후 코드로 바인딩을 해주고 코드상으로 마우스 좌클릭시에 Montage..

언리얼 엔진 5 2024.02.02

C++ 개인 필기(9) 은닉성 다형성

은닉성: 캡슐화 숨기는 이유 -> 위험하고 건드리면 안되는 경우, 다른 경료로 접근하길 원하는 경우 public, protected, private -> 멤버 접근 지정자 private -> class 내부에서만 class Warrior : public Player -> 상속 접근 지정자 protected -> class에 상속된 class에서만 사용이 가능하다. 상속 접근 지정자 -> 자식 class에 꼭 모든걸 물려줘야하는 것이 아니다. Warrior : protected Player -> public -> protected로 변환 부모는 public 자식은 protected // : priavte Player -> 부모만 public, 자식은 private-> 자식의 자식은 사용 불가능 다형성 ->..

c++ 2024.02.01