1. 유니티 기초 공부를 했다

모래사우르스
|2024. 4. 12. 22:38

오늘 학습량 : 유튜브 강의 영상 5개

/

유튜브 골드메탈 영상 중 유니티 기초 강좌를 보았다. 재생목록에 있는 영상은 총 88개인데 영상 총 길이가 1일 20시간 46분이다.
일단 2D 개발 영상만 볼 예정이라 아마 다 보려면 반절인 24시간 정도 걸리지 않을까 싶다.
4월 3주차 목표 : 골드메탈 유니티 2D 강좌 전부 보기
 
유튜브 재생목록 총 길이를 알려주는 사이트:  https://ytplaylist-len.sharats.dev/ 
코드 색상 바꾸는 사이트: https://colorscripter.com/
(아.. 근데 더보기에서 코드블럭으로 바꿀 수 있다. 이러면 들여쓰기도 완벽하게 나온다. 다음부터는 저걸 써야지)

영상 보면서 필기한 내용

유니티 Documentation, Platforms(Android Build Support, WebGL(웹에서 바로 플레이 가능)) 깔려 있는지 체크

일단 WebGL 게임으로 간단하게 만들어 보는 것도 좋을 듯? 포폴용으로 가볍게 미니게임 형식으로 만들어놓고 나중에 깃허브 블로그 다시 다듬어서 만든 게임들 올려놔도 괜찮을 듯

Hierachy(계층구조): 오브젝트를 확인하거나 만들 수 있음(왼쪽 상단)
Inspector: 선택한 오브젝트의 속성을 볼 수 있음(오른쪽)

계층구조에서 우클릭 -> 오브젝트 생성 가능(3D/2D 선택)

Q: 뷰 이동(마우스 중간 버튼 클릭 드래그로도 가능)
W: 오브젝트 이동
E: 오브젝트 회전
R: 오브젝트 크기 조절
T: 2D 또는 UI에 쓰이는 커서(오브젝트 크기 조절도 되긴 함)
Alt+우클릭: 카메라 축 이동
방향키: 카메라 자유이동
마우스 휠: 카메라 줌

<콘솔창에 메시지 띄우기>
1. 스크립트를 만든다(프로젝트창에서 우클릭, C# Script 클릭)
2. 파일을 열면 비쥬얼 스튜디오에서 편집 가능.
3. 콘솔창을 프로젝트 창 옆에 위치시킨다.(콘솔창은 프로젝트창이랑 같은 창에 다른 탭으로 존재함. 드래그&드롭으로 옮길 수 있다)
4. 아래 함수를 사용하여 출력한다.
Debug.log(): 콘솔창에 메시지 출력
5. Hierarchy 창에서 오브젝트 선택 후 열린 Inspector창에 스크립트를 드래그&드롭 해준다. 이러면 스크립트가 게임 오브젝트 안으로 들어감. (오브젝트가 스크립트를 가지고 있어야 출력이 된다.)
6. 상단의 Play 버튼을 누르면 콘솔창에 출력되는 것 확인 가능.

변수타입 예시 : int(레벨) / float(힘과 같은 수치) / string(캐릭터명) / bool(참/거짓)

C# 주석처리 : //

코드예시
<배열>

string[ ] monsters = { "slyme", "devil"};
int[ ] monsterLevel = new int[3];
monsterLevel[0] = 6;
Debug.Log("맵에 존재하는 몬스터의 레벨");
Debug.Log(monsterLevel[0]);



<리스트>

List<string> items = new List<string>();
items.Add("생명물약");
items.Add("마나물약");
Debug.Log("가지고 있는 아이템");
Debug.Log(items[0]);
items.RemoveAt(0);
//이러면 생명물약이 지워지면서 마나물약이 0번 자리로 가게 된다. 리스트기 때문에 자리가 앞에 빠지면 뒤가 채워짐.
Debug.Log(items[1]); //이러면 마나물약이 앞으로 이동했기 때문에 그 자리는 비게 되고, 여기서 에러가 뜬다.



<연산자를 이용한 레벨 시스템>
int exp = 1500;
int level = exp/300;
int nextExp = 300 - (exp%300);
Debug.Log("다음 레벨까지 남은 경험치는?");
Debug.Log(nextExp);
//이 경우는 300을 변수로 만들고 레벨이 올라갈수록 경험치를 더 많이 얻어야하니까 계속 증가하는 식으로 설계하면 될 듯.


<string끼리 합쳐서 출력하기>

string title = "전설의";
string playername = "M";
Debug.Log(title + " " + playername);
//중간에 + " " + 를 넣어준다. 이 경우엔 사이에 여백이 들어가는 거고, 붙어서 나오는 걸 원하면 그냥 ""로 넣어주면 된다.



<true와 false>
ex1)

int fullLevel = 99;
int level = 6;
bool isFullLevel = level == fullLevel; //level과 fullLevel이 같다면 isFullLevel은 True가 될 것이고, 그렇지 않다면 False가 될 것이다.
Debug.Log("용사는 만렙입니까?"+isFullLevel); //False를 출력


근데 isFullLevel 앞에 bool 안 붙여도 되는건가?

ex2)

bool isEndTutorial = level > 10;
Debug.Log("튜토리얼이 끝난 용사입니까?"+isEndTutorial);



ex3)
bool isBadCondition = health <= 50 && mana <= 20;

<if문 같은데 더 간단한거.. 아직도 내 머릿속의 장기기억으로 넘어가지 않은거>
? A : B //true일 때 A, false일 때 B 출력.
string condition = isBadCondition ? "나쁨" : "좋음"

<조건문 중 switch문 예시>

switch(monsters[1]) {
case "slyme":
case "snake": //두개 이상의 케이스가 같은 결과가 나오게 하고 싶을 시 이렇게.
Debug.log("소형 몬스터가 출현!");
case "devil":
Debug.log("중형 몬스터가 출현!");
default:
Debug.log("??? 몬스터가 출현!");



<foreach문>
for문의 그룹형변수 탐색 특화

ex) for문을 사용한 경우

for(int index = 0; index <monsters.Length; index++){
Debug.Log("이 지역에 있는 몬스터 : " + monsters[index]);
}



ex) foreach문을 사용한 경우

foreach(string monster in monsters){
Debug.Log("이 지역에 있는 몬스터 : " + monster);
}



<클래스>
유니티에서는 보통 하나의 파일에 하나의 클래스가 존재한다.
1. 새 스크립트를 만든 뒤

public class Actor{
}


를 제외한 모든 것을 지운다.

스크립트 예시)

public class actor{
public int id; //그냥 int는 원래 private int인데 앞에 있는 게 생략된 거다. 나머지도 마찬가지. 그래서 클래스를 외부에서 사용하려면 앞에 public을 붙여야한다.
public string name;
public string title;
public string weapon;
public float strength;
public int level;
public string Talk(){ //함수도 마찬가지로 앞에 public 추가해줘야함
return "대화를 걸었습니다.";
}
public void LevelUp(){
level++;
}
}



클래스를 작성하고 나면 start와 update가 있는 메인 스크립트에서 클래스를 선언한다.
Actor player = new Actor(); //인스턴스화
인스턴스: 정의된 클래스를 변수 초기화로 실체화(클래스를 변수로 만든다.)

아래와 같이 해당 클래스에 있는 변수나 함수를 사용할 수 있다.

player.id = 0;
Debug.Log(player.Talk());
player.Levelup();



<클래스 참조>
기존에 있는 클래스(부모)의 속성을 그대로 물려받는 새로운 클래스(자식)를 만들 수 있다. (상속관계)
예를 들면 캐릭터 클래스를 만들었는데 천사와 악마로 나눠서 만들고 싶을 때,
기본 틀은 어쨌든 '캐릭터'이므로 캐릭터 클래스를 가져온 다음 천사클래스와 악마클래스를 만드는 것이다.

어떻게 보면 기본 클래스의 코드를 복붙해서 새로 파일을 만드는 과정이랑 같은데, 그런 번거로움을 없애는 것.

public class Player : Actor{
public string move(){

 

return "플레이어가 움직인다."
}
}



이 경우 Actor 클래스를 물려받아서 Player 클래스를 만든 것이다. 플레이어를 제외한 다른 Actor는 움직이지 않으므로, 플레이어에게만 움직이는 동작을 넣고 싶다고 할 때 이런 식으로 함수를 추가할 수 있는 것이다.


그래도 전에 몇 번 찍먹했던 내용들이라 어렵지 않게 들을 수 있었다. 최대한 빠른 시일 내로 강의를 다 듣고, 4주차에는 직접 구현해보면서 진행하면 좋을 것 같다. 빨리 포트폴리오를 만들고 싶다. 질보다 일단 양으로 승부하고 싶음(물론 질도 중요하지만 지금 뭐가 없어도 너무 없어서)