차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
unity:instantiatingprefabs [2015/08/22 20:02] V_Lunity:instantiatingprefabs [2022/10/09 20:07] (현재) V_L
줄 1: 줄 1:
 +{{tag>유니티 unity 프리팹 인스턴스화}}
  
 ======실시간으로 프리팹을 인스턴스화 하기 (Instantiating Prefabs at runtime)====== ======실시간으로 프리팹을 인스턴스화 하기 (Instantiating Prefabs at runtime)======
  
-이 시점에서 사용자는 ''프리팹 Prefabs'' 에 관한 기초적인 개념을 이해하고 있어야 한다. 프리팹은 사용자의게임을 통털어 재사용이 가능한 미리 설정된 ''게임오브젝트 GameObjects''들과 ''컴포넌트 Components''들의 집합이다. 프리팹이 무엇인지 모르실 경우, 기초 지식을 위해  [[unity:Prefabs]]  페이지를 읽어보시길 권유한다.+이 시점에서 사용자는 ''프리팹 Prefabs'' 에 관한 기초적인 개념을 이해하고 있어야 한다. 프리팹은 사용자의게임을 통털어 재사용이 가능한 미리 설정된 ''게임오브젝트 GameObjects''들과 ''컴포넌트 Components''들의 집합이다. 프리팹이 무엇인지 모를 경우, 기초 지식을 위해  [[unity:prefabs]]  페이지를 읽어보시길 권유한다.
  
-프리팹은 복잡한 게임오브젝트를 실행 도중에 인스턴스화(instantiate) 시키길 원하는 경우 매우 유용하다.  프리팹을 인스턴스화 하는 것 외에 다른 방안은 코드를 사용해 처음부터 게임오브젝트를 만드는 것이다. 프리팹 인스턴스화는 이런 대안에 비하여 더 많은 장점들을 가지고 있다:+프리팹은 복잡한 게임오브젝트를 실행 도중에 인스턴스화(instantiate) 시키길 원하는 경우 매우 유용하다.  프리팹을 인스턴스화 하는 것 외에 다른 방안은 코드를 사용해 처음부터 여러 게임오브젝트를 만드는 것이다. 프리팹 인스턴스화는 이런 대안에 비하여 더 많은 장점들을 가지고 있으며, 음과 같다.
  
   * 사용자는 한 줄의 코드로 완전한 기능을 가진 프리팹의 인스턴스화를 할 수 있다. 똑같은 게임오브젝트를 코드로 처음부터 만드는 것은 평균 5줄 혹은 더 이상이 필요하게 된다.   * 사용자는 한 줄의 코드로 완전한 기능을 가진 프리팹의 인스턴스화를 할 수 있다. 똑같은 게임오브젝트를 코드로 처음부터 만드는 것은 평균 5줄 혹은 더 이상이 필요하게 된다.
-  * 사용자는 씬 Scene과 인스펙터 Inspector 에서 프리팹을 더 빠르고 쉽게 설정하고 테스트하고 수정할 수 있다.+  * 사용자는 씬 (Scene)과 인스펙터 (Inspector에서 프리팹을 더 빠르고 쉽게 설정하고 테스트하고 수정할 수 있다.
   * 사용자는 인스턴스 되어진 프리팹을 그것을 인스턴스화하는 코드를 변경하지 않고도 해당 프리팹을 변경할 수 있다. 가령 코드 변경없이도 일반 로켓탄을 슈퍼 충전된 로켓으로 변경할 수 있다.   * 사용자는 인스턴스 되어진 프리팹을 그것을 인스턴스화하는 코드를 변경하지 않고도 해당 프리팹을 변경할 수 있다. 가령 코드 변경없이도 일반 로켓탄을 슈퍼 충전된 로켓으로 변경할 수 있다.
  
줄 16: 줄 17:
   - 벽돌 프리팹을 각각 다른 위치로 여러 차례 생성하여 벽을 만들수 있다.   - 벽돌 프리팹을 각각 다른 위치로 여러 차례 생성하여 벽을 만들수 있다.
   - 로켓발사기는 로켓을 쏘았을 때 날으는 로켓탄 프리팹을 인스턴스화 한다. 그 프리팹은 메쉬, ''강체Rigidbody'', ''충돌체 Collider'', 그리고, 자신의 흔적 trail ''파티클 시스템 Particle System''을 가진 자식 child 게임오브젝트를 포함한다.   - 로켓발사기는 로켓을 쏘았을 때 날으는 로켓탄 프리팹을 인스턴스화 한다. 그 프리팹은 메쉬, ''강체Rigidbody'', ''충돌체 Collider'', 그리고, 자신의 흔적 trail ''파티클 시스템 Particle System''을 가진 자식 child 게임오브젝트를 포함한다.
-  - 많은 조각들로 폭발하는 로봇. 완전하게 작동하던 로봇은 부서진후 파괴된_로봇_프리팹 으로 교체된다. 이 프리팹들은 각각의 강체 Rigidbodies 들과 파티클 시스템들이 설정된 여러 개의 파트들로 나눠진 로봇으로 구성될 것이다. 이 테크닉은 로봇을 많은 조각으로 폭발시키며 한 개의 객체를 한 개의 프리팹으로 교체하는 것을 단 한 줄의 코드로 할 수 있게 해준다.+  - 많은 조각들로 폭발하는 로봇. 완전하게 작동하던 로봇은 부서진 후 파괴된_로봇_프리팹 으로 교체된다. 이 프리팹들은 각각의 강체 Rigidbodies 들과 파티클 시스템들이 설정된 여러 개의 파트들로 나눠진 로봇으로 구성될 것이다. 이 테크닉은 로봇을 많은 조각으로 폭발시키며 한 개의 객체를 한 개의 프리팹으로 교체하는 것을 단 한 줄의 코드로 할 수 있게 해준다.
  
-====벽 짓기 Building a wall====+====벽 짓기 (Building a wall)====
  
 아래의 설명은 프리팹을 사용하는 것과 코드로 객체를 생성하는 것의 비교를 통하여 프리팹 사용의 장점을 보여줄 것이다. 아래의 설명은 프리팹을 사용하는 것과 코드로 객체를 생성하는 것의 비교를 통하여 프리팹 사용의 장점을 보여줄 것이다.
  
-우선, 코드로부터 벽돌을 만들어 봅니다:+우선, 코드로부터 벽돌을 만들어 다:
  
 <file csharp>function Start () { <file csharp>function Start () {
줄 39: 줄 40:
 만약 위의 코드를 실행하면, 사용자가 플레이 모드 Play Mode 로 들어갈 때 벽돌 벽 전체를 보게 될 것이다. 거기에는 각각의 벽돌의 기능에 관련된 두 개의 코드 줄이 있다. 이들은 //CreatePrimitive()//와 //AddComponent()//이다. 지금 이것도 나쁘지는 않지만, 벽돌들은 텍스쳐를 가지고 있지 않는다. 텍스쳐 texture, 마찰력 friction, 강체의 질량 Rigidbody //mass//을 바꾸는 것처럼 벽돌에 행해지는 각각의 추가적인 행동들은 모두 추가적인 줄을 필요로 하게 된다. 만약 위의 코드를 실행하면, 사용자가 플레이 모드 Play Mode 로 들어갈 때 벽돌 벽 전체를 보게 될 것이다. 거기에는 각각의 벽돌의 기능에 관련된 두 개의 코드 줄이 있다. 이들은 //CreatePrimitive()//와 //AddComponent()//이다. 지금 이것도 나쁘지는 않지만, 벽돌들은 텍스쳐를 가지고 있지 않는다. 텍스쳐 texture, 마찰력 friction, 강체의 질량 Rigidbody //mass//을 바꾸는 것처럼 벽돌에 행해지는 각각의 추가적인 행동들은 모두 추가적인 줄을 필요로 하게 된다.
  
-만약 사용자가 프리팹을 생성하여, 모든 설정을 사전에 해놓는다면, 각 벽돌의 설정과 생성을 수행하기 위해서 한 줄의 코드만 사용하게 된다. 이것은 사용자가 무언가 수정을 해야한다고 느꼈을 때 많은 코드들을 관리하고 수정하는 수고를 덜어 줄 것 이다. 프리팹을 사용하면 사용자는 단지 수정한 후 플레이하면 된다. 코드의 수정이 따로 필요 없다.+만약 사용자가 [[unity:prefabs|프리팹]]을 생성하여, 모든 설정을 사전에 해놓는다면, 각 벽돌의 설정과 생성을 수행하기 위해서 한 줄의 코드만 사용하게 된다. 이것은 사용자가 무언가 수정을 해야한다고 느꼈을 때 많은 코드들을 관리하고 수정하는 수고를 덜어 줄 것이다. 프리팹을 사용하면 사용자는 단지 수정한 후 플레이하면 된다. 코드의 수정이 따로 필요 없다.
  
 개개의 벽돌을 위해 프리팹을 사용할 것이라면, 다음이 사용자가 벽을 생성하기 위해 필요한 코드이다. 개개의 벽돌을 위해 프리팹을 사용할 것이라면, 다음이 사용자가 벽을 생성하기 위해 필요한 코드이다.
줄 52: 줄 53:
 } </file> } </file>
  
-위의 코드는 아주 깔끔할 뿐만 아니라 재사용이 가능다. 여기에는 큐브를 인스턴스화한다 instantiating 라던지 큐브가 강체 rigidbody 를 포함 해야 한다 라는 말이 필요 없다. 이 모든 것은 프리팹에서 정의되고 에디터에서 빠르게 생성될 수 있다.+위의 코드는 아주 깔끔할 뿐만 아니라 재사용이 가능다. 여기에는 큐브를 인스턴스화한다 (instantiating라던지 큐브가 강체 (rigidbody를 포함 해야 한다 라는 말이 필요 없다. 이 모든 것은 프리팹에서 정의되고 에디터에서 빠르게 생성될 수 있다.
  
 이제 사용자는 에디터 안에서 프리팹을 만들기만 하면 된다. 다음과 같은 방법으로 프리팹을 생성한다: 이제 사용자는 에디터 안에서 프리팹을 만들기만 하면 된다. 다음과 같은 방법으로 프리팹을 생성한다:
줄 60: 줄 61:
   - **Assets->Create Prefab**를 선택한다.   - **Assets->Create Prefab**를 선택한다.
   - ''프로젝트 뷰 Project View''에서, 새로운 프리팹의 이름을 "Brick"으로 바꿉니다.   - ''프로젝트 뷰 Project View''에서, 새로운 프리팹의 이름을 "Brick"으로 바꿉니다.
-  - ''계층 Hierarchy''에서 생성한 큐브를 드래그하여 ''프로젝트 뷰''의 “Brick” 프리팹에 놓다. +  - ''계층 Hierarchy''에서 생성한 큐브를 드래그하여 ''프로젝트 뷰''의 “Brick” 프리팹에 놓다. 
-#생성된 프리팹으로 사용자는 계층에서 안전하게 큐브를 삭제할 수 있다 (윈도우에서는 **Delete**, 맥에서는 **Command-Backspace**)+ 
 +생성된 프리팹으로 사용자는 계층에서 안전하게 큐브를 삭제할 수 있다 (윈도우에서는 **Delete**, 맥에서는 **Command-Backspace**)
  
 이제 벽돌 프리팹이 생성되었다. 이제 사용자는 이것을 스크립트의 //cube//  변수에 붙여야 attach 한다. 스크립트를 포함하는 빈 게임오브젝트를 선택하라. 인스펙터에서 새로운 변수인 "cube"가 나타난 것을 보게 될 것이다. 이제 벽돌 프리팹이 생성되었다. 이제 사용자는 이것을 스크립트의 //cube//  변수에 붙여야 attach 한다. 스크립트를 포함하는 빈 게임오브젝트를 선택하라. 인스펙터에서 새로운 변수인 "cube"가 나타난 것을 보게 될 것이다.
  
-{{:unity3d:InspectorWithCubeVar.png}}\\+{{:unity3d:InspectorWithCubeVar.png}} 
 //이 변수는 어떤 게임오브젝트나 프리팹도 받아들일 수 있다 // //이 변수는 어떤 게임오브젝트나 프리팹도 받아들일 수 있다 //
  
 이제 "Brick" 프리팹을 프로젝트 뷰에서 인스펙터의 //cube// 변수위로 드래그 한다. 플레이 Play 를 누르면 프리팹을 사용하는 벽을 보게 될 것이다. 이제 "Brick" 프리팹을 프로젝트 뷰에서 인스펙터의 //cube// 변수위로 드래그 한다. 플레이 Play 를 누르면 프리팹을 사용하는 벽을 보게 될 것이다.
  
-이것은 유니티에서 굉장히 많이 사용되는 작업방식 패턴이다. 사용자는 처음에 코드로부터 큐브를 생성하는 스크립트가 단 2줄이 더 긴데 왜 이 방식이 훨씬 더 낫다는 건지 의아해 할 수도 있다.+**이것은 유니티에서 굉장히 많이 사용되는 작업방식 패턴이다.** 사용자는 처음에 코드로부터 큐브를 생성하는 스크립트가 단 2줄이 더 긴데 왜 이 방식이 훨씬 더 낫다는 건지 의아해 할 수도 있다.
  
 그러나 지금은 프리팹 사용으로 인해 단 몇 초 내에 프리팹을 수정할 수 있다. 모든 인스턴스의 질량 수정이 필요합니까? 그렇다면 해당 프리팹 안의 강체를 수정하라. 모든 인스턴스들에 각각 다른 ''재질 Material''을 사용하기 원합니까? 그렇다면 해당 프리팹으로 재질을 한번만 드래그 해놓으면 된다. 마찰의 수정을 원하십니까? 그렇다면 프리팹의 충돌체에 다른 ''피직 재질 Physic Material''을 사용하십시오. 여기 모든 박스에 파티클 시스템을 추가 하시겠습니까? 그렇다면 프리팹에 자식 child 을 한 번만 추가하면 된다. 그러나 지금은 프리팹 사용으로 인해 단 몇 초 내에 프리팹을 수정할 수 있다. 모든 인스턴스의 질량 수정이 필요합니까? 그렇다면 해당 프리팹 안의 강체를 수정하라. 모든 인스턴스들에 각각 다른 ''재질 Material''을 사용하기 원합니까? 그렇다면 해당 프리팹으로 재질을 한번만 드래그 해놓으면 된다. 마찰의 수정을 원하십니까? 그렇다면 프리팹의 충돌체에 다른 ''피직 재질 Physic Material''을 사용하십시오. 여기 모든 박스에 파티클 시스템을 추가 하시겠습니까? 그렇다면 프리팹에 자식 child 을 한 번만 추가하면 된다.
  
-====로켓과 폭발의 인스턴스화 Instantiating rockets & explosions====+====로켓과 폭발의 인스턴스화 (Instantiating rockets & explosions)====
  
 다음은 프리팹이 어떻게 이 시나리오에 들어맞는지에 대한 설명이다: 다음은 프리팹이 어떻게 이 시나리오에 들어맞는지에 대한 설명이다:
줄 106: 줄 109:
 } </file> } </file>
  
-====캐릭터를 랙돌 ragdoll 이나 망가진 것으로 교체하기 Replacing a character with a ragdoll or wreck====+====캐릭터를 랙돌 (ragdoll이나 망가진 것으로 교체하기 (Replacing a character with a ragdoll or wreck)====
  
 만약 사용자가 완전히 리깅된 적 캐릭터를 가지고 있는데 그가 죽었다고 가정해 보라. 이 경우 사용자는 단순히 캐릭터에 죽음 애니메이션이 작동하게 하고 그 적 캐릭터의 로직을 다루는 모든 스크립트를 사용불가 disable 상태로 만들수도 있다. 이때 사용자는 몇몇 스크립트들을 제거하고, 다른 아무도 죽은 적을 더 이상 공격하지 않는 몇몇 커스텀 로직을 더해야 하는 등등의 여러가지 청소 작업에 신경 써야 할 것이다. 만약 사용자가 완전히 리깅된 적 캐릭터를 가지고 있는데 그가 죽었다고 가정해 보라. 이 경우 사용자는 단순히 캐릭터에 죽음 애니메이션이 작동하게 하고 그 적 캐릭터의 로직을 다루는 모든 스크립트를 사용불가 disable 상태로 만들수도 있다. 이때 사용자는 몇몇 스크립트들을 제거하고, 다른 아무도 죽은 적을 더 이상 공격하지 않는 몇몇 커스텀 로직을 더해야 하는 등등의 여러가지 청소 작업에 신경 써야 할 것이다.
줄 154: 줄 157:
 사용자가 다양한 오브젝트들을 그리드나 원형의 패턴에 놓고 싶어한다고 합시다. 예전에는 이것들을 다음과 같은 방법들로 실현했다: 사용자가 다양한 오브젝트들을 그리드나 원형의 패턴에 놓고 싶어한다고 합시다. 예전에는 이것들을 다음과 같은 방법들로 실현했다:
  
-  - 완전히 코드만으로 객체를 만듭니다. 이는 굉장히 지루다. 한 스크립트에 값들을 넣는 것은 작업속도가  느려질 뿐만 아니라 직관적이지도 않아 힘만 들게 된다.+  - 완전히 코드만으로 객체를 만듭니다. 이는 굉장히 지루다. 한 스크립트에 값들을 넣는 것은 작업속도가  느려질 뿐만 아니라 직관적이지도 않아 힘만 들게 된다.
   - 완전히 리깅된 오브젝트를 만들고, 그것을 복제해서 씬 Scene 의 여러 곳에 배치하는 방법이다. 이 또한 지루한 작업이며, 객체들을 그리드 (좌표) grid 에 정확하게 놓는 것은 어렵다.   - 완전히 리깅된 오브젝트를 만들고, 그것을 복제해서 씬 Scene 의 여러 곳에 배치하는 방법이다. 이 또한 지루한 작업이며, 객체들을 그리드 (좌표) grid 에 정확하게 놓는 것은 어렵다.
  
-그러므로, 프리팹과 //Instantiate()// 를 이용하라! 이러한 시나리오들에서 왜 프리팹들이 유용한지 이제는 이해가 되실 것이다. 이 시나리오들을 위해 필요한 코드는 다음과 같다:+그러므로, 프리팹과 //Instantiate()// 를 이용하라! 이러한 시나리오들에서 왜 프리팹들이 유용한지 이제는 이해가 될 것이다. 이 시나리오들을 위해 필요한 코드는 다음과 같다:
  
 <file csharp>// 원 안에서 프리팹 인스턴스들 만들기 <file csharp>// 원 안에서 프리팹 인스턴스들 만들기
줄 189: 줄 192:
 } </file> } </file>
  
-{{tag>유니티 unity}} 
    * 출처: [[http://unitykoreawiki.com/index.php?n=KrMain.InstantiatingPrefabs|유니티코리아위키]] (CC BY-NC-SA 2.0)    * 출처: [[http://unitykoreawiki.com/index.php?n=KrMain.InstantiatingPrefabs|유니티코리아위키]] (CC BY-NC-SA 2.0)
 +
 +
 +https://angliss.cc/random-gameobject-created/
 +