본문 바로가기

IT/유니티

7. 유니티 교육 (유니티 기본2)

1. 외부객체 사용하기


유니티를 하다보면, 외부 3D객체를 사용하고싶을때가 있는데,

아주 간단하게 사용할수있다.


3DMax나 Maya로 만든 객체를 추출한후 그냥 유니티의 애셋에다가 카피하면 바로 사용할수 있다.

하지만 객치를 그저 객체일뿐이니가 충동체크라든지 이외의 현상은 직접 수정해주어야 한다.


간단하게 만들어보면,

우선 강을 만든다. 

강은 지형을 전체적으로 높인후, 강이 갈 길만 shift를 누르고 클릭해서 낮쳐준다.

그런후 기본 애셋에서 물을 선택히 추가해주면 마치 강처럼 보이게 만들수 있다.


그리고 그 강위에 3DMax로 만든 다리를 가져다 놓으면 보기에는 완벽해보이나,

직접 캐릭터를 조정해서 움직여보면 물리현상이 들어가 있지 않다.


외부객체에 물리현상을 구현시키는방법은 아주 쉽다.

외부객체를 클릭후 inspector에서 add Component를 클릭한다.

그안에 physic안에 Box collider를 클릭하면 다리모양으로 충돌체크를 할수 있다.

(역시 엔진이 편하다..-.- 아 이걸 다 예전에 일일이 코딩으로 다 했다니...

지금생각해도 숨맊인다....)







2. 통나무와 모닥불


게임에서 항상 등장하는 통나무와 모닥불을 간단하게 만들어보자.


통나무는 게임오브젝트에서 실린더를 이용하면 간단하게 만들수 있다.

실린더를 생성후 나무껍질의 텍스쳐를 입히면 끝!!


모닥불은 게임오브젝트에서 파티클시스템으로 구성할수있다.

파티클시스템은 작은 객체들을 일정방향으로 지속적으로 쏘아주는것인데,

이 쏘아주는 객체를 불 텍스쳐로 material를 만들어서 넣어주면 된다.

하지만 단순히 넣는것이 아니라 세이더를 파티클의 additive로 설정을 바꾸어주어야 한다.

파티클의 설정중 size over lifetime이나 texture sheet animation을 잘 조정해보자





3. 통나무를 들어보자


통나무를 만들었으니, 이제 이 통나무를 들어보자!

통나무를 들기위해서는 스크립트가 필요한데, c#이든 java든 원하든데로 사용하면된다.


코드는 다음과 같다..

public Transform target;


    void OnMouseDown()

    {

        this.transform.position = target.position;

        this.transform.parent = GameObject.Find("FPSController").transform;

        this.transform.parent = GameObject.Find("FirstPersonCharacter").transform;

    }


    void OnMouseUp()

    {

        this.transform.parent = GameObject.Find("FPSController").transform;

        this.transform.parent = null;

    }



트랜스폼은 좌표정보클래스라고 생각하면 된다.

마우스를 클릭다운하면, 타겟의 위치정보를 자신의 위치정보에 넣는다. 

그런 어떻게 될까? 그렇다 현재 자신의 위치가 타켓의 위치로 이동할것이다.

그리고 자신의 부모위치정보도 넣는데 확실하지는 않지만 통나무의 방향등을 위해서 그런거 같다.

클릭이 끝나면, 자신의 부모위치정보를 끊으므로써 움직임이 멈춘다.



이 위의 스크립트를 통나무 객체에 드래그에 넣으면, 타켓이 퍼블릭이므로 지정가능하다.

이 타겟을 캐릭터객체의 조금 앞쪽에다가 넣어두면, 통나무를 들었을때 그 통나무의 위치를 지정할수있다.





4. 동전과 울타리를 만들어보자.


이번에는 울타리를 만들어보자!

울타리 객체를 가져와서 레고처럼 조립만 하면된다. 

하나하나하기 힘들면 다 같이 묶어서 하면 편하다.

다리를 만들때도 언급했지만, 객체는 아무런 충돌체크도 하지 않기 때문에,

울타리가 울타리처럼 작용하려면 박스콜리젼를 추가해야만한다.(add component -> physics -> box collider)


그리고 동전은 통나무처럼 실린더를 이용하면된다. 걍 납짝한 실린더에 노란색을 입히면 동전!

그리고 그 동전앞에 게임오브젝트에 포이트라이트를 밝은 노란색으로 두면 빛나는거처럼 보인다.


그리고 이 동전을 회전시키려고 하면 간단한 스크립트를 추가한다. 


void Update () {

        this.transform.Rotate(0, -10, 0,Space.World);

}


자신의 위치정보를 가져와서 rotate즉 회전을 시킨다.





5. 동전먹기와 워프


위에서 동전을 왜 만들었을까?

모든 게임에서 동전은 먹기위해이지 않을까?ㅋㅋㅋ

그럼 동전먹기를 해보자!

이것또한 아주 간단한 스크립트로 만들수 있다.


충동를 체크하기 위해서는 다음함수를 추가한다.

void OnTriggerEnter(Collider col)


함수이름은 위와 같고 인자는 충동한 놈의 정보이다.


위의 함수를 추가하고 단순히 

Destroy(gameObject);

이것을 추가한다.


이것만 가지고도 동전먹기가 되지만, 위에서 동전을 번쩍이게 하려고 

포인트 라이트도 동전옆에 이쁘게 놓지 않았는가?

그럼 이 라이트도 동전을 먹을때 같이 없어주어야 말이 된다.

그럼 다음을 하나더 추가한다.


Destroy(GameObject.Find("coinLight001"));

게임오브젝트중 coinLight001을 찾아서 제거하는 문장이다.



그럼 동전먹기도 되었으니, 환타지 게임의 기본중에 기본! 바로 워프를 만들어 보자.

워프는 어쩌면 동전먹기보다도 단순하다.

단순히 위치정보만 바꾸어 주면 되니까 말이다.

스크립트는 다음과 같다.


public Transform warpTarget;


void OnTriggerEnter(Collider col)

    {

        if(col.gameObject.tag == "Warp001")

        {

            this.transform.position = warpTarget.position;

        }

    }




간단하지 않은가? 충동체크를 하는데 충돌한 놈이 warp001이라면,

자신의 위치를 워프타켓으로 놓아라!

뭐..이건 나모웹에디터로 홈페이지 만드는것보다도 쉽다.


여기서 중요한것은 warpTarget을 설정해놓는것이다.

이 타겟은 아마도 워프의 도착점이 될것이다.


그리고 동영상 강사도 실수했는데, 이 스크립트는 과연 어디에다가 놓아야 될까?

워프?

절대 아니다. this.transform의 포지션을 바꾸기때문에 이 스크립트는

캐릭터가 가지고 있어야만 한다.






6. 동전스코어 화면에 표시하기


public static int coinCollect = 0;


    void OnGUI()

    {

        GUI.Label(new Rect(10, 10, 90, 40), ("Coins: " + coinCollect));


    }


스크립트 간에도 전역변수를 퍼블릭으로 선언하면 

다른 스크립트에서도 사용가능하다.

충격적이라는!!





7. 집만들어서 충동체크 적용하기


단순히 오브젝트는 가져와도 충돌체크를 하지 않기때문에 그냥 통과한다.

단순한 박스나 구는 쉽게 할수 있지만, 조금 복잡한 집모양은 박스콜리젼을 여러개 만들어서 

마치 진짜 집처럼 충돌체크를 적용하는것이 중요하다.







코인을 여러개 만들었는데, 단순히 duplicate해서

근데 아래 코드를 보면, 라이트001을 찾아서 지우는데,

내생각에는 복사한 애들도 다 같이 지워져야 맞을거 같은데 

각자 자신들의 라이트만 지운다.


void OnTriggerEnter(Collider info)

    {

        Destroy(GameObject.Find("coinLight001"));

        Destroy(gameObject);

        coinLB.coinCollect += 1;

    }