본문 바로가기
Unity/유니티강의1

Unity Chapter 3. C# 프로그래밍 : 기본

by 싸비비 2022. 5. 17.

인프런에 있는 이제민님의 레트로의 유니티 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 함수를 사용할 수 있다.

댓글