프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

W = 8, H = 12

  • 잘려나간 종이들은 동일한 패턴을 가짐
  • 패턴은 W와 H의 최대공약수만큼 존재
  • W를 최대공약수로 나눈 값을 X, H를 최대공약수로 나눈 값을 Y라 할 때 각 패턴에서 사용할 수 없게 되는 정사각형의 개수는 X + Y - 1

> 사용할 수 있는 정사각형의 개수는 (W x Y) - (gcd x (X + Y - 1)) = (W x Y) - (W + Y - gcd)

> 여기서 입력되는 W, H는 1억 이하의 자연수기 때문에 W와 Y를 long 타입으로 캐스팅해주어야함

 

#include <iostream>

using namespace std;

int gcd(long long a, long long b) {
    if(b == 0) return a;
    return gcd(b, a % b);
}

long long solution(int w,int h) {
    return ((long long)w * (long long)h) - (w + h - gcd(w ,h));
}

 

이번에는 이것저것 수정해가지고 왔습니다.

 

 

일단 화면 해상도를 고려해서 각 필드의 크기를 늘렸습니다.

그리고 각 필드의 X,Y축 길이가 같지가 않아서 이전의 중심 기준으로 플레이어와의 X,Y 거리를 비교해서 더 멀리있는 축으로 이동시키는 게 안되더라구요.

그래서 플레이어와의 X, Y축 거리를 비율로 계산해서 필드를 이동시키도록 하는 것으로 해결하였습니다.

 

 

위와 같이 플레이어가 너무 멀리 가버리면 몬스터가 저렇게 남겨지는 경우가 발생하기도 해서

 

 

각 필드를 벗어나는 걸 감지하는 저 영역을 기준으로 몬스터들이 저 영역을 벗어날 시 플레이어가 가는 방향으로 재배치해주도록 하였습니다.

 

 

전투 관련 구현 및 변경점으로는 아래와 같습니다.

  • 탄이 플레이어 기준으로 마우스 방향으로 나감(이전까지는 플레이어 기준이 아닌 게임 시작 시 화면의 정중앙 좌표에서 나갔었음)
  • 탄이 벽에 충돌 시 탄 사라짐
  • 적과 탄 충돌 시 서로 사라짐

 

아래는 테스트 영상입니다.

 

스폰되는 몹 수 등 아직 수정해야할 게 많이 보이네요.

 

그럼 다음 포스트에선 마우스 커서를 바꿔보고... 몬스터 스크립트를 좀 수정해서 체력도 만들고

피격 시 데미지가 뜨게 해보겠습니다.

'과제 및 프로젝트 > Unity 2D 슈팅' 카테고리의 다른 글

Unity 2D 슈팅 - 05  (0) 2024.01.12
Unity 2D 슈팅 - 04  (0) 2024.01.10
Unity 2D 슈팅 - 03  (1) 2024.01.08
Unity 2D 슈팅 - 02  (2) 2023.12.27
Unity 2D 슈팅 - 01  (1) 2023.12.27

아래 내용들은 제가 학습한 정보를 추후에도 사용하기 위해 기록한 내용입니다.


[이번 섹션에서 배울 것]

  • 포인터와 참조
  • 액터 컴포넌트와 씬 컴포넌트
  • 헤더 파일
  • 루멘으로 빛 표현
  • 모듈식 레벨 디자인
  • 라인 트레이싱과 콜리전
  • for 반복문과 배열
  • 블루프린트에서의 C++ 함수 호출

[71. Modular Level Design]

2D 게임의 타일배치처럼 모듈화된 아트 작업물들을 갖고 다양한 조합을 통해 새로운 환경(레벨)을 만들어내는 것

[74. Light Types]

포인트 라이트(Point Light): 모든 방향을 빛을 뿜듯이 작동하는 라이트

스포트 라이트(Spot Light): 한 지점에서 원뿔 모양으로 빛을 내는 라이트

렉트 라이트(Rect Light): 정의된 너비와 높이로 된 직사각 평면 모양으로 씬에 빛을 내는 라이트

디렉셔널 라이트(Directional Light): 무한히 먼 거리에 있는 광원에서 오는 빛을 흉내내는 것

스카이 라이트(Sky Light): 레벨의 먼 부분을 캡처하여 그 부분을 씬에 라이트로 적용하는 것

[75. Lumen]

UE 5부터 제공하는 완전 다이내믹 글로벌 일루미네이션 및 리플렉션 시스템이자, 디폴트 글로벌 일루미네이션 및 리플렉션 시스템

 

[85. Line Trace & Sweep]

Trace(트레이스)는 레벨을 뻗어나가며 직선상에 무엇이 존재하는지 확인할 수 있는 메서드를 제공.

두 (시작과 끝 위치) 지점을 제공해 주면, 피직스 시스템에서 그 두 점에 직선을 그으며 거기에 (콜리전으로) 걸리는 액터가 있는지 보고해 주는 식으로 사용.

 

트레이스 채널

유니티의 Layer와 유사

[86. GetWorld()]

UWorld:: GetWorld()

현재 실행 중인 월드를 불러옴

[88. Reference vs Pointer]

[95. DrawDebugSphere()]

파란색은 라인 트레이스가 벽과 닿은 지점이니 무시하자

셰이프 트레이스 시 FHitResult의 location값은 해당 구제체의 중심 좌표를 리턴 > 초록색 구체

ImpactPoint는 구체와 사물이 충돌이 발생한 지점의 좌표를 리턴 > 빨간색 구체

[97. Waking Physics Objects]

물리 시뮬레이션 컴포넌트는 성능상 이유로 일정 시간이 지날 시 슬립 상태에 들어감

> 깨워 줄 필요가 있음

[99. Overlap Event]

오브젝트 A와 B가 겹쳐지면 발생하는 이벤트. Generate Overlap Event가 True여야 발생.

[101. TArray]

언리얼 엔진의 배열

TArray<int32> IntArray;

'개인 공부 > Unreal Engine 5' 카테고리의 다른 글

[UE 5/C++] Section 4 #1  (0) 2024.03.14
[UE 5/C++] Section2  (0) 2024.01.13
[UE 5/C++] Section1 #2  (0) 2024.01.13
[UE 5/C++] Section1 #1  (0) 2024.01.12
[UE 5/C++] 강좌 소개 및 설치  (0) 2024.01.11

아래 내용들은 제가 학습한 정보를 추후에도 사용하기 위해 기록한 내용입니다.


 

[18. Project Setup]

여기서 프로젝트의 엔진 버전 변경 가능

[19. Compiling a C++ Project]

새로고침 후 열기

[20. UProperty]

UPROPERTY: 멤버 변수 앞에서 기술되며, UPROPERTY 내에 프로퍼티 지정자를 나열하여
해당 프로퍼티가 엔진과 에디터와 다양한 상호작용이 가능

[21. Live Coding Issue]

라이브 코딩은 에디터의 변경 사항에만 영향을 미치고 디스크에 영구적으로 저장하지는 않음.

▶ IDE에서 다시 컴파일하면 됨 또는 에디터 설정에서 라이브 코딩 False

[22. Begin Play]

게임 시작 또는 액터 스폰 시에 호출되는 이벤트

[23. Tick]

게임 루프(Game Loop): 입력을 수신하고, 게임 상태를 업데이트하고, 렌더링하는 사이클

Tick: 매 프레임마다 호출되는 이벤트

[24. DeltaTime]

각 프레임이 실행되는 데 걸리는 시간

[25. GameMode Class]

뷰포트에서 우클릭을 통해 플레이/테스트하려는 위치를 정할 수 있음

[26. FRotator]

AddActorLocalRotation을 사용하는 것을 권장

'개인 공부 > Unreal Engine 5' 카테고리의 다른 글

[UE 5/C++] Section 4 #1  (0) 2024.03.14
[UE 5/C++] Section3  (0) 2024.01.22
[UE 5/C++] Section1 #2  (0) 2024.01.13
[UE 5/C++] Section1 #1  (0) 2024.01.12
[UE 5/C++] 강좌 소개 및 설치  (0) 2024.01.11

아래 내용들은 제가 학습한 정보를 추후에도 사용하기 위해 기록한 내용입니다.


[14. Geometry Brushes(BSP)]

지오메트리 브러시를 통해 레벨에 공간을 채워 넣거나 파낼 수 있음

[15. Materials and Lighting]

DirectionalLight를 통해 빛의 방향 등을 바꿀 수 있음

[16. Actor Components]

다른 컴포넌트의 자식일 경우 위치가 부모의 위치에서 상대적으로 표현

[17. Pure Function]

사이드 이펙트(Side Effect): 함수에서 눈에 보이는 효과. 함수 외부의 상테를 변경하는 것.

순수 함수(Pure Function): 사이드 이펙트가 없는 함수. 함수의 입력만이 출력 결과에 영향을 줌.

이전 포스트에서 계획했던 것 중 고민하던 맵 방식은 가는 방향으로 계속해서 맵이 이동하는 방식을 채택하였다.

 

일단 맵을 만들기 전에 이번에도 에셋을 구해왔습니다.

공장 느낌나는 걸로 가져왔다

 

그 다음 심혈?을 기울여 맵을 디자인했습니다.

 

시계 방향으로 필드 1,2,3,4

 

 

우하단 무수한 에러는 테스트한다고 오브젝트 하나를 대충 비활성화해서 그런거니 무시하자...

 

위에서 만든 맵을 플레이어가 절반쯤 이동하면 플레이어 이동 방향의 반대쪽에 있는 맵을 옮겨오도록 했습니다. 

 

 

 

 

전투는 총알이 좀 수정할 게 있어서 다음 포스트에서 구현하도록 하겠습니다.

'과제 및 프로젝트 > Unity 2D 슈팅' 카테고리의 다른 글

Unity 2D 슈팅 - 06  (0) 2024.01.22
Unity 2D 슈팅 - 04  (0) 2024.01.10
Unity 2D 슈팅 - 03  (1) 2024.01.08
Unity 2D 슈팅 - 02  (2) 2023.12.27
Unity 2D 슈팅 - 01  (1) 2023.12.27

아래 내용들은 제가 학습한 정보를 추후에도 사용하기 위해 기록한 내용입니다.


[4. Level Blueprint]

 

 

우클릭 시

[5. Blueprint Event Graph]

이벤트 그래프(Event Graph) - 블루프린트를 그릴 캔버스

 

BrginPlay 노드와 Print String 노드를 연결

 

[6. Physics Simulation]

 

[7. Objects and References]

레벨의 액터의 레퍼런스를 저장하는 노드 생성

 

레퍼런스를 통해 큐브를 찾고 큐브의 StaticMechComponent를 찾은 다음 특정 값을 리턴

 

[8. Adding an Impulse]

충격량(Impulse) = 질량(Mass) * 속도 변화(Velocity Change)

활성화 시 질량을 무시하고 가속도 적용

[9. Blueprint Classes and Instances]

클래스(Class): 일종의 틀(Templete)

인스턴스(Instance): 클래스에 소속된 객체(Object)

 

[10. Spawning Actors]

Spawn Actor from Class를 통해 블루프린트 클래스 생성 가능

[11. Pawns and Actor Location]

언리얼 엔진은 Player Start라는 액터의 위치에 Pawn을 생성

[12. Control rotation]

Pawn의 회전과 카메라 회전은 별개. Get Control Rotaion 노드를 통해 카메라 회전 값을 반영해 줄 방법은 있음

[13. Get Forward Vector]

Get Forward Vector 노드로 얻을 수 있는 벡터의 길이는 1.0

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

완전탐색이라 dfs로 접근해보았습니다. 그리고 간선을 하나만 끊어서 2개로 나누는거라 첫 번째 송전탑에서만 dfs를 진행해서 그 값을 송전탑의 개수에서 빼는 것으로 나머지 전력망의 송전탑 수를 구했습니다. 

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int graph[101][101] = {0};
int visited[101] = {0};

int dfs(int curTower, int n) {
    if(visited[curTower] == 1) return 0;
    
    int count = 1;
    visited[curTower] = 1;
    
    for(int i = 1; i <= n; i++) {
        if(graph[curTower][i]) {
            count += dfs(i, n);
        }
    }
    
    return count;
}
    
int solution(int n, vector<vector<int>> wires) {
    int answer = 101;
    
    for(int i = 0; i < wires.size(); i++) {
        int x = wires[i][0];
        int y = wires[i][1];
        
        graph[x][y] = 1;
        graph[y][x] = 1;
    }
    
    for(int i = 0; i < wires.size(); i++) {
        int x = wires[i][0];
        int y = wires[i][1];
        graph[x][y] = graph[y][x] = 0;
        
        fill_n(visited, 101, 0);
        int connectedTower1 = 0, connectedTower2;
        
        int count = dfs(1, n);
         
        connectedTower1 = count;
        connectedTower2 = n - count;
        
        answer = min(answer, abs(connectedTower1 - connectedTower2));
        
        graph[x][y] = graph[y][x] = 1;
    }
    
    return answer;
}

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

각 분마다 몇 개의 객실이 존재해야하는지 구하는 방식으로 접근했다.

 

 

1.  room[1450]을 선언하고 0으로 초기화. 청소시간을 고려해서 1440 + 10을 하였다.

2. 각 예약의 대실 시작 시간과 대실 종료 시간 + 청소 시간을 분으로 구함

3. 위의 두 값 사이의 수를 인덱스로 가지는 요소들의 값을 증가

4. room 배열의 최댓값을 리턴

#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<string>> book_time) {
    int answer = 0, room[1450] = {0, }; //24*60 + 10 = 1450
    
    for(int i = 0; i < book_time.size(); i++) {
    	//대실 시작 시간을 분으로 전환
        int reserveStart = stoi(book_time[i][0].substr(0, 2)) * 60 + stoi(book_time[i][0].substr(3, 2));
        //대실 종료 시간 + 청소 시간을 분으로 전환
        int reserveEnd = stoi(book_time[i][1].substr(0, 2)) * 60 + stoi(book_time[i][1].substr(3, 2)) + 10;
        
    	//대실 시작 시간부터 종료 시간까지 room배열의 값을 증가
        for(int time = reserveStart; time < reserveEnd; time++) {
            room[time]++;
        }
    }
    
    //room 배열 안의 가장 큰 값이 필요한 최소 객실 수
    for(int num : room)
        if(num > answer) answer = num;
    
    return answer;
}

아래 내용들은 제가 학습한 정보를 추후에도 사용하기 위해 기록한 내용입니다.


 

[2. Navigating The Viewport]

 

중앙의 큰 화면이 뷰포트(Viewport)

 

우상단 세팅에서 엔진 퀄리티 옵션을 조정 가능

 

개인적으로 뷰포트 탐색은 마우스 우클릭으로 조작하는게 편한거 같다...

[3. Moving & Placing Actor]

 

액터(Actor) - 레벨에 배치할 수 있는 오브젝트. 2의 이미지에서 시각적으로 보이는 물체들 전반

아웃라이너(Outlienr) - 현재 레벨의 모든 액터를 나타내는 계층형 트리 뷰. 2의 이미지에서 우측 상단

 

 

툴 바의 위 버튼을 통해 빠르게 액터 추가 가능

 

 

W(이동), E(회전), R(스케일)을 선택하고 중앙의 기즈모를 통해 액터의 위치, 회전, 크기 등을 조절할 수 있다.

 

참고로 이동 기즈모를 조작해보면 뭔가 끊기는 느낌을 받을 수 있는데 그리드 스냅이 켜져있어서 그렇다.

그리드 스냅

 

Alt를 누르고 드래그하면 액터가 자동 복사된다.

[4. C++ & Blueprint]

블루프린트

 

블루프린트(Blueprint)? 언리얼 엔진의 비주얼 스크립팅 시스템

 

장점

수정이 빠름

초보자 친화적

기능을 찾기 쉬움

언리얼 전용

 

C++

 

장점

간결함

업계 표준 언어

매우 빠른 속도

언리얼의 모든 영역과 기능에 접근 가능

대형 프로젝트에 적합

 

▶ 블루프린트와 C++의 적절한 병행 사용을 통해 두 언어의 장점을 모두 누릴 수 있음

+ Recent posts