일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 상계9동
- 224일선
- 산토리 하이볼
- 112일선
- 언리얼5
- 공부
- URP
- 구글 컨퍼런스
- GenAI
- 1일차
- 이득우의 언리얼 프로그래밍 1
- 리팩터링 4장
- 작계훈련
- JavaScript
- 주식단테
- 리팩터링
- 전주비빔 라이스 버거
- 언리얼 5
- 리팩터링 3장
- 이득우의 언리얼 프로그래밍1
- 2023 구글 클라우드
- 2023 게이밍 인 구글 클라우드
- 2023 게이밍
- 2023 Gaming
- 주식
- 448일선
- 스즈메의 문단속
- shader
- 스포일러 주의
- unity
- Today
- Total
목록전체 글 (78)
개발 이야기 안하는 개발자
기능이 일부 제작된 3강 예제이다. 실행버튼 끝쪽에 more를 누르면 Numberof Players로 플레이 사람수를 정할 수 있다. Play a Listen Server 를 누르게 되면 게임 실행방식은 이제 Listen Server 로 동작하게 된다. Project 셋팅에서 Allow Late Joing을 활성화 한다 그럼 다음과 같이 톱니바키 실행버튼 (Add another Client)이 생기는데, 이 버튼을 누르면 다른 클라이언트의 화면이 활성화 되는 것을 볼 수 있다. 언리얼 네트워크 개요 언리얼 멀티 프로젝트는 새로운 엔진처럼 느낄정도로 새롭고 어렵다. 멀티플레이 프로젝트를 제작할 예정이라면 처음부터 구성을 염두해 두고 제작해야 한다. 멀티플레이 게임은 싱글플레이에서도 정상 작동한다. 하지만 ..
헤드업 디스플레이 HUD는 플레이어 컨트롤러에 의해 제작되고 관리되는 UI 객체이다. HUD의 구현은 위젯을 생성하고 이를 플레이어 뷰포트에 띄우는 과정으로 생성된다. 이렇게 만들어진 위젯은 자신을 소유한 플레이어 컨트롤러에 접근할 수 있다. 위 이미지는 각각 초기화 되는 기능 순서이다. CreateWidget을 호출해서 제작하고 그럼 UI가 NativeOnInitialized 가 호출된다. 이후 AddtoViewPort를 호출하면 NatvieConstruct 가 호출되는 방식이다. CharacterStatComponent.cpp에서 값을 초기화를 먼저 하려면 InitializeComponent부터 호출해야 한다. protected: virtual void InitializeComponent() over..
데이터를 csv로 읽어와서 이를 언리얼에 적용할 것이다. 이를 읽어오는 하나의 폼을 스크립트로 제작하고 이를 블루프린트로 만들예정이다. DataAsset과 유사하게 FTableRowBase를 상속받은 구조체를 선언해야 한다. 엑셀의 Name 컬럼을 제외한 컬럼과 동일하게 UPROPERTY속성을 선언하고 csv를 언리얼 엔진에 임포트한다. Source파일 안에 원하는 곳에 메모장을 제작하고 이름뒤에 헤더를 붙인다 (.h) USTRUCT(BlueprintType) struct FABCharacterStat : public FTableRowBase { GENERATED_BODY() public: FABCharacterStat() : MaxHp(0.0f), Attack(0.0f), AttackRange(0.0f..
액터 컴포넌트를 활용한 스탯액터에 부착할 수 있는 컴포넌트 중 트랜스폼이 없는 컴포넌트액터의 기능을 확장할 때 컴포넌트로 분리해 모듈화를 할수 있음.스탯 데이터를 담당하는 컴포넌트와 UI 위젯을 담당하는 컴포넌트로 분리액터는 두 컴포넌트가 서로 통신하도록 중개하는 역할로 지정 언리얼 델리게이트를 활용한 발행구독 모델푸시형태의 알림을 구현하는데 적합한 디자인 패턴스탯이 변경되면 델리게이트에 연결된 컴포넌트에 알림을 보내 데이터를 개신스탯 컴포넌트와 UI컴포넌트 사이의 느슨한 결합의 생성발행구독과 옵저버의 차이는 발행구독 사이엔 델리게이트라는 연결다리가 있어서 스탯컴포넌트와 UI 위젯 컴포넌트가 서로 모른다는 장점이 있다. 캐릭터 머리 위에 HP bar를 제작한다.Widget Blueprint를 UserWi..
게임 플레이 큐(Cue) _GC라고 부름 시각 이펙트나 사운드와 같은 게임 로직과 무관한 시각적, 청각적 기능을 담당함. 데디케이티드 서버에서는 사용할 필요가 없음. - 스태틱 게임플레이 큐 : 일시적으로 발생하는 특수효과 사용 (Execute 이벤트 발동) - 액터 게임플레이 큐 : 일정 기간동안 발생하는 특수효과에 사용 (Add / remove 이벤트 발동) 블루프린트로 제작하는 게 더 좋음. 게임플레이 이펙트에서 자동으로 GC와 연동할 수 있도록 기능을 제공하고 있음. 게임플레이 큐의 재생은 GameplayCueManager가 관리함(분리된 구조) 게임플레이 태그를 사용해 쉽게 발동시킬수 있음. - 이때, 반드시 GameplayCue로 시작하는 게임플레이 태그를 사용해야 함. 공격에 성공했을때 이펙..
캐릭터 어트리뷰트를 제작한다. 어트리뷰트 세트 GAS에서 제공하는 언리얼 오브젝트 이다. 단일 어트리뷰트 데이터인 GameplayAttributeData의 묶음이다. GameplayAttributeData는 하나의 값이 아닌 두 가지 값을 구성되어 있다. - BaseValue (기본 값), CurrentValue (변동 값) - PreAttributeChange(), PostAttributeChange(), PreGameplayEffectExecute(), PostGameplayEffectExecute() 어트리뷰트 세트 접근자 매크로를 만들어서 제공함. ASC는 초기화될 때 같은 액터(Owner)에 있는 AttributeSet 타입 객체를 찾아서 등록하기 때문에 따로 초기화를 제작하지 않아도 된다. 상..
캐릭터에는 사용하는 애니메이션을 지정해주는 컴포넌트가 있다. 캐릭터 매쉬에 Animation을 보면 사용할 모드와 애님 클래스를 지정할 수 있다. 블루프린트를 사용할 꺼고, 애님 클래스는 ABP_ABCharacter_C 를 사용한다고 적혀있다. 적혀져 있는 ABP_ABCharacter_C는 따로 제작한 클래스이다. AnimInstance를 상속받은 클래스를 하나 제작한다. 그리고 이것을 토대로 블루프린트를 제작하고 지정하면 된다. 타겟할 스켈레톤과 만들었떤 Anim Instance를 지정해주고 제작하면된다. 캐릭터는 GetAnimInstance()를 통해 AnimInstance를 가져올 수 있고, AnimInstance는 GetOwningActor()를 통해 캐릭터를 가져올 수 있다. 애니메이션 블루프린..
게임 플레이 어빌리티 시스템(GAS) 액터가 소유하고 발동할 수 있는 어빌리티 및 액터간의 인터랙션 기능을 제공하는 프레임웍. 큰 규모의 RPG및 네트워크 멀티 게임에 효율적으로 적합함. 장점 - 유연성과 확장성 - 모듈러 시스템 - 네트워크 지원 - 데이터 기반 설계 - 완성도 단점 - 배우는 학습 비용 - 오버헤드 ASC(어빌리티 시스템 컴포넌트) 와 GA(게임플레이 어빌리티) ASC에는 호출될때 발동할 수 있는 액션들을 저장한다. GA 발동 과정. 1. ASC의 GiveAbility()에 발동할 GA의 타입을 전달한다. (GA의 타입정보를 게임 플레이 어빌리티 스펙이라 함) 2. ASC에게 어빌리티를 발동하라고 명령함. 3. 발동된 GA에는 발동한 액터와 실행 정보가 기록됨 (SpecHandle_발..
28. 소프트웨어 공학 초기 아이디어부터 최종 제품에 이르기까지 단계적으로 진행하도록 프로세스를 정의해서 무질서한 소프트웨어 개발을 체계화하는 소프트웨어 라이프사이클 (소프트웨어 수명 주기)모델도 다양하게 나와있다. 폭포수 모델 계획 , 설계 , 구현 , 단위 시험, 서브시스템 시험, 통합 시험, 평가 순서대로 진행되는 라이프 사이클이다. 간결하기 때문에 프로젝트를 계획하면 관리하기 쉽다. 하지만 현실은 개발과정을 수행하는 동안에도 요구사항이 새로 추가되는 경우가 많기 때문에 이는 이행하기 어려운 모델이다. 사시미 모델. 단계는 폭포수와 동일하지만 앞뒤가 단계적으로 부분적으로 겹치는 점이 다르다. 바로 앞 뒤 단계를 이행 하기도 하고 병행하기도 한다. 나선형 모델 현재 단계에 문제가 있떠라도 다음 단계에..
25. 표준 라이브러리 커스터마이즈 및 확장 방법 find_all() 인수로 주어진 프레디케이트를 만족하는 원소를 주어진 범위에서 모두 찾는 알고리즘을 구현한다고 하자. find()와 find_if() 모두 한 원소만 가리키는 반복자를 리턴한다. 이렇게 새롭게 알고리즘을 제작 및 확장하려면 프로토타입부터 정의해야 하는데, 이때 find_if()에 적용된 모델을 그대로 따르면 제작하기 쉽다. 비슷한 기능을 참고하면 된다. template OutputIterator find_all(InputIterator first, InputIterator last, OutputIterator dest, Predicate pred) { while (first != last) { if (pred(*first)) { *des..
7. 메모리 관리 int i { 7 }; 로컬 변수 i는 자동 변수라 부르며 스택에 저장된다. 변수가 선언된 스코프를 벗어나면 자동으로 메모리가 해제된다. new와 delete int* ptr { nullptr }; ptr = new int; new 키워드로 메모리를 할당하면 프리스토어에 메모리가 할당된다. new로 할당한 메모리는 delete 키워드로 해제한다. 만약, 포인터를 담았던 변수가 스코프를 벗어나면 할당한 메모리에 접근할 수 없게 되고 이를 "미아가 된다" 라고 표현한다. 이를 메모리 누수(메모리 릭)이라 부른다. new가 실패하는 경우는 해당 메모리 만큼 가지고 있지 않을때 그런다. 예외처리로 막으면 되는데 이때 nothrow를 사용하면 예외처리가 가능하다. int* ptr { new(no..
4. 전문가 답게 C++ 프로그램 설계하기 프로그램 설계 정의 프로그램에 기능을 추가하는 작업에 들어가기전에 가장 먼저 할일은 요구사항 분석이다. 이해 당사자와 함께 논의해서 핵심 기능 요구 사항 문서를 정리하는 것이다. 최종 시스템의 동작이 아닌 속성을 표현하는 비기능 요구사항 문서도 나올 수 있다. (보안성, 확장성 등등) 여기에서 나온 표현도 모두 적는다. 요구사항을 모두 수집했다면 프로그램 설계를 진행한다. 설계 문서는 대체로 서브시스템(시스템에서 작업이 처리되는 위치)사이의 상호작용과 클래스 계층을 보여주는 다이어그램이나 표로 구성된다. 설계를 진행함에 있어 예상치 못한 문제나 변화에 유연하게 대처하도록 구성된 소프트웨어 공학 프로세스도 많다. 그 대표적인 예로 스크럼이라는 애자일 소프트웨어 개..