인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다.
[변수와 함수의 이해]
변수 : 값이 할당되는 이름, 게임도중에 얼마든지 접근해서 수정 가능
함수 : 미리 정해진 동작을 수행하는 코드 묶음
- 함수 내부에서 일어나는 일은 밖에서 알 수가 없기 때문에, return을 통해 결과값을 꺼내준다.
- 함수는 return 한 직후 종료된다.
- 반환하는 값의 데이터 타입을 앞에 명시해주어야 한다.(리턴 값이 없을때는 void)
- 함수는 입력값이 없을 수도 있다.
[콘솔 출력 + C# 기본 변수]
-C# 스크립크를 실행시키려면 오브젝트에 넣어주고 플레이를 눌러야 한다.
[콘솔출력]
- Debug.Log (using UnityEngine 에 들어있음) 를 사용한다.
- Clear on Play를 누른상태로 두면, 재생을 눌렀을때 과거에 로그들은 사라진다.
[C#기본변수]
* float : 소수점 아래 7자리까지만 정확하고 뒤에 f를 붙여야함, 32비트, 4바이트
* double : 소수점 아래 15자리까지만 정확, 64비트, 8바이트
* bool : true or false
* char : ' ' 안의 한 문자
* string : " " 안의 문자열, 문장
* var : 할당하는 값을 기준으로 타입을 결정(int도되고 float도되고 bool도 된다)
[사칙연산 + 복합연산자]
+ - * / % 기본 프로그래밍 사칙연산과 같다.
a += 2 는 a = a + 2와 같다
[함수 + 스코프]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Start()
{
float sizeOfCircle = 30f;
float radius = GetRadius(sizeOfCircle); // 함수 사용하여 계산
Debug.Log("원의 사이즈: " + sizeOfCircle + " 원의 반지름: " + radius);
}
float GetRadius(float size)
{
float pi = 3.14f;
float tmp = size/pi;
float radius = Mathf.Sqrt(tmp);
return radius; // float 리턴
}
}
- Mathf : 수학과 관련된 함수들이 들어있는 함수 집합
- Mathf.Sqrt(a) : a의 제곱근을 구하는 함수
[스코프]
함수는 { } 가 범위이다. 그 밖에서는 변수명이 같아도 별개다.(ex. 위에 float radius)
[형변환 + 조건문]
[형변환]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Start()
{
int height = 170;
float heightDetail = 170.3f;
// 암묵적 형변환
heightDetail = height; // 에러 x : 잃어버리는 정보가 없기때문
height = heightDetail; // 에러 o : 잃어버리는 정보가 있으면 자동 형반환이 안됨
height = (int)heightDetail; // 명시적 형변환 : 잃어버리는 정보가 있어도 형변환
}
}
[조건문]
if / else if / else
bool 타입을 C#에서는 True, False 로 출력한다.
[분기문 + 반복문]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
void Start()
{
int year = 2017;
// 분기문 switch -> if-else문과 일맥상통 한다
switch(year) // 기준이 될 변수
{
case 2012: // year = 2012인 경우
Debug.Log("레미제라블");
break;
case 2016: // year = 2016인 경우
Debug.Log("곡성");
break;
case 2017: // year = 2017인 경우
Debug.Log("트랜스포머5");
break;
default: // 어떠한 케이스에도 해당되지 않을 때.
Debug.Log("년도가 해당사항 없음");
break;
}
// 반복문
for (int i = 0; i < 10; i = i + 2) // 1. for i = 0, 2, 4, 6, 8 이렇게 5번 반복
{
Debug.Log("현재 순번: " + i);
}
Debug.Log("루프 끝");
bool isShot = false;
int index = 0;
int luckyNumber = 4;
while (isShot == false) // 2. while
{
index = index + 1;
if (index == luckyNumber)
{
Debug.Log("총알에 맞았다!");
isShot = true;
}
else
{
Debug.Log("총알에 맞지 않았다.");
}
}
do // 3. do-while. 처음 한번은 무조건 실행한다. while문은 조건문에 처음부터 맞지 않으면 아예 실행되지 않을 수도 있다.
{
Debug.Log("Do-while");
} while (isShot == false);
}
}
[배열]
int[] scores = new int[10];
new 키워드를 사용하여
이런식으로 배열을 선언한다.
[클래스와 오브젝트]
프로그래밍에서의 추상화(=클래스) / 구체화(=오브젝트)클래스를 만들어 추상화를 해두고 오브젝트로 찍어내어 구체화를 시키는 방식이다.
[클래스]
- 이상적인 세계에서 존재하는 원형, 하나의 기준
- 실제로 존재하지 않는다
- 구체적인 수치가 없다
- ex 강아지 라는 클래스
[오브젝트]
- 실제 존재하는 것들
- 자기 자신을 스스로 챙길 수 있다
- 하나의 온전한 단위
- 강아지라는 클래스에서 파생된 JACK, ROB, MIKE, POKE 이런 이름을 가진 실제 강아지들
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Animal // Animal 클래스
{
public string name; // 이름을 가지고 있다. public이어야 외부에서도 보고 사용할 수 있다. (디폴트 private)
public string sound; // 소리
public float weight; // 무게
}
public class HelloClass : MonoBehaviour
{
void Start()
{
// 객체들은 서로 구분되고 독립적인 존재들
Animal jack = new Animal(); // Animal 객체 "jack"을 찍어냄
jack.name = "JACK"; // name이 public이 아니였다면 에러
jack.sound = "Bark"; // sound가 public이 아니였다면 에러
jack.weight = 4.5f; // weight이 public이 아니였다면 에러
Animal annie = new Animal(); // Animal 객체 "annie"을 찍어냄
annie.name = "ANNIE";
annie.sound = "Wee";
annie.weight = 0.8f;
Animal nate = new Animal(); // Animal 객체 "nate"을 찍어냄
nate.name = "NATE";
nate.sound = "NYaa";
nate.weight = 1.2f;
nate = jack; // jack이 가지고 있는 정보를 nate에 덮어 씌운다.
nate.name = "JIMMY"; // jack의 이름까지도 바뀐다!!!
Debug.Log(jack.name);
Debug.Log(nate.name);
}
}
nate = jack 을 하면
Call by Reference 로 인해 nate.name = "JIMMY"으로 nate의 이름을 바꿔도 Jack 의 이름까지 바뀌게 된다.
jack이 혼자 가리키던 인스턴스를 nate도 같이 가리키게 됨으로써, nate의 값을 바꾸는 건 즉, jack의 값을 바꾸는 것이 되는 것이다.
여기서 그러면 원래 nate가 가리키던 인스턴스는 미아(가비지 콜렉션)가 된다.
C#은 가비지콜렉터가 작동하여 이런 가비지들을 정리하고 메모리 누수를 방지해준다.
변수는 오브젝트 그 자체값이 아니라, 오브젝트를 가리키는 이름표 라는 것을 기억하자.
[Call by Reference]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class jump : MonoBehaviour
{
public Rigidbody rb;
void Start()
{
rb.AddForce(0, 1000, 0);
}
void Update()
{
}
}
public Rigidbody rb
- public 으로 해두면 유니티 Inspector 창에 Rigidbody 컴포넌트 객체를 드래그 앤 드롭할 수 있는 슬롯이 열린다.
이 슬롯에 그 오브젝트에 붙어있는 Rigidbody 컴포넌트를 넣으면, rb로 컴포넌트에 접근 할 수 있는 것이다.
rb.AddForce(0, 1000, 0)
이런식으로 rb로 Rigidbody 컴포넌트에 내장된 Addforce 함수를 사용할 수 있다.
'Unity > 유니티강의1' 카테고리의 다른 글
Unity Chapter 4 - 3. 소코반 게임 만들기 : 오브젝트 회전 + 시간 간격 (0) | 2022.05.17 |
---|---|
Unity Chapter 4 - 2. 소코반 게임 만들기 : 레벨 디자인 (0) | 2022.05.17 |
Unity Chapter 4 - 1. 소코반 게임 만들기 : 초기 씬 구성 + 플레이어 조작 (0) | 2022.05.17 |
Unity Chapter 2. 게임 엔진의 원리 (0) | 2022.05.16 |
Unity Chapter 1. 유니티 준비하기 (0) | 2022.05.15 |
댓글