📝 5주차
- 언리얼 머터리얼 강의 [Unreal Engine 5: One Course Solution For Material] Section2🔗
- 백준 단계별로 풀어보기🔗
📅 8월 6일 21:00-24:00
📖 언리얼
12. Opacity
- Opacity를 조절하기 위해서는 Material의 result node의 Blend Mode를 Translucent로 바꿔줘야한다.
- 현재 화살표 텍스처의 R채널에는 화살표 영역만 1이고 나머지는 0이므로, R채널을 Opacity에 연결하면 뒤의 배경이 사라진다.
13. 움직이는 텍스처
- 텍스처를 움직이기 위해서는 UV를 조절
- 텍스처가 오른쪽으로 움직이려면 U를 감소, 위로 가려면 V를 증가 (텍스처는 가만히 있고 액자만 움직인다 생각하기)
- 거리 = 속력 * 시간이므로
속도 상수
와 Time
을 곱해 시간에 따른 거리를 구한다.
TexCoord
와 거리
를 더하여 텍스처 UV에 적용하면 텍스처가 움직인다.
- 오른쪽을 향하는 화살표 방향대로 움직이기 위해서 U만 조절해야한다.
- UV를
Component Mask
로 분리해서 U만 감소시키고, V는 그대로 둔 뒤 Append Vector
로 합쳐준다.
➕ Panner
- 더 쉽게 텍스처를 움직이는 방법
- Panner은 2벡터를 반환하는 형태로 UV채널에 넣을 수 있다.
- 위에서 했던 연산을 포함하는 노드로 Speed만 조절하면 움직이게 할 수 있다.
- 아래처럼
Time
노드와 함께 사용할 수도 있다.
14. Material Instance
- 머터리얼 창 안이 아니더라도 속성을 수정할 수 있도록 하는 기능
- 원하는 머터리얼을 우클릭하여 Material Instance를 생성하고, 액터의 머터리얼을 기존
M_MovingArrow
에서 MI_MovingArrow
로 바꾼다.
- 원하는 속성을 우클릭하여 Convert to Parameter를 누르고 이름을 정한다.
- 그러면 Material Instance창에 Parameter가 생긴다. 이름이 있어 가독성이 좋고 간단하게 속성을 조절할 수 있다.
- Material Instance의 parameter를 만들기 위해서는 single float가 필요하다.
- 원하는 속성이 Detail창 안의 여러 속성 중 하나라면 single flaot 노드로 뽑아내야한다.
S+좌클릭
하면 Parameter로 적용할 원벡터 노드가 바로 생긴다.
- 해당 노드의 디테일 창에서 기본값과 슬라이더를 조절할 수 있다.
- 원하는 노드를 선택하고
C
를 누르면 주석 박스가 생긴다.
- 디테일 창에서 색상과 폰트 크기를 조절할 수 있으니.. 이런 식으로 사용하면 된다
16. Fire material
- 수평으로 움직이는 텍스처와 수직으로 움직이는 텍스처를 곱한 뒤, 전체적인 밝기를 높이기 위해 상수를 곱해 Base Color와 Emission Color에 적용
- 더 보완하기 위해 텍스처의 타일링을 조절히고, single float로 뽑아내기 위해 아래와 같이 수정할 수 있다.
📖 백준
🪧 2941 크로아티아 알파벳
- 문자열 맨 앞에 크로아티아 알파벳이 있다면 해당 알파벳을 문자열에서 삭제하고 단어 개수를 카운트
- 맨 앞에 일반 알파벳이라면 해당 알파벳(1글자)만 삭제하고 단어 개수 카운트
- 문자열의 길이가 0이 될 때까지 반복한다.
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char* argv[]) {
string apb[8] = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };
string word;
int cnt = 0;
cin >> word;
while (word.length() != 0) {
for (int i = 0; i < 8; i++) {
if (word.find(apb[i]) == 0) {
if (apb[i] == "dz=") word.erase(0, 3);
else word.erase(0, 2);
cnt++;
break;
}
if (i == 7) {
word.erase(0, 1);
cnt++;
}
}
}
cout << cnt;
}
❕ 다른 사람의 풀이
- 알파벳을 찾으면 삭제하지 않고,
replace()
함수로 #
과 같은 문자로 바꾼 뒤 문자열 길이를 출력함.
for(int i = 0; i < 8; i++)
{
while(1){
idx = word.find(apb[i]);
if(idx == string::npos) break;
word.replace(idx,apb[i].length(),"#");
}
}
cout << word.length();
💭 나는 굉장히 비효율적으로 풀고있었구나.. ... .
📌 단어 유무 찾기 find()
string::find()
: 문자열 앞에서부터 검색하며 검색 문자열이 시작되는 위치를 반환
- 검색 문자열을 찾지 못한 경우
string::npos
를 반환한다.
if(str.find(검색 문자열) == string::npos)
🪧 1316 그룹 단어 체커
- 그룹 단어가 아닐 조건은 특정 문자가 직전 문자와 같지 않을 때, 직전 문자를 제외한 이전에 특정 문자와 같은 문자가 존재하는 것이다.
- 이 경우에만 False를 반환하고, 아닌 경우에는 True를 반환한다.
#include <iostream>
#include <string>
using namespace std;
bool isGroup(string s) {
for (int i = 2; i < s.length(); i++) {
if (s[i] != s[i - 1]) {
for (int j = 0; j < i-1; j++) {
if (s[i] == s[j]) return false;
}
}
}
return true;
}
int main(int argc, const char* argv[]) {
int n, cnt = 0;
string s;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s;
if (isGroup(s)) cnt++;
}
cout << cnt;
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char* argv[]) {
string name, grade;
float credit;
float scoreSum = 0;
float subjectSum = 0;
for (int i = 0; i < 20; i++) {
cin >> name >> credit >> grade;
if (grade != "P") {
subjectSum += credit;
if (grade == "A+") scoreSum += credit * 4.5;
else if (grade == "A0") scoreSum += credit * 4.0;
else if (grade == "B+") scoreSum += credit * 3.5;
else if (grade == "B0") scoreSum += credit * 3.0;
else if (grade == "C+") scoreSum += credit * 2.5;
else if (grade == "C0") scoreSum += credit * 2.0;
else if (grade == "D+") scoreSum += credit * 1.5;
else if (grade == "D0") scoreSum += credit * 1.0;
}
}
cout << scoreSum / subjectSum;
return 0;
}
- c++에서 특수문자(
"
, \
) 출력하기 위해서는 \
를 앞에 붙여야함
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char* argv[]) {
cout << " ,r'\"7" << endl;
cout << "r`-_ ,' ,/" << endl;
cout << " \\. \". L_r'" << endl;
cout << " `~\\/" << endl;
cout << " |" << endl;
cout << " |" << endl;
return 0;
}