본문 바로가기
유니티5 독학 & 게임 제작

유티니5독학하기 그3번째 걸음-조금씩 난관이 보이기 시작합니다.

by 인터넷떠돌이 2017. 5. 23.
반응형

안녕하세요?


미리 말을 한다는 것을 잊어버리고서 이야기를 안 했는데, 독학을 한다고 해서 그냥 아무 문서나 막 보고 하는 것이 아니라, 서적을 구매해서 그 책을 보면서 독학을 하고 있습니다. 이번에 유니티5의 독학에 쓰인 책은 [실전! 유니티5로 소셜 네트워크 게임 만들기]라는 책을 집어서 맨땅에 헤딩을 하는 심정으로 하고 있습니다. 


먼저 이전에 제작을 하였는 Test.cs라는 스크립트를 다음과 같이 수정을 가합니다.



이렇게 수정을 가한 이유는 바로 이전에는 10+10의 값으로 20만이 출력되었는데, 이번에는 30+30의 값으로 총 60의 결과값을 얻고자 하는 것이였습니다. 하지만 결과는 제 기대와는 다르게 여전히 20만이 출력되고 있었습니다. 그래서 하는 수 없이 아래와 같이 추가적인 코딩을 하였습니다.



기존의 10+10이라고 되어 있던 곳을, a+b라고 두었습니다. 그러자 아래와 같이 의도한 대로 30+30의 값이 나오는 것을 볼 수 있었습니다.



왜 이렇게 되었느냐 하니, 일단 함수에 대해서는 책에서는 다음과 같이 설명을 하고 있었습니다. 



여기서 void라는 것은 함수의 타입으로, 그냥 아무런 뜻이 없을 때 붙는 것을 의미합니다. 다만 여기서 int같은 형식이 붙으면 정수만을 취급한다는 의미가 오게 됩니다. 그리고 여기서 제가 밑줄을 친 전달값, 즉 ( ) 안에 들어가는 값이 제가 집어 넣고자 하는 값인데, 여기서는 30과 30이 들어갔으니 a+b = 30 + 30 해서 60이라는 결과값이 나오게 되는 것입니다.



다음으로는 상속이라는 개념이 있는데, 위 스크린샷에 보시면 아래에 Test : MonoBehaviour 것으로 클래스 명이 시작하는 것을 볼 수 있습니다. 이 : 옆에 붙은 MonoBehaviour 라는 의미는 바로 부모 클래스라는 의미입니다. 즉 Test : MonoBehaviour라는 의미는 MonoBehaviour라는 부모 클래스를 상속받은 Test라는 클래스라는 의미입니다.


여기 위에 있는 스크린샷에 있는 붉은 박스 않에 있는 구문은 바로 MonoBehaviour라는 부모 클래스를 상속받지 않는 Child라는 클래스를 정의한 것입니다. 다만 이렇게 클래스만 작성해서는 아무런 일도 일어나지 않는 다는 것이 문제입니다.



그래서 위 스크린샷처럼 void start() 안에다가 코딩을 했습니다. 이렇게 해서 코딩을 한 다음 모노 디벨롭에서 다시 유니티5로 돌아온 다음 실행시켰더니 다음과 같은 결과를 얻었습니다.



위와 같은 경우는 에러가 발생했다는 의미인데, 이 에러가 발생한 이유는 바로 Call()이라는 메서드에 대해서 접근이 되지 않아서 발생하였단느 의미를 나타내고 있습니다. 그래서 코딩을 하면서 이번에는 Call()이라는 메서드 앞에 public을 붙이도록 하였습니다.



위 스크린샷처럼 Child라는 클래스 안에서 Call()이라는 메서드가 있는데, 이 메소드에 대해서는 공개적으로 접근이 가능하다고 정해놓으면, 다음과 같이 에러가 없는 상태로 결과를 얻을 수 있습니다.



이제서야 제가 의도한 대로 문구가 출력이 되는 것을 볼 수 있습니다. 처음에 저도 실습을 하면서 왜 이러는 지를 몰랐는데, 다음과 같은 설명을 보고서야 이해가 되었습니다.



클래스명은 당연 어느 클래스를 사용할 것인지를 나타낸다고 할 수 있습니다. 그리고 변수이름은 아무것이나 가져다 붙여도 상관은 없습니다만, 이후에 들어오는 생성자 함수는 대문자로 시작했으면 클래스명과 맞춰야 할 필요성은 있어 보입니다. 이를 해석하면 뒤에오는 생성자 함수인 Child ()라는 것을 새로 생성하라는 의미가 됩니다.


이는 마치 이전에 안드로이드 스튜디오를 공부하면서 보았는 인텐트를 생성하는 구조와 어느정도 유사함이 있는 것을 볼 수 있었습니다.


Intent 변수이름 = new Intent();


이처럼 Start()라는 함수가 실행이 될때, 위 구문은 바로 Child()라는 함수를 생성해서 사용하라는 의미가 됩니다. 그것도 Child라는 클래스 내에서 꺼내서 쓰라는 의미가 되게 됩니다.


Child child = new Child();

child.call();


여기서 아랫쪽에 온 child.call()은 child라는 변수-결과적으로 이 변수는 Child라는 클래스를 의미하기도 합니다. 그리고 .Call()의 의미는 바로 앞에 있는 Child라는 클래스 안에서 Call()이라는 함수를 찾아서 사용하라는 의미입니다. 일단 제가 이해가 되는 범위는 여기까지 입니다.



다음은 기존에 이미 지정한 값이 아니라, Test클래스 안의 Child()라는 메서드에서 값을 지정하면, 그값이 출력이 되도록 하는 코딩을 만들기 위해서 Child 클래스를 변형하였습니다. 그리고 나서 모노 디벨롭에서 저장을 한 다음 유니티5에서 실행을 시키자 다음과 같은 결과를 얻었습니다.



여기서 에러의 의미는 Child()에서 입력되어야 하는 값이 입력되지 않았다는 의미가 됩니다. 결국 이를 수정하기 위해서 다음과 같이 Test.cs의 29번째 줄에 문자열(string)값을 입력해 주어야 합니다.



여기서는 Unity Kim이라고 입력을 하고나서, 이번에야 말로 유니티5에서 실행을 시켰을 때 제대로 된 결과가 나오는 지를 살펴 보았습니다.



이번에야 말로 제대로 의도한 대로 나오는 것을 확인할 수 있었습니다. 아참 깜빡하고 설명을 잊었는데, 왜 Child 클래스에서는 print()라는 메서드를 안 쓰냐 하면, 바로 print() 메서드는 MonoBehaviour 클래스를 상속해야만 사용이 가능하다고 합니다. 그래서 하는 수 없이 출력을 위해서 Debug.Log()라는 함수를 이용할 수 밖에 없었다고 합니다.


제가 말은 들어 보기는 했지만, 클래스의 상속이 본격적으로 나올 줄은 몰랐습니다. 이쪽까지는 제가 안드로이드 스튜디오를 독학했을 때도 말만 들어봤지 실제로 보기는 처음인데, 아무튼 책에서 이걸로 코딩에 관해서는 집중적으로 설명하는 파트는 넘어갔다는 생각이 듭니다. 하지만 앞으로도 이렇게 빠르게 배울 수 있을지는 장담할 수 없다는 생각이 듭니다.

반응형