Unity

Unity(1) 기초

사회적가치누리 2024. 11. 7. 19:34

유튜버 "골드메탈"님의 강의를 보고 공부했습니다.

 

https://www.youtube.com/watch?v=7plGPXkmnxQ&list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2

 

설치과정은 유튜브에 자세히 나와있으니까 생략합니다.

 

유니티는 인터페이스가 기본적으로 4개로 구성되어있습니다.

 

게임을 구성하는 파일들. 그래픽,사운드등은 프로젝트(project)에 들어갑니다.

 

다음은 계층구조(Hierachy)

게임오브젝트를 확인하거나 직접 만들 수 있습니다.

그리고 장면(Scene)에서 게임 오브젝트들이 보이게 됩니다.

 

마지막으로

 

게임오브젝트들을 선택하면 인스펙터(Inspector) 창에서 속성들을 확인할 수 있게됩니다.

 

스크립트 파일을 만드는 방법

 

프로젝트(project) 창에서 오른쪽 클릭 후 아래와 같이 클릭합니다.

 

새로 만들어진 C# script 입니다.

이제 이 스크립트를 더블클릭하면

 

비주얼 스튜디오가 켜지면서 코딩을 할 수 있게됩니다.

 

그리고 코딩을 하기전 중요한게 있습니다.

이 스크립트가 MonoBehaviour를 상속 받고 있는지 확인해야합니다.

만약 사진과 같이 MonoBehaviour 에 초록빛이 들어오지 않으면

코드를 똑같이 입력해도 인식이 되지 않습니다.

 

콘솔창에 메세지를 띄우는법

 

void Start()에 코드를 입력합시다.

void Start()
{
    Debug.Log("Hello World");
}

 

그리고 저장 후, (저장하는게 중요합니다.)

 

게임오브젝트를 아무거나 하나 만들어서 그대로 C# 스크립트를 드래그 해줍니다.

 

 

 

이제 본격적으로 C# 프로그래밍에 대해서 알아봅시다.

프로그래밍은

선언 > 초기화 > 호출(사용) 이 순서대로 흘러갑니다.

 

우선 변수에 대해서 알아봅시다.

 

변수란? 데이터를 메모리에 저장하는 장소입니다.

 

변수의 종류는 4가지가 있습니다.

 

int , float , string , bool

 

int : 정수형 데이터 (예: int level = 10 or 50 or 368...)  레벨이나 체력 숫자로 표현할때 사용
float : 숫자형 데이터 (예: float strength = 15.4f or 1.3f...) 
스텟이나 기타등등 소수점을 표현할때 사용 뒤에 f는 float형 이라는 것을 명시하는 것 
string : 문자열 데이터 (예: string playername = "김검사" or "나마법사"..) 주로 닉네임 같은걸 표현할때 사용
bool : 논리형 데이터 (예: bool isFullLevel = false) true 아니면 flase 값만 반환
주로 어떤 상태이냐 아니냐를 구별할때 사용 뭐 체력이 꽉찬상태다. 아니다. 등

void Start()
{
    Debug.Log("Hello World!");

    int level = 5;
    float strength = 15.5f;
    string playerName = "나검사";
    bool isFullLevel = false;

    Debug.Log("용사의 레벨은? " + level);
    Debug.Log("용사의 이름은? " + playerName);
    Debug.Log("용사의 힘은? " + strength);
    Debug.Log("용사는 만렙인가? " + isFullLevel);

}

 

다음으로 그룹형 변수에 대해서 알아보겠습니다.

 

먼저 배열입니다.

배열 : 가장 기본적인 고정형 그룹형 변수 (여러가지를 저장할때 사용)

 

void Start()
{

    string[] monsters = { "슬라임", "뱀", "악마" };
    int[] monsterLevel = new int[3];

    monsterLevel[0] = 1;
    monsterLevel[1] = 6;
    monsterLevel[2] = 10;

    Debug.Log("맵에 존재하는 몬스터의 레벨");
    Debug.Log(monsterLevel[0]);
    Debug.Log(monsterLevel[1]);
    Debug.Log(monsterLevel[2]);


}

 

그 다음은 리스트입니다.

리스트 : 기능이 추가된 가변형 그룹형 변수

 

리스트를 선언하고 초기화 하는 방법은

List<타입의종류> 리스트이름 = new List<타입의종류>();

 

리스트에 데이터를 넣는 방법은

 

변수.Add("추가할 내용"); 이렇게 사용합니다.

반대로 삭제할려면

변수.RemoveAt("변수의번호);

 

 

 

그리고 만약 리스트의 내용을 2개로 만들고

1개를 삭제 후 2개를 다시 출력하라고 하면 오류가 발생합니다.

왜냐하면 크기를 벗어난 탐색이여서 그렇습니다. (인덱스 오류)

인덱스 에러

void Start()
{
    List<string> items = new List<string>();
    items.Add("생명물약30");
    items.Add("마나물약30");


    Debug.Log("가지고 있는 아이템");
    Debug.Log(items[0]);
    Debug.Log(items[1]);
}

 

다음으로 연산자입니다.

----------------------------------------------------------

연산자

+ : 플러스(더하기) 
- : 마이너스(빼기) 
/ : 나누기
* : 곱하기
% : 몫이 아닌 나머지를 출력

----------------------------------------------------------

비교연산자

&&(AND) : 두 값이 모두 true일 때만 true 출력 (예: 나는 한국인이다 && 나는 인간이다 -> true)
||(OR) : 두 값 중에서 하나만 true이면 true 출력 (예: 나는 한국인이다 || 나는 인간이 아니다 -> true)
? A : B : true일때 A, false일 때 B출력

----------------------------------------------------------

void Start()
{

    int level = 5;
    float strength = 15.5f;
    string playerName = "나검사";
    bool isFullLevel = false;

    int exp = 1500;

    exp = 1500 + 320;
    exp = exp - 10;
    level = exp / 300;
    strength = level * 3.1f;

    Debug.Log("용사의 총 경험치는?" + exp);
    Debug.Log("용사의 레벨은?" + level);
    Debug.Log("용사의 힘은?" + strength);


    int nextExp = 300 - (exp % 300);
    Debug.Log("다음 레벨까지 남은 경험치는?");
    Debug.Log(nextExp);

    string title = "전설의";
    Debug.Log("용사의 이름은?");
    Debug.Log(title + " " + playerName);

    int fullLevel = 99;
    isFullLevel = level == fullLevel;
    Debug.Log("용사는 만렙입니까?" + isFullLevel);

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

    int health = 30;
    int mana = 25;

    bool isBadCondition = health <= 50 || mana <= 20;
    Debug.Log("용사의 상태가 나쁩니까? " + isBadCondition);

    string condition = isBadCondition ? "나쁨" : "좋음";
    Debug.Log("용사의 상태가 나쁩니까?" + condition);


}

----------------------------------------------------------

키워드 : 프로그래밍 언어를 구성하는 특별한 언어 

키워드를 변수 이름으로 사용이 불가능하고 값으로도 사용이 불가능합니다.

 

예를 들어 int float = 1; > 안됨

string name = list; > 안됨

 

다음으로 조건문 입니다.

 

조건문
----------------------------------------------------------

if : 조건이 true일 때 로직 실행
if (졸린상태일시) { 잠을잔다. }
else : 앞의 if가 실행되지 않으면 실행
else { 잠을 자지 않는다. } 

 

switch,case : 변수의 값에 따라 로직 실행

 

switch (변수 예: monsters[0]) {
case "슬라임" < 만약 슬라임이면
Debug.log("소형") < 소형으로 분류
break;
}

 

default : 모든 case를 통과한 후 실행

void Start()
{
    string[] monsters = { "슬라임", "뱀", "악마" };
    int[] monsterLevel = new int[3];

    monsterLevel[0] = 1;
    monsterLevel[1] = 6;
    monsterLevel[2] = 10;

    int level = 5;
    float strength = 15.5f;
    string playerName = "나검사";
    bool isFullLevel = false;

    int exp = 1500;

    exp = 1500 + 320;
    exp = exp - 10;
    level = exp / 300;
    strength = level * 3.1f;

    List<string> items = new List<string>();
    items.Add("생명물약30");
    items.Add("마나물약10");

    int health = 30;
    int mana = 25;

    bool isBadCondition = health <= 50 || mana <= 20;
    Debug.Log("용사의 상태가 나쁩니까? " + isBadCondition);

    string condition = isBadCondition ? "나쁨" : "좋음";
    Debug.Log("용사의 상태가 나쁩니까?" + condition);

    if (condition == "나쁨")
    {
        Debug.Log("플레이어 상태가 나쁘니 아이템을 사용하세요.");
    }
    else
    {
        Debug.Log("플레이어 상태가 좋습니다.");
    }
    
    if (isBadCondition && items[0] == "생명물약30")
    {
        items.RemoveAt(0);
        health += 30;
        Debug.Log("생명포션30을 사용했습니다.");
    }
    else if (isBadCondition && items[0] == "마나물약30")
    {
        items.RemoveAt(0);
        mana += 30;
        Debug.Log("마나포션30을 사용하였습니다.");
    }

    switch (monsters[1])
    {
        case "슬라임":
        case "뱀":
            Debug.Log("소형 몬스터");
            break;
        case "악마":
            Debug.Log("중형 몬스터");
            break;
        case "골렘":
            Debug.Log("대형 몬스터");
            break;
        default:
            Debug.Log("??? 몬스터가 출현!");
            break;
    }

}

----------------------------------------------------------

반복문

while : 조건이 true일 때, 로직 반복 실행

while (health > 0 <- 0이 될때까지) {
health-- <- 체력을 깎을때 -가 아니라 --를 사용
}

 

for : 변수를 연산하면서 로직 반복 실행

for(연산될 변수 ; 조건 ; 연산) {}

for(int count=0 ; count<10 ; count ++ {}
10번 반복


그룹형변수 길이 : .Length(배열) .Count(리스트)

foreach : for의 그룹형변수 탐색 특화

리스트 안에있는 자료를 1개씩 끄집어 내서 사용

void Start()
{
    string[] monsters = { "슬라임", "뱀", "악마" };
    int[] monsterLevel = new int[3];

    monsterLevel[0] = 1;
    monsterLevel[1] = 6;
    monsterLevel[2] = 10;

    int level = 5;
    float strength = 15.5f;
    string playerName = "나검사";
    bool isFullLevel = false;

    int exp = 1500;

    exp = 1500 + 320;
    exp = exp - 10;
    level = exp / 300;
    strength = level * 3.1f;

    List<string> items = new List<string>();
    items.Add("생명물약30");
    items.Add("마나물약10");

    int health = 30;
    int mana = 25;

    

    switch (monsters[1])
    {
        case "슬라임":
        case "뱀":
            Debug.Log("소형 몬스터");
            break;
        case "악마":
            Debug.Log("중형 몬스터");
            break;
        case "골렘":
            Debug.Log("대형 몬스터");
            break;
        default:
            Debug.Log("??? 몬스터가 출현!");
            break;
    }

    while (health > 0)
    {
        health--;
        if (health > 0)
            Debug.Log("독 데미지를 입었습니다." + health);
        else
            Debug.Log("사망하였습니다.");

        if (health == 10)
        {
            Debug.Log("해독제를 사용합니다.");
            break;
        }
    }
    for (int count = 0; count < 10; count ++)
    {
        health++;
        Debug.Log("붕대로 치료중..." + health);
    }
    for (int index = 0; index < monsters.Length; index++)
    {
        //Debug.Log("이 지역에 있는 몬스터 : " + monsters[index]);
    }
    foreach (string monster in monsters)
    {
        Debug.Log("이 지역에 있는 몬스터 : " + monster);
    }

 

함수 : 기능을 편리하게 사용하도록 구성된 영역

 

return : 함수가 값을 반환할때 사용

 

void : 반환 데이터가 없는 함수 타입

 

지역변수 : 함수 안에서 선언된 변수


전역변수 : 함수 바깥에 선언된 변수

 

변수를 가장 위에다가 선언해주면 아무데서나 사용가능

int health = 30; // 전역변수
int mana = 25;
int level = 5;
string title = "전설의";
string playerName = "전사";
float strength = 15.5f;
bool isFullLevel = false;
void Start()
{
    string[] monsters = { "슬라임", "뱀", "악마" };
    int[] monsterLevel = new int[3];

    monsterLevel[0] = 1;
    monsterLevel[1] = 6;
    monsterLevel[2] = 10;

    List<string> items = new List<string>();
    items.Add("생명물약30");
    items.Add("마나물약10");

    Heal();

    for (int index = 0; index < monsters.Length; index++)
    {
        Debug.Log("용사는 " + monsters[index] + "에게" + Battle(monsterLevel[index]));
    }
   
}
void Heal()
{
    health += 10;
    Debug.Log("힐을 받았습니다." + health);
}

string Battle(int monsterLevel)
{
    string result;
    if (level >= monsterLevel)
        result = "이겼습니다.";
    else
        result = "졌습니다.";
    return result;
}

 

 

클래스 : 하나의 사물(오브젝트)와 대응하는 로직

 

class : 클래스 선언에 사용

 

클래스를 새로 만들어봅시다.

 

다시한번 새로운 C# 스크립트를 만들고 이름을 Actor 라고 정의합니다.

 

그리고 상속 받고 있는 MonoBehaviour 를 지우고

위와 아래를 깔끔하게 제거합니다. 이렇게요

int id;
string name;
string title;
string weapon;
float strength;
int level;

string Talk()
{
    return "대화를 걸었습니다.";
}
string HasWeapon()
{
    return weapon;
}
void LevelUp()
{
    level = level + 1;
}

 

그리고 이 클래스를 다른 곳에서 사용하려면 접근자를 설정해줘야합니다.

 

int id 이 앞에는 private가 생략되어있습니다.

 

여기서 private는 외부 클래스에 비공개로 설정하는 접근자 입니다.

따라서 public 으로 바꿔줘야합니다.

 

public 은 외부 클래스에 공개로 설정하는 접근자입니다.

 public int id;
 public string name;
 public string title;
 public string weapon;
 public float strength;
 public int level;

 public string Talk()
 {
     return "대화를 걸었습니다.";
 }
 public string HasWeapon()
 {
     return weapon;
 }
 public void LevelUp()
 {
     level = level + 1;
 }

 

이제 클래스를 사용해봅시다.

 

클래스를 사용하려면

클래스이름 변수명 = new 클래스이름(); > 클래스를 하나의 변수로 만들어주게 됩니다.

이것을 인스턴스화 라고 합니다.

 

인스턴스란? 정의된 클래스를 변수 초기화로 실체화 하는 것

 

Actor player = new Actor();
player.id = 0;
player.name = "나법사";
player.title = "현명한";
player.strength = 2.4f;
player.weapon = "나무지팡이";
Debug.Log(player.Talk());
Debug.Log(player.HasWeapon());

player.LevelUp();
Debug.Log(player.name + "의 레벨은 " + player.level + "입니다.");

 

 

'Unity' 카테고리의 다른 글

Unity 2D 플랫포머  (0) 2024.11.23
Unity 기초 눌러담은 3D게임  (0) 2024.11.23
Unity(2) 기초2  (0) 2024.11.16