반응형

현대에는 크건 작건 간에 우리는 게임을 한번이라도 접해본 세상에 살고 있습니다. 이러한 세상에서 게임을 하다보면, 게임을 직접 만들어보고 싶은 욕구가 생기기 마련입니다. 그래서 게임 만들기에 대해 한번 이야기하고자 합니다. 

 

1. 게임제작?


게임제작은 거창한 일이 아닙니다. 물론 우리가 잘 알고 있는 NC소프트에서 만든 게임이나, 블리자드에서 만든 거대한 스케일을 가진 게임을 본적이 있습니다. 그러한 게임들은 많은 사람이 모여서 만드는 큰 프로젝트일 수도 있지만, 뭐든 시작은 한 걸음부터입니다. 작은 게임에서부터 시작해서 점차 발전해나가는 것입니다. 초창기 게임들 또한 엄청나게 거대한 프로젝트로부터 시작된 게임은 없습니다. 시작은 작게 시작하다가 점차 커져서 (혹은 회사가 커져서) 큰 프로젝트를 하게 된 것이죠. 

리니지2
블리자드 게임들

다양한 게임이 현재에도 쏟아져 나오고 있습니다. 하지만 우리의 입맛에 맞는 게임이 없을 수도 있습니다. 그리고 친구와 하기 위한 간단한 게임을 제작하고 싶을 수도 있습니다. 다양한 목적에 따라 우리는 게임을 제작하고 만들게 됩니다. 이러한 수요를 위해 게임 제작 툴이 존재하며 복잡한 절차 없이 간단하게 게임을 만들 수 있습니다. 

 

2. 게임 제작 툴


  게임을 만들기 위해서는 다양한 게임 제작 툴을 이용할 수 있습니다. 물론 게임 제작 툴이 없더라도 만들 수 있지만, 초보자에게는 쉽지 않은 일이지요. 그래서 게임 제작 툴을 이용하면 여러 고생할 일이 확 줄어들어 스토리 전개에 집중할 수 있게 됩니다. 대표적인 게임 제작 툴은 Unity와 Unreal이죠.

 

(좌) 유니티, (우) 언리얼

유니티 엔진으로 만든 3d

 

언리얼 엔진으로 만든 3d

 

 

사실 유니티와 언리얼은 게임 제작 툴이기도 하지만 게임에서 사용되는 물리 엔진이기도 합니다. 두 물리엔진의 특성은 여러 차이점이 있습니다. 

  • 유니티가 언리얼 엔진보다 모델링 측면에서 유연성을 갖습니다. - 이는 반대로 이야기하면 모델링에서는 할 일이 많다는 소리죠.
  • 언리얼 엔진은 유니티보다 물리엔진에 대해 자유도가 높습니다. - 프로그래머의 역량만 된다면 언리얼 엔진은 무엇이든지 할 수 있는 신이 될 수 있는 것이죠.

  프로그래밍의 관점에서 유니티는 물리엔진에 대해 제약이 많은데 반해 언리얼 엔진은 자유도가 높아서 자유자재로 변형할 수 있습니다. 하지만 초보자에게는 이는 좋은 일이 아닙니다. 내가 무엇을 할지도 모르는데, 많은 자유를 주어져 봤자 쓰지도 못합니다. 그래서 만약 초보자가 처음으로 프로그래밍 관련, 그것도 게임 프로그래밍을 시작한다면 유니티 쪽으로 시작하는 것이 좋지 않나 생각이 듭니다. (물론 언리얼도 장점이 아주 많습니다. 하지만 초기 시작에 대해 너무 힘든 부분이 많은 것은 사실입니다. 그래서 처음 배우는 초보자에게는 유니티 쪽이 낫지 않나 생각해보는 것이죠. 어차피 하다보면 둘 다 배워둬야 하는 일이 생기기 마련입니다. ) 둘의 차이점은 조금 더 잘 정리된 여기를 보시면 되겠습니다. 

 

  일단 유니티와 언리얼에서 가장 중요한 라이센스의 차이점

  • 유니티의 경우, 일정한 수입이 있으면 유료 라이선스를 구매해야함 (기준 금액은 1억 매출 ( 정확히는 10만 달러))

[유니티는 10만~20만 달러이면 1년에 약 48만원, 20만 달러 이상이면 1년에 216만원이다. 자세한 여기]

  • 언리얼의 경우, 상업 용도로 사용하게 되면 일정한 비율 만큼의 로열티를 지불해야함 (11억이 넘을 경우(정확하게는 $1,000,000, 매출의 5%)

 

 

이외의 다른 게임 제작 툴도 존재합니다. 

등등이 존재합니다. 하지만 우리의 시작은 유니티로 시작하도록 할 예정입니다. 다양한 플랫폼을 커버하는 것과 동시에 게임 만들기에 대한 기본을 제대로 배울 수 있기에 유니티로 시작하려 합니다. 

[ +로 무료라는 강점이 너무 좋다는 점입니다. 다양한 장르의 게임을 만들 수 있기에 아주 좋습니다. 다른 게임 제작 툴 또한 좋은 점이 많지만 그래도 기본을 제대로 배울 수 있는 유니티를 쓰기로 하였습니다. 언리얼은 초보자가 하기에는 생각보다 복잡한 요소가 많기 때문에 이번에는 유니티입니다. 유니티가 모두 끝난 뒤에는 언리얼 엔진 도전하는 것도 좋은 일입니다. ]

 

3. 기본 언어?


 

  유니티나 언리얼이나 둘 다 기반 언어는 C++를 통해 제작되었습니다. 우리가 사용하고 있는 대부분이 C++로 제작된 것이 많기에 프로그래밍을 한다면 C++와 Java는 반드시 섭렵해야 합니다. 하지만 유니티를 활용해서 게임 제작할 때는 여러 요소를 걱정해야하는 C++를 사용하지 않습니다. 대신에 스크립팅 언어를 사용할 수 있습니다. C++보다 배우기 쉬우며, 사용하기도 쉬운 C#을 사용합니다.

 

  물론 C#만 사용해야 하는 것은 아닙니다. JavaScript로도 사용할 수 있지만, C#을 기반으로 배워보도록 할 예정입니다. 요새는 인터넷에서 많이 쓰이는 자바스크립트가 더 좋을 수도 있지만, 유니티는 C#을 오랫동안 사용되어져 왔으므로 C#을 통해 해보도록 합시다. (가장 큰 장점은 우리가 찾아볼 여러 레퍼런스가 많다는 점이죠. )

 

반응형
반응형

   형변환이란? 리터럴과 변수에는 기본적으로 타입이 있다. (정수형, 실수형, 문자형 등등) 하지만 프로그래밍을 하다보면 서로 다른 타입 간에 연산이 필요한 경우가 있다. 그래서 이러한 경우 타입을 변환해줘야 하는 경우가 생기는데, 이러한 경우에 행하는 연산을 형변환이라 한다. (타입을 일치시키기 타입을 변환시키는 것을 형변환이라 한다.)

 

   자바 컴파일러는 자동으로 형변환을 해줌으로써 프로그램을 자연스럽게 동작하게끔 만들어준다. 실상 형변환은 프로그래머가 신경써야 하는 일 중 하나지만, 그렇지 못할 경우 자동 형변환을 함으로써 편하게 만들어주지만, 이러한 편함 속에는 논리적 오류가 생기기 마련이다. 

 

그래서 이러한 형변환에 대해 간략하게 알아보도록 하자.

 

1. 형변환하는 방법


기본적인 형변환은 별로 어렵지 않다. 단순히 변수나 리터럴 앞에 변환하고자 하는 타입을 괄호 안에 넣어서 써주기만 하면 된다. 

int a = 10;
double b = (double)a;

int 타입의 a라는 변수를 double의 형변환을 한 뒤에 b에 할당하는 것이다. 

 

class Main {
    public static void main(String[] args) {
        int a = 10;
        double b = (double)a;

        System.out.println(a);
        System.out.println(b);
    }
}

실제로 출력을 해보면 출력 결과로 

10
10.0

으로 나오는 것을 확인할 수 있다. 정상적으로 형변환 됨을 확인가능하며, 형변환이 이루어진 int a는 형변환이 이루어지고 값이 할당된 뒤에는 값의 변화가 없는 것을 확인할 수 있다. (여전히 int형이다.)

 

기본적으로 형변환은 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다. 하지만 주의할 점이 있다. 실수형과 정수형에서는 기본적인 데이터를 표현하는 방법 자체가 다르기 때문에 데이터 손실이 발생할 수 있다.

 

2. 타입별 형변환


타입별 형변환에서 주의할 점은 데이터의 손실 가능성이다. int 형은 32비트, byte형은 8비트이다. 그렇다면 int형에서 byte형으로 형변환이 일어나면 데이터 손실 가능성이 있는 것이다. 

 

실제로 코딩을 통해 실험해보도록 하자. 

 

class Main {
    public static void main(String[] args) {
        int a = 10;
        byte b = (byte)a;

        System.out.println(a);
        System.out.println(b);

        a = 500;
        b = (byte)a;

        System.out.println(a);
        System.out.println(b);
    }
}

이 코드의 결과값은

 

10
10
500
-12

이러한 형태로 나온다. 초기에 값인 10을 입력할 때는 int와 byte에서 데이터 손실이 일어나지 않았지만, 두번째 값에서는 손실이 일어나고 있다. 이는 byte의 값의 범위에서 벗어난 범위를 넣었기 때문에 원치 않는 출력이 나오고 있는 상태이다. [ byte의 범위는 -128 ~ 127까지이며, 이 범위를 넘어서면 우리가 생각하는 값과는 다른 의도치 않은 값이 나올 수 있다.]

 

데이터 형에 따른 조금 더 자세한 형변환은 나중에 다루도록 하겠다.

 

3. 자동형변환


기본 형 변환은 다음과 같은 순서로 이루어진다.

이러한 형변환이 만들어진 이유는 데이터의 손실이 없는 방향으로 형 변환이 이루어진다. 일반적으로 타입에 따른 범위 내에서는 자동형변환이 일어나지만 범위를 벗어나는 데이터를 할당하려고 하면 오류 메시지를 보내준다. 

* 기본형과 참조형은 서로 형변환이 불가능하다.

 

예를 들어,

byte a = 10000;

byte의 범위인 -128 ~ 127을 넘는 범위를 저장하게 되면 오류메시지를 보내준다. 

java: incompatible types: possible lossy conversion from int to byte 를 자바 컴파일러가 보내주며, 오류가 났다고 명시해준다. 하지만 여기서 명시적 형변환을 지시해주게 되면 오류가 나지 않는다. 

 

byte a = (byte)10000;

이렇게 컴파일하면 컴파일 오류가 나지 않는다. 프로그래머가 의도한 오버플로라 컴파일러가 판단하는 것이다. 

 

또 다른 경우는 연산 과정에서 형변환이 자동으로 일어난다. 연산에서는 범위가 조금 더 넓은 범위로 형변환해서 타입을 일치시킨 뒤 연산을 시행한다. (이렇게 하는 이유는 범위가 넓은 쪽으로 형변환해서 연산해야 데이터의 손실이 가장 적어지기 때문이다.)

 

int a = 10;
double b = 10.0 + a;

a는 int형이지만, 실제로 계산할 때는 a가 double형으로 형변환한 뒤에 계산한다. 

 

만약에 최댓값에 대해 기억이 안난다면,

int i = Integer.MAX_VALUE;

를 사용함으로써 최댓값을 확인할 수 있다.

반응형
반응형

이번에 정리할 내용은 극한의 엄밀한 정의를 살펴보고자 합니다. 우리는 고등학교 때, 극한의 정의를 대략적으로 배웠습니다.

그래서 고등학생 때에는 무리 없이 사용했습니다. 하지만 이는 명확한 정의가 아닙니다. 이유는 특정값에 접근할 때, L에 가까워진다. 에서 가까워짐이란 단어가 정확히 어느정도 가까워지는지에 대해 기준이 없기 때문입니다. 그래서 우리는 이러한 명확하지 못한 '가까워진다'라는 단어를 바꾸어서 표현하려 합니다.

 

1. 극한?


위에서 표현한 방식이 틀린 말은 아닙니다. 극한의 원래 사용은 특정 값에 가깝게 가면(x에서), 어떤 값(y의 값)으로 다가가는 것이 맞는 표현입니다. 극한을 사용한 이유도 

 

실제로 이 함수에 대해 그래프를 그려보면 다음의 그림과 같다.

x=2에서 y=3의 값이 빠져있는 것을 볼 수 있다.

함수가 초기 상태에서 정의역을 결정하기 때문에, 정의역 값에서 2가 빠져있는 것이다. 그에 따라 y의 값인 3이 빠져야 하는 것이다. 그런데 위의 그래프를 보면, x=2일 때, y=3임이 분명해보인다. 그래서 (2,f(2) = 3)의 값을 표시하고 싶은데, 함수의 정의에 따르면 이를 수학적 기호로 표시하기 어렵다. 

 

그래서 정확히 f(2)의 값은 없지만 그곳에 가깝게 가면 f(2) = 3이 되는 값을 표현하기 위해 극한을 정의하게 된 것이다. 

 


이제 극한을 사용하는 이유에 대해 간략하게 살펴보았으니, 예시를 통해 엄밀한 정의를 정의해보도록 하자.

 

우리의 예시는 

를 가지고 설명해보도록 합시다. 일단 이 극한의 답은 5라는 사실을 알고 있다.

2. 거리를 절댓값으로 정의하자.


  절댓값은 거리를 표시하기 위한 기호이다. 그러므로 우리도 절댓값으로 구해보도록 하자. 일단 x가 2에 접근할 때, 그에 따른 함숫값인 f(x)는 어떤 값에 가까워지는지를 수식으로 표시해보도록 하자. 

  그렇다면 가깝다는 표현대신에 실제적인 수치를 통해 살펴보도록 하자. 가깝다고 하니 인간이 느끼기에 가까워지는 값인 0.1 정도로 생각해보자. 

 

이러한 상태를 갖는다. 여기서 사용된 기호는

으로 사용된다. 여기서 위의 식을 만족하는 델타를 찾는 것이 목표인 것이다. 그런데 우리는 x=2일 때의 값을 원하는 것이 아니기 때문에 x=2가 되는 형태는 피해야 한다. 그래서 위의 식에서 x = 2일 때를 빼야 한다. 물론 x는 2가 아니란 말이 있지만, 말이 길어진다. 그래서 하나의 수식으로 표현하기 위해서 수식을 조금 변경해보자.

 

로 바꿔볼 수 있겠다. 이를 한 눈에 보기 쉽게 그래프로 생각해보도록 하자..

 

이런 느낌으로 사용할 수 있을 것이다. 그렇다면 이를 만족하는 델타를 구해보도록 하자.

 

이런 느낌으로 써볼 수 있을 것이다. 우리는 델타를 추정한 것이다. 이를 바탕으로 검증해보면, 

이 될 것이다. 이를 계속해서 같은 방식에 따라 늘려가도 비슷한 값이 계속해서 나올 것이다. 

 

 

이렇게 나올 것이며, 마찬가지로 

 

이러한 형태를 갖게 된다. 그러면 이렇게 수를 계속해서 줄여나가면 언젠가는 엄청나게 작은 값을 가지는 값에 따라 y의 값도 특정 값에 가깝게 갈 것이다. 이를 델타와 입실론을 활용해서 써보면 될 것이다. 

 

3. 그리고 입실론 델타 용법으로 표현


 

이러한 값을 갖게 되며, 위와 마찬가지로 결론을 내릴 수 있다.

절댓값의 성질에 따라 풀어준 뒤 그래프로 표현해보도록 하자.

이런 느낌의 그래프를 사용할 수 있을 것이다.

말로 표현하면, 

 

이를 통해 극한의 엄밀한 정의를 이야기하면,

여기서 A가 거꾸로 뒤집힌 문자는 For all (모든)을 의미하며, E가 좌우가 바뀐 문자는 Exist(존재하면, 혹은 어떤)이라는 의미한다. 

 

위의 말은 우리가 고등학교 때 배운 말로 바꾸자면, x가 특정 a에 가깝게 가면( 이를 다르게 표현하면 x와 a 사이의 거리를 충분히 가깝게 하면) f(x)와 L의 거리를 임의로 작게 만들 수 있음을 말한다.

 

반응형

'수학 > 미적분' 카테고리의 다른 글

[미적분] 미적분 카테고리  (0) 2021.03.17

+ Recent posts