0. 생성한 스크립트
- Status : 비트 논리연산
- Color : 색상 비트 조합 출력
- String : 문자 변수 및 문자열 변수 출력
- Casting : 자료형 변환 출력
- If : if 조건 비교 후 출력
- 메테리얼 생성 후 삽입
- Movement : 키 입력 받아서 콘솔에 출력하기
1. 비트 연산자
- <<연산은 그대로 부호 비트의 유지 없이 이동만 한다.
- >>연산은 이동하는 변수가 음수를 포함한 자료형일 경우, 최상위의 부호 비트는 이동하되, 유지한다.
| 항목 | 연산자 | 설명 |
| AND | & | 두개의 비트가 1인 경우 1, 그 외는 0 |
| OR | | | 둘중 하나의 비트라도 1인경우 1 |
| XOR | ^ | 두개의 비트값이 같으면 0, 다르면 1 |
| NOT연산 | ~ | 비트값을 반전, 0이면 1 / 1이면 0 |
| 쉬프트 왼쪽 | << | 비트값만큼 왼쪽으로 이동 |
| 쉬프트 오른쪽 | >> | 비트값만큼 오른쪽으로 이동 |
uint attack = 1;
uint armor = 2;
uint hp = 4;
uint mp = 8;
uint status = attack | hp;
=> status의 값은 or연산으로 0101 = 5다.
. status 와 hp를 And 연산으로하면 0100 = 4가 나오니 status는 hp에 포함 된다고 할 수 있다.

2. 16진수 색상조합 / 분리
- 0xFFFFFFFF = 1111 1111 1111 1111 1111 1111 1111 1111 => FF = 1바이트 = 8비트
- 0x00800000 >> 16 => 0x0080인듯 하다 => 128(0*16의 0승 + 8*16에 1승)
uint color = 0x00120013;
uint red = 0x00FF0000;
print($"red = {color & red}");
uint green = 0x0000FF00;
print($"green = {color & green}");
uint blue = 0x000000FF;
print($"blue = {color & blue}");
uint color2 = 0x008040F0;
red = color2 & red; //0x00800000
red = red >> 16;
print($"red = {red}");
green = color2 & green; //0x00004000
green = green >> 8;
print($"green = {green}");
blue = color2 & blue; //0x000000F0
print($"blue = {blue}");
uint color3 = 0x00000000; //검정색?
byte a = 128;
byte r = 255;
byte g = 64;
byte b = 32;
uint alpha = (uint)a << 24;
red = (uint)r << 16;
green = (uint)g << 8;
blue = (uint)b;
color3 = color3 | alpha;
color3 = color3 | red;
color3 = color3 | green;
color3 = color3 | blue;
print($"color3 = {color3}");


3. 문자열
- string.Compare(A, B) : 두 문자열이 동일하면 0 / 첫 번째 문자열이 두 번째 문자열보다 크면 1 또는 0보다 큰값을 반환 / 첫 번째 문자열이 두 번째 문자열보다 작으면 -1 또는 0보다 작은 값을 반환
char a = '가';
int b = (int)a;
print($"a = {a}");
string name = "aaa bbb ccc";
string koreanName = "ㅁㅁㅁ";
print(name + " / " + koreanName);
print($"{name} / {koreanName}"); ;
Debug.LogFormat("{0} / {1}", name, koreanName);
string name1 = "aaa ";
int result = string.Compare(name, name1); //문자열 비교 함수
print($"Name : {name}, koreanName : {koreanName}, result : {result}");
string name2 = name.Substring(0, 4); //name에서 0번째 자리부터 4자를 자른다.
int result2 = string.Compare(name1, name2);
print($"Name : {name}, koreanName : {koreanName}, result2 : {result2}");
4. 캐스팅(자료형 변환)
- 명시적 캐스팅 : int type2 = (int)type1; => 바뀌는 자료형을 보여주는 변환방법
- 암시적 캐스팅 : long type4 = type3; => 잘리는값이 없기에 들어가지만, 쓰면 안좋다.
long type1 = 200;
int type2 = (int)type1; //명시적 캐스팅
int type3 = 100;
//long type4 = type3; //암시적 캐스팅(쓰면 안좋다) / int는 long보다 작아서 가능하다.
long type4 = (long)type3;
float pi = 3.14f; //f : 접미어 = float임을 명시해주는것이다?
print($"pi = {pi}");
int pi2 = (int)pi; //소수점이 잘릴것이니 캐스팅 안하면 빨간줄뜬다.
print($"pi2 = {pi2}");
double pi3 = (double)pi;
print($"pi3 = {pi3}");
string s = "1234";
int s1 = System.Convert.ToInt32(s); //이런 변환도 가능하다
print($"s1 = {s1}");
int s2 = 4567;
string s3 = s2.ToString();
print($"s3 = {s3}");
int number = 3;
int number2 = ++number;
print($"number : {number}, number2 : {number2}");
int number3 = number++;
print($"number : {number}, number2 : {number3}");
5. 연산자
- 이항연산자 : +, -, *, /, %, &, |, ^ => a = a+b / a += b
- 단항연산자 : ~, ++, -- => int a = 3; int b = ++a; int c = a++;
int number = 3;
int number2 = ++number;
print($"number : {number}, number2 : {number2}");
int number3 = number++;
print($"number : {number}, number2 : {number3}");

6. if (제어문)
- if문 아래의 코드가 한줄이라면, 중괄호 생략이 가능하다(2줄 이상이면 안됨)
public int number = 0;
private void Start()
{
if(number == 10)
{
print("number == 10");
}
if(number >= 10)
{
print("number >= 10");
}
else if(number >= 8)
{
print("number >= 8");
}
else
{
print("거짓");
}
if(number >0 && number <= 6)
{
print("number는 0보다 크고 6보다 작음");
}
if (!(number > 0 && number <= 6))
{
print("number는 0보다 크고 6보다 작음");
}
if ((number > 0 && number <= 6) == false)//!는 졸리면 잘 안보여서 이걸 많이 쓴다.
{
print("number는 0보다 크고 6보다 작음");
}
bool b = number >= 6; //조건맞으면 true 아니면 false
print($"b = {b}");
int value = number > 0 ? 10 : 20; //삼항연산자
print($"value = {value}");
}
7. Input Key 이벤트
if (Input.GetKeyDown(KeyCode.Space)) //누르는순간 true 한번만, 안누르면 false
{
print("스페이스 키 누름");
}
if (Input.GetKey(KeyCode.Space)) //누르고 있으면 true 계속
{
print("스페이스 키 누르고있음");
}
if (Input.GetKeyUp(KeyCode.Space)) //누르는순간 true 안누르면 false
{
print("스페이스 키 땜");
}

8. 기타
- mesh renderer가 있으면 meterial이라는 재질을 만들수있다.
- 에셋폴더 우클릭 -> create -> meterial
- 오브젝트 우클릭 -> align with view : 지금 보고있는 화면과 메인 카메라 시점을 맞춘다.
- 유니티 에셋폴더 밑에 슬라이더를 맨 왼쪽으로 바꾸면 항목이 리스트 형식으로 바뀐다.
- 이름 명명 규칙 : 헝가리안 = ui_hp_Up (자료형_뭘뜻하는지쓰고_어떤역할인지쓰고) => 틀딱도 안쓴다., 파스칼 = HpUp(단어마다 앞글자는 "대문자") => 클래스이름/함수명에 주로 쓴다., 카멜 = hpUp(대소문자 혼용) => 변수에 사용한다.
=> 사람마다 쓰는 방식이 다르니 이게 반드시 맞는것은 아니다. - 플레이 누른 상태에서 스크립트나 값을 추가하면 플레이가 정지했을 때 값이 초기화된다. (실제로 플레이 상태에서 오브젝트 만들고 스크립트도 넣고 매테리얼도 넣어서 값도 바꿨는데 플레이 끄니 전부 날아감...)
- f9(디버그 브레이킹 포인트 : 디버깅 중 이 지점에서 멈춘다.) 후 f5 : 디버깅을 하고 브레이킹 포인트까지의 변수와 값이 나온다.
. 창 => 조사식 => 조사식1 : 이름에 변수명을 치고 나온 값에 우클릭 => 16진수변환 하면 값이 16진수로 나온다.
. 볼게 끝나면 shift + f5 누르고 브레이킹 포인트에 다시 f9를 눌러줘야 디버깅이 안멈추고 실행된다. - ctrl + z : 이전으로 돌아가기, ctrl + y : 돌아가기 취소