ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 오브젝트 복제 / 복사하기 Instantiate 총알쏘기
    유니티(Unity)/유니티 코딩 2019. 2. 23. 13:30

    해당 티스토리 페이지는 필자가 유니티 C# 개발을 하면서 학습한 내용들을 기록하고 공유하는 페이지입니다 !

    - 틀린 부분이 있거나, 수정된 부분이 있다면 댓글로 알려주세요 !

    - 해당 내용을 공유 or 퍼가도 좋으나, 출처를 꼭 명시해주세요 !

    - 해당 글의 모든 저작권은 Chameleon Studio에 있습니다.

    - 방문해주셔서 감사합니다 ^^




    오늘은 오브젝트를 복제하는 자산인


    Instantiate를 사용해보려고합니다.


    게임을 만들다보면 같은 내용을 가진


    오브젝트들을 복제하여 간편하게


    사용하고 싶을 때가 있습니다.


    예를 들면,


    총알이라던지,


    같은 이미지를 가진 적군이라던지,


    이미지는 다르더라도 같은 스크립트를


    가진 적군 또는 물체들 등등


    다양하게 복사하여 사용하고 싶습니다.


    이를 간단하게 해결해주는 자산이 바로


    Instantiate입니다.


    오늘은 두 가지를 해보려고합니다.


    첫 째로는 젤랑이를 복사하여


    일렬로 분신술을 세우는 것이고,


    두 번째로는 젤랑이를 복사하여


    총알처럼 위로 발사하는 것입니다.


    Instantiate 사용하여 간편하게 구현해봅시다.


    우선 여러분의 프로젝트를 열어주세요.


    세팅부터 합시다.



    프로젝트를 연 이미지입니다.프로젝트 열기



    프로젝트가 열렸으면


    세팅을 해봅시다.


    저는 우선 젤랑이 오브젝트를


    하나 만들어두었습니다.


    여러분도 빈 오브젝트를 하나 만드시고


    스프라이트를 넣어주세요.



    스크립트 넣는 이미지입니다.오브젝트에 스크립트 넣기



    다음으로 스크립트를 넣어주세요.


    저는 PlayerScript라고 이름을 짓고


    젤랑이 오브젝트에 스크립트를 넣었습니다.


    이 스크립트에서 Instantiate 사용해서


    젤랑이 분신술을 해보려고합니다.



    Instantiate 오브젝트 생성 이미지입니다.Instantiate 오브젝트 생성



    다음으로 오브젝트를 하나 더 만들어주세요.


    저는 Instantiate라고 이름 짓고 오브젝트를 하나 만들었습니다.


    이 오브젝트가 바로 젤랑이의 분신들입니다.


    분신 설정만 한 번 해준다면,


    얘네들을 무한으로 복사할 수 있습니다.


    저는 이 오브젝트에 젤랑이와 똑같은


    스프라이트를 넣었습니다.


    인스펙터 창을 보시면 젤랑 스프라이트가


    Sprite Renderer의 Sprite에 들어간 것이 보이시죠.


    그 다음 스크립트를 하나 만들어서 넣어주세요.


    요놈 스크립트는 InstantiateScript라고 이름 짓고 넣었습니다.


    여러분은 스크립트 명을 굳이 따라하지 않으셔도 됩니다.


    여러분이 원하는 스크립트 명을 짓고


    Instantiate 오브젝트에 넣어주세요.


    오브젝트 세팅이 끝났다면,


    코드를 입력하러 갑시다.


    젤랑이에게 달린 PlyaerScript를 열어줍니다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    위 코드를 스크립트에 넣어주세요.


    코드 설명을 덧붙히자면,


    public GameObject prefab;


    빈 게임오브젝트 칸을 하나 선언해줍니다.


    여기는 아까 만든


    Instantiate 오브젝트를


    프리팹화 시켜서 넣어주려고 합니다.


    앞으로 복사될 분신을 넣어주는 것이죠.


    다음으로 Start문에서 for문을 돌려서 분신술을 실행합니다.


    for (int i = 0; i < 10; i++)


    for문은 여기서 설명하지 않겠습니다.


    생소하신 분들은 >여기<에서 확인해주세요.


    젤랑이 10명을 소환해봅시다.


    Instantiate(prefab, new Vector3(transform.position.x + 2f * i, transform.position.y, transform.position.z), Quaternion.identity);


    바로 이 코드로 말이죠.


     하나하나 뜯어보자면,


    Instantiate(prefab


    아까 복사될 Instantiate 오브젝트를


    new Vector3(transform.position.x + 2f * i, transform.position.y, transform.position.z)


    젤랑이의 X 위치에서 + 2씩만큼 일렬로


    Quaternion.identity


    사원수 값은 젤랑이와 똑같이 정렬한다.


    라는 코드입니다.


    다시 말해서,


    "젤랑이 오른쪽으로 일렬로 줄서서 소환되어라"


    라는 뜻입니다.


    이제 확인을 위해 유니티로 돌아가봅시다.





    유니티의 실행 버튼을 누르기 전에


    우리는 한 가지 먼저 해주어야 할 것이 있죠.


    아까 선언한 prefab 오브젝트 칸을 채워줘야합니다.


    영상을 보시면,


    아까 만들어 두었던 Instantiate 오브젝트를


    에셋 폴더에 집어넣습니다.


    그러면 파란 상자 모양이 달린 프리팹이 생성됩니다.


    요놈을 끌어다가 젤랑이 스크립트에서 만들어두었던


    prefab 에 넣어줍시다.


    그리고 Instantiate 오브젝트는 하이어라키 창에


    있을 필요가 없으니 지워줍니다.


    Instantiate 오브젝트를 지워도


    prefab은 사라지지않고 보존됩니다.


    이제 실행을 눌러봅시다.





    실행을 누르니 젤랑이들이 소환됐습니다.


    하지만, 젤랑이의 위치 X값이 0이기 때문에


    화면상에선 5명밖에 보이지 않네요.


    사실 화면 밖에 나머지 젤랑이들이 더 있습니다.


    젤랑이의 위치 X를 -8로 움직여서 실행해볼까요?



    젤랑이 위치 변경 이미지입니다.젤랑이 위치 변경



    -8로 옮겼습니다.


    실행을 눌러봅시다.





    뒤에 한 명이 더 있지만


    어느정도 젤랑이들이 다 보이네요.


    이럴 땐 위치를 조절하면 됩니다.


    아까 스크립트에서


    new Vector3(transform.position.x + 2f * i


    2f를 1.5f 또는 1f로 바꾸면


    젤랑이들이 다 보일 것입니다.


    따로 여기서 해보지는 않을테니,


    궁금하신 분들은 스크립트를 수정하시고


    확인해주시면 됩니다.



    복제한 Instantiate들 이미지입니다.복제한 Instantiate



    근데 게임을 실행해보니


    Instantiate 오브젝트가 소환되어 나오는데


    (Clone)이라고 되어있습니다.


    이것의 의미는 복제되었다는 소리입니다.


    자동으로 복제된 오브젝트는


    Clone이 달려서 나옵니다.


    근데 이 복제한 애들을


    젤랑이 안에 넣고 싶을 수가 있습니다.


    방법이 있습니다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    이런 식으로 맨 뒤에


    transform


    을 넣어주시면 됩니다.


    맨 마지막 부분은 부모를 설정하는 자리입니다.


    Instantiate의 첫 번째 자리 = 복제할 프리팹

    Instantiate 의 두 번째 자리 = 복제한 프리팹들의 위치

    Instantiate 의 세 번째 자리 사원수의 값

    Instantiate 네 번째 자리 부모의 설정


    이렇게 생각하시면 편합니다.


    Instantiate의 사용법은 이것 외에도


    몇 가지가 더 있습니다.


    하지만 오늘은 제일 기본이 되는 것으로


    감을 익혀봅시다.


    이렇게 transform으로 복제한 프리팹을


    젤랑이 자기 자신의 자식으로 두게했습니다.


    이렇게 하면 복제한 젤랑이 10명이


    젤랑이 오브젝트의 자식으로 들어올 것입니다.


    유니티로 돌아가서 확인해봅시다.





    게임을 실행해보니,


    젤랑이 오브젝트 밑으로


    분신한 애들이 줄을 섰습니다.


    얘네들은 이제 젤랑이의 위치에 영향을 받습니다.


    아까 전에 젤랑이의 자식으로 설정되지 않았을 때는


    젤랑이를 무브 툴로 움직여도 분신들이 따라오지 않지만,


    이번에는 젤랑이를 무브 툴로 움직이면


    분신들도 젤랑이와 똑같이 움직입니다.


    무브 툴로 확인해보세요.



    젤랑이 위치변경 이미지입니다.젤랑이 위치변경



    이제 두 번째 단계로 가봅시다.


    머릿글에서 말했던,


    젤랑 총알을 만들어봅시다.


    우선 젤랑이의 위치 X값을 다시 0으로 만들어놓고,



    Instantiate 스크립트 열기 이미지 입니다.Instantiate 스크립트 열기



    Instantiate 프리팹을 눌러서


    아까 만들었던 InstantiateScript를 열어주세요.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    위 코드를 넣어줍니다.


    젤랑이 분신들이 소환되면


    위로 날라가는 코드입니다.



    아래 코드를 캡처한 사진입니다.이미지가 안보이시는 분들은 아래 코드 보기를 누르고 코드를 확인해주세요.




    다음으로는 젤랑이에 달린 스크립트를 열어줍니다.


    스타트문에 넣었던 젤랑이 분신 소환은 잠깐 지워줍니다.


    그 다음 update문에 젤랑이의 움직임을


    GetKey를 통해 키보드의 화살표대로


    위, 아래, 양 옆으로 움직이게 넣었습니다.


    마지막으로,


    if (Input.GetKeyDown(KeyCode.Space))


    스페이스 바를 누르면,


    Instantiate(prefab, new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z), Quaternion.identity);


    젤랑이들이 머리 위에서 소환된다.


    라고 코드를 입력했습니다.


    Instantiate(prefab


    젤랑 분신이


    new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z)


    젤랑이 위치에서 0.5 위에서 (머리 위에서)


    Quaternion.identity


    젤랑이의 사원수 값으로 소환된다.


    여기서는 transform을 넣지 않았습니다.


    transform을 넣으면 아시겠지만,


    젤랑이 총알들이 젤랑이의 움직임을 따라해서


    총알 같지 않은 총알이 되기때문에,


    젤랑 총알은 독립적으로 두어야합니다.


    유니티로 돌아와 실행해보죠.





    자,, 이렇게 젤랑 총알이 나가고 있습니다.


    오늘 Instantiate를 사용해봤는데,


    조금은 Instantiate와 익숙해지셨나요?


    첫 번째로는 Instantiate로 오브젝트 복제를 하였고


    두 번째로는 Instantiate 프리팹 스크립트에


    코드를 넣어서 총알이 나아가는 것처럼


    구현해보았습니다.


    Instantiate와 조금은 친해졌기를 바랍니다.


    여기서 한 가지 의문점이 생기신 분이 있을겁니다.


    Instantiate를 만들어서 총알을 쏘니까,


    계속해서 총알이 앞으로 나아가기만하고


    없어지지는 않습니다.


    계속해서 Instantiate를 생성만하다보면


    cpu 부하가 일어나는데요.


    얘네들을 일정 시점에서 파괴해주도록 해야합니다.


    다음 포스팅은 얘네들을 파괴하는 법에 대해 알아보겠습니다.


    이상으로 이번 포스팅을 마치며,


    잘 읽으셨다면 댓글을 달아주세요.


    댓글은 저에게 다음 포스팅을 위한 힘이 됩니다 ㅠ ㅠ


    또, 카멜레온이 다뤘으면 좋겠다하는 포스팅 내용을 달아주시면,


    해당 내용에 관한 포스팅도 해보도록 하겠습니다.


    감사합니다 !


    Chameleon Studio가 만든 게임하러가기


    <젤랑점핑>

    안드로이드- market://details?id=com.Cameleon.TangTangBall

    IOS- itms-apps://itunes.apple.com/app/id1429522379



    <크러쉬팡>

    안드로이드- market://details?id=com.Chameleon.CrushPang 

    IOS- itms-apps://itunes.apple.com/app/id1450109331

    댓글

Designed by Tistory.