유튜버 "골드메탈"님의 강의를 보고 공부했습니다.
https://www.youtube.com/watch?v=7plGPXkmnxQ&list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2
설치과정은 유튜브에 자세히 나와있으니까 생략합니다.
유니티는 인터페이스가 기본적으로 4개로 구성되어있습니다.
게임을 구성하는 파일들. 그래픽,사운드등은 프로젝트(project)에 들어갑니다.
다음은 계층구조(Hierachy)
게임오브젝트를 확인하거나 직접 만들 수 있습니다.
그리고 장면(Scene)에서 게임 오브젝트들이 보이게 됩니다.
마지막으로
게임오브젝트들을 선택하면 인스펙터(Inspector) 창에서 속성들을 확인할 수 있게됩니다.
스크립트 파일을 만드는 방법
프로젝트(project) 창에서 오른쪽 클릭 후 아래와 같이 클릭합니다.
이제 이 스크립트를 더블클릭하면
비주얼 스튜디오가 켜지면서 코딩을 할 수 있게됩니다.
그리고 코딩을 하기전 중요한게 있습니다.
이 스크립트가 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 |