프로그래밍 농장

유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 3주차 학습 일지 본문

STARTERS

유데미 스타터스 유니티 개발자 1기 취업 부트캠프 - 3주차 학습 일지

Tennessee201 2022. 7. 10.
728x90

 

어느덧 2주간의 개발 기획에 대한 학습이 마무리되고 3주차부터는 직접적인 Unity 개발과 c# 프로그래밍에 대한 수강을 하였다.  

막상 Unity 개발과 c# 프로그래밍을 시작하려니 설렘과 긴장이 공존했지만 강사님께서 정말 이해하기쉽고 친절하게 강의를 진행해주셔서 학습에 많은 도움이 되었다. 

이번주에는 기본적인 Unity엔진에 대한 사용법에 들어가기 전, c# 프로그래밍 전반에 대한 기본개념과 구현방식, 그리고 현업에서의 개발방법 등. .  개발환경 전반에 대한 기반을 다지는 것으로 한주가 진행되었다. 

 


가장 첫번째로는 Unity 스크립트에서 가장 중요한 클래스 개념인 Monobehavior와, 유니티의 동작과정에서 수행되는 생명주기(LifeCycle)에 대하여 배웠다. 

유니티 프로젝트가 실행되면 크게 아래와 같이 4가지 동작을 메소드 호출 순서에 따라 수행하게 된다.

Awake() -> Start() -> Update() -> onDestroy()

 

유니티는 크게 위의 4가지로 구분되어 동작하며, 세부적으로는 Awake(), onEnable() (=setActive), Update() 이후에는 Trigger, Collision 과 같은 물리함수를 동작시키는 형식으로 구성되어 있다. 

https://daily50.tistory.com/397?category=1016478

각 호출 메소드의 특성에 대해서는 아래 접은글을 참조 !

더보기

1. Awake() 

- 스크립트가 실행될 때 단 한번만 호출된다.

- 모든 오브젝트가 초기화된 후에 호출되기 때문에 GameObject.Find, GameObject.FindWithTag 등의 명령어들을 

   안전하게 사용할 수 있다.

- Awake 함수는 항상 Start() 함수 이전에 호출되므로 초기화 순서를 정할 수 있게 된다.

- 코루틴(Coroutine) 사용이 불가능하다.

2. OnEnable()

- 인스펙터뷰에서 게임오브젝트를 활성화/비활성화를 체크한다. 즉, 체크(활성화) 되었을 때 호출된다.

- 만약, 게임오브젝트를 껐다가 다시 켜면, Start()는 불리지 않으므로 작동이 되지 않는다.

- 활성화/비활성화를 사용하고자할 때, 이 함수에 활성화되었을 때 일어날 코드를 넣는다.

3. Start()

- Update() 함수가 호출되기 전에 한번만 호출된다.

- 다른 스크립트의 모든 Awake()가 실행이 끝난 이후에 실행된다.

- 스크립트가 활성화되어 있어야만 호출되어 실행된다.

4. Update()

- 매 프레임마다 호출되는 함수이며, 게임 로직에 핵심적으로 사용된다.

- 스크립트가 활성화 되어있어야 사용이 가능하다.

- 일시적으로 사용하지 않으면 불필요하게 성능저하 발생 가능성이 커진다.

 

 


다음으로는 스크립트 직렬화에 대해서 배웠다. 

객체 지향 프로그래밍 (Object Oriented Programming)이 가지는 중요한 특성 중 하나인 캡슐화(Encapsulation)을 보장하기 위하여, 클래스(Class)의 구조를 정의하는 과정에서 '멤버 변수'의 접근제한자(Access Modifier)를 "private"으로 지정한다. 

c# Script의 클래스 멤버 변수를 "public"으로 지정함으로서, 유니티 에디터의 Inspector에서 해당 변수의 값을 쉽게 변경할 수 있도록 하는 경우가 있다. 이것은 예를 들어 난이도를 조정하기 위해 반복적으로 테스트해야 하는 상황에서 꽤 편리하다. 그러나 "public"을 남발하는 것은 다수의 인원이 협업을 통해 프로젝트를 진행할때 문제를 야기할 수 있다. 변경되지 말아야 하는 어떤 자료가 외부 객체로부터 변경될 가능성이 있기 때문이다. 

-> 이때 접근제한자 "private"을 통해 객체의 정보를 은닉하고, 캡슐화는 유지하며, 유니티 에디터의 Inspector에서 값을 변경할 수 있도록 사용하는 키워드가 바로 "[SerializeFiled]"이다. (= "스크립트 직렬화")

 

반대로 변수의 접근제한자가 "public"으로 지정되어 있지만, 유니티 에디터의 Inspector에서 노출되는것을 막기 위해서는  "[HideInInspector]" 키워드를 사용한다. ( HideInInspector 키워드는 키워드 아래에 있는 모든 변수를 노출하지 않지만, Serialized 키워드는 키워드 바로 다음에 있는 변수 1개만을 노출시킨다. )

 

-> 유니티 에디터의 Inspector에는 사용자가 정의한 클래스(Class) 또는 구조체(Stucture)의 정보가 Inspector에 노출되지 않는다. System에서 제공하는 "[Serializable]" 키워드를 지정하여 Inspector에 노출시킬 수 있다. 

위와 같이 사용자 정의 클래스의 윗줄에 "[Serializable]" 키워드를 붙이고, Monobehaviour를 상속받고 있는 C# 스크립트의메인 클래스에서 해당 클래스의 객체를 생성하면, 아래와 같이 Inspector에 노출되어 값을 지정 할 수 있게 된다.

 

스크립트 직렬화에 대한 더 자세한 포스트는 아래를 참조 !

https://daily50.tistory.com/400?category=1016478


이번주에는 총 2가지 과제(Assignment)가 주어졌다. 

 

첫번째로는 강사님께서 미리 구현해놓으신 tester.cs의 기능을 통해 요구하는 변수를 선언 및 특정 array값을 찍어서 확인후 대입하면 아래와 같은 Object가 출력되도록 하는 것이었다. 

그 결과 아래와 같은 Cube 3d object가 Grey 색상으로 출력되었다. 

TestDay01

 

두번째로는, LeagueofLegends 게임에서 제공하는 OpenAPI를 Json 파일로 c# 스크립트에 파싱하여 각 챔피언에 대한 속성들을 대입하는 과제였다. 

기본적으로 Json 파일에서 파싱되어 넘어온 Stats들은 전부 Serializable 형식의 클래스로 구성되어 있었고, 그중 우리가 뽑아올 값만을 참조해서 가져왔다. 

//Json parsing . . 
      ChampionClasses c = new ChampionClasses();
        c = JsonUtility.FromJson<ChampionClasses>(textAsset.text);

public class Stats
{
    public int hp;
    public int hpperlevel;
    public int mp;
    public int mpperlevel;
    public float movespeed;
    public float armor;
    public float armorperlevel;
    public float spellblock;
    public float spellblockperlevel;
    public float attackrange;
    public float hpregen;
    public float hpregenperlevel;
    public float mpregen;
    public float mpregenperlevel;
    public float crit;
    public float critperlevel;
    public float attackdamage;
    public float attackdamageperlevel;
    public float attackspeedperlevel;
    public float attackspeed;
}

일단은 각 챔피언에 대한 class를 만들어주고 이를 전부 champion class로 상속시켜주었다.  champion class에서는, 각 챔피언들에게 넣어줄 값 (HpV,HpRegenV,MpV. . ) 등을 선언하고, 이를 유니티 실행시 수행되는 GameObject에 넣어준 JsonManager.cs에서 직렬화(Serialized) 해준 ChampionClass 에서 참조한 값을 대입시켜주는 작업을 수행했다. 

 

이때 처음에는 foreach문을 돌며 각 champion의 name이 일치하면 값을 대입시키는 방식으로 구현하였지만, 스타터스 멤버들의 방식을 서로 소통하다 보니, 정말 다양한 방식들로 구현한 사례가 있었다. 그중에서 나는 대입 Method를 JsonManager에 별도로 구현하여 name이 일치할시 돌려주도록 하는 방식이 가장 간결하면서 보기좋아서 차용하였다. 

// ChampionClass에서 뽑아은 Json값을 넣어줄 함수선언

public void ImportChar(ChampionClass ch)
    {
        HpV = ch.stats.hp;
        HpRegenV = ch.stats.hpregen;
        MpV = ch.stats.mp;
        MpRegenV = ch.stats.mpregen;
        AtkDmg = ch.stats.attackdamage;
        Armor = ch.stats.armor;
        Name = ch.name;
    }

// 이름이 일치할시 함수를 수행하며 파싱된 값 대입

foreach (var ch in c.champs)
        {
            if (ahri.Name == ch.name)
            {
                ahri.ImportChar(ch);
            }
            else if (akali.Name == ch.name)
            {
                akali.ImportChar(ch);
            }
            else if (amumu.Name == ch.name)
            {
                amumu.ImportChar(ch);
            }
            else if (alister.Name == ch.name)
            {
                alister.ImportChar(ch);
            }
            else if (ashe.Name == ch.name)
            {
                ashe.ImportChar(ch);
            }
        }

 


 

이번주는 위와 같이 주로 C# 스크립트에서의 기능적인 부분과 유니티 에디터와 연계되는 기능 구현방식에 대한 전반적인 이해를 하는 시간을 가졌다. 

개발과 알고리즘에 있어 약하다고 생각했지만, 강사님께서 쉽고 이해하기 쉽게 접근하며 강의를 진행해주셔서 수강하는데 큰 어려움이 없었다. 또한, 같은 스타터스 멤버들간의 소통과 교류를 통해서 각자 몰랐던 부분이나 구현방식에 대한 다양한 관점과 시야를 넓힐수있어서 정말 좋았었다. 

앞으로 스타터스를 진행하면서 어려운 부분이 있겠지만 이번주처럼 스타터스 멤버들과 같이 공유하고 교류하면서 같이 성장해 나아가고싶다. 

 

강사님이 먹을걸 정말 잘사주신다😃

 

유데미코리아 바로가기 : https://bit.ly/3b8JGeD

 

Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea

유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.

www.udemykorea.com

본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.

 

#유데미, #유데미부트캠프, #취업부트캠프, #개발자부트캠프, #IT부트캠프, #부트캠프후기

728x90