Unity Chapter 5-4. C# 프로그래밍 [중급] (1/2) : Instantiate
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 5. C# 프로그래밍 : 중급 (1/2)
🔔 인스턴스화 : Instantiate
- 어떤 추상적인 대상을 실존하는 무언가로 찍어내는 것
- 미리 만들어 둔 오브젝트를 실시간으로 게임 도중에 필요한 만큼 찍어내는 것
- ex) 총알, 몬스터 같은 것들은 게임 플레이 도중에 생성 되야하는 오브젝트들이다.
📜 Spawner.cs
오브젝트 원본을 넣어주면 그 원본을 게임 도중에 찍어내는 역할을 하는 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
public GameObject target;
void Start()
{
Instantiate(target);
}
}
public GameObject target;
- 게임 도중에 찍어낼 오브젝트를 참조할 변수
- 찍어낼 오브젝트를 유니티에서 슬롯에 드래그 앤 드롭 해줄 것이다.
Instantiate(target);
- target 변수가 참조하는 오브젝트를 게임 도중에 찍어내는 함수.
- 찍어낸 오브젝트를 리턴한다.
- 게임을 실행시키면 target이 참조하는 오브젝트를 1개 찍어낸다.
- target 변수가 참조하는 오브젝트를 게임 도중에 찍어내는 함수.
- Empty Object를 만든 후 이 📜
Spawner.cs
스크립트를 붙여준다.(이름은 Spawner) - Sphere Object를 만든 후(이름은 Ball) Empty Object에 붙어있는 📜
Spawner.cs
스크립트의 target 슬롯에 넣어준다. - Ball Object에 Rigidbody 컴포넌트를 붙인다.
- 게임을 실행하면 Ball 오브젝트가 하나 더 생기고 두 오브젝트가 중력을 받아 떨어진다.
Prefab 사용하기
- 보통 Instantiate은 이미 게임 씬 상에 존재하는 오브젝트를 대상으로 하진 않는다. 없었는데 게임 도중에 생성하는 경우에 사용.
Prefab
을 사용하여 찍어내자. Prefab은 미리 만들어 둔 오브젝트. (소코반 게임에서 배웠다.)- 따라서 인스턴스화는 주로 Prefab을 대상으로 이루어진다.
- Ball 오브젝트를 Prefab으로 만든다.
/Assets
에 끌고 오기
- 현재 씬 상에서 Ball 오브젝트를 지운다.
- Hierarchy 창에서 지운다.
- Spawner Object에 붙어있는 target 슬롯에
Ball Prefab
을 드래그 앤 드롭 해준다. - 게임을 실행하면 Ball이 생성되어 중력을 받아 떨어질 것이다.(중력은 Rigidbody영향)
- Ball 오브젝트를 Prefab으로 만든다.
Instantiate에 옵션주기
게임 도중 생성될 오브젝트의 위치라던지 등등 이런 것들 설정하기. Instantiate 의 매개변수들 추가하기.
Instantiate(찍어낼 오브젝트, 찍어낼 위치, 찍을때 회전값)
📜 Spawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
public GameObject target; // Prefab으로 만든 Ball
public Transform spawnPosition; // 스폰 위치를 나타내는 빈 오프젝트의 Transform
void Start()
{
Instantiate(target, spawnPosition.position, spawnPosition.rotation);
}
}
- 빈 오브젝트(이름은 SpawnPosition)를 하나 더 만들어 Spawner Object의 spawnPosition 슬롯에 넣어준다.
- 이 빈 오브젝트(SpawnPosition)는
스폰 위치
를 나타내는 역할로 사용할 것이다.
- 이 빈 오브젝트(SpawnPosition)는
찍어낸 오브젝트 리턴 받기
Instantiate 함수는 찍어낸 오브젝트를 리턴한다.
📜 Spawner.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
public GameObject target; // Prefab으로 만든 Ball
public Transform spawnPosition; // 스폰 위치를 나타내는 빈 오프젝트의 Transform
void Start()
{
GameObject instance = Instantiate(target, spawnPosition.position, spawnPosition.rotation);
Debug.Log(instance.name);
}
}
GameObject instance
: 변수가 플레이 도중 새롭게 생성된 Ball Object 인스턴스를 참조하게 될 것이다. Instantiate 함수가 리턴해주어서 가능한 일.Debug.Log(instance.name);
: 게임 실행 후 Ball 인스턴스가 생성되면 콘솔에 “Ball(clone)” 메세지가 출력된다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
public Rigidbody target; // ball Prefab은 Rigidbody 컴포넌트를 가지고 있는 상태.
public Transform spawnPosition;
void Start()
{
Rigidbody instance = Instantiate(target, spawnPosition.position, spawnPosition.rotation);
instance.AddForce(0, 1000, 0);
}
}
public Rigidbody target
- 본인에게 붙어있는 Rigidbody 갖고 오려면 RIgidbody 컴포넌트를 슬롯에 드래그 앤 드롭하면 되지만
- 나 말고 다른 오브젝트에게 붙어 있는 Rigidbody를 가져오려면 그냥 슬롯에 그 Rigidbody를 가지고 있는 오브젝트를 드래그 앤 드롭하면 된다.
- Rigidbody가 없는 오브젝트는 드래그 앤 드롭이 불가능하다.
Rigidbody instance = Instantiate(target)
- target은 Rigidbody이기 때문에 Instantiate 또한 Rigidbody 타입으로 인스턴스를 리턴한다.
instance.AddForce(0, 1000, 0);
이렇게 사용 가능. Instantiate가 Rigidbody 타입으로 리턴해줘서 instance는 Rigidbody 타입이므로.
- target은 Rigidbody이기 때문에 Instantiate 또한 Rigidbody 타입으로 인스턴스를 리턴한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Spawner : MonoBehaviour
{
public GameObject target;
public Transform spawnPosition;
void Start()
{
GameObject instance = Instantiate(target, spawnPosition.position, spawnPosition.rotation);
instance.GetComponent<Rigidbody>().AddForce(0, 1000, 0);
}
}
위 코드와 같이 사용할 수도 있다! GameObject로 리턴 받았는데 Rigidbody 컴포넌트를 쓰고 싶다면 GetComPonent로 Rigidbody 타입을 가져오면 됨.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기