게임 오브젝트의 생성
Prefab으로 오브젝트 생성
게임 내에서 코드를 이용해서 오브젝트를 생성하기 위해서는 원본이 필요하다.
의도치 않은 동작을 막기 위해 게임 내에 있는 오브젝트를 복제하는 것이 아니라, Prefab을 사용한다.
*Prefab : 게임에 존재하는 게임 오브젝트를 Project View에 파일로 저장해둔 것.
[SerializeField]
private GameObject chocoPrefab;
private void Awake()
{
Instantiate(chocoPrefab, new Vector3(3, 3, 0), Quaternion.identity);
Instantiate(chocoPrefab, new Vector3(-3, -3, 0), Quaternion.identity);
}
게임을 실행하면 짱구가 좋아하는 초코비가 무려 두개나 생성되도록 Instantiate 함수를 사용해주었다.
첫번째 인자는 앞서 생성한 초코비 prefab, 두번째 인자는 위치, 세번째 인자는 회전값이다.
Spawn Point에 오브젝트 생성
짱구 입의 위치(Spawn Point)에서 초코비가 발사되도록 해보자.
Empty Object를 짱구 입에 위치시켜놓고, 아래 두개의 Component를 스크립트로 작성해서 추가해주었다.
ChocoSpawn에서 SerializeField로 초코비 prefab을 설정해주었는데,
게임을 실행하면 콘솔창에 NullReferenceException : unity object reference not set to an instance of an object ..
라는 에러가 뜨면서 이상하게 실행이 되었다. 에러는 ChocoSpawn의 clone.GetComponent<Movement2D> 지점을 가리켰다.
using UnityEngine;
public class ChocoSpawn : MonoBehaviour
{
[SerializeField]
private GameObject prefab;
[SerializeField]
private int currentObjectCount = 0;
private float objectSpawnTime = 0.0f;
// Update is called once per frame
private void Update()
{
if (currentObjectCount + 1 > 10)
{
return;
}
objectSpawnTime += Time.deltaTime;
if (objectSpawnTime >= 0.5f)
{
GameObject clone = Instantiate(prefab, transform.position, Quaternion.identity);
Vector3 moveDirection = Vector3.right;
clone.GetComponent<Movement2D>().Setup(moveDirection);
currentObjectCount ++;
objectSpawnTime = 0.0f;
}
}
}
using UnityEngine;
public class Movement2D : MonoBehaviour
{
private float moveSpeed = 5.0f;
private Vector3 moveDirection = Vector3.left;
public void Setup(Vector3 direction)
{
moveDirection = direction;
}
private void Update()
{
transform.position += moveDirection * moveSpeed * Time.deltaTime;
}
}
구글링해본 결과로, NullRenferenceException 에러는 클래스 인스턴스가 비어있을 때 발생하는 오류이다.
- 컴포넌트에 정의된 클래스 변수가 비어있거나
- 컴포넌트를 다른 컴포넌트에서 접근해 사용할 때 해당 컴포넌트가 없으면 발생 가능하다.
위의 예제에서는 Movement2D가 초코비에 적용되어야 했는데, 실수로 Spawn 지점의 empty object에 적용해두어서 발생했다.
Movement2D를 다시 초코비에 적용하니 해결되었다.
NullReferenceException 에러가 발생하면 게임 오브젝트에 적용해야 되는 컴포넌트를 제대로 넣어뒀는지 확인해보도록 하자.
Player 위치에 오브젝트 생성 + 원하는 방향으로 발사하기
짱구가 움직이며 초코비를 발사(?)하도록 해보았다.
원하는 Spawning Point에서 초코비가 생성되도록 하는것이 아니기 때문에 앞에서 작성한 ChocoSpawn는 삭제하고,
플레이어(짱구)를 움직이며 스페이스바를 눌렀을때 해당 방향으로 초코비가 발사되도록 하기 위해
PlayerController 스크립트를 추가했다. 초코비에 적용되어있는 Movement2D는 그대로 유지한다.
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField]
private KeyCode keyCodeFire = KeyCode.Space;
[SerializeField]
private GameObject chocoPrefab;
private float moveSpeed = 3.0f;
private Vector3 lastMoveDirection = Vector3.right;
// Update is called once per frame
private void Update()
{
// 플레이어 오브젝트 이동
float x = Input.GetAxisRaw("Horizontal");
float y = Input.GetAxisRaw("Vertical");
transform.position += new Vector3(x, y, 0) * moveSpeed * Time.deltaTime;
// 마지막에 입력된 방향키의 방향을 초코비의 발사 방향으로 활용
if (x != 0 || y != 0)
{
lastMoveDirection = new Vector3(x, y, 0);
}
// 초코비 발사
if (Input.GetKeyDown(keyCodeFire))
{
GameObject clone = Instantiate(chocoPrefab, transform.position, Quaternion.identity);
clone.name = "Choco";
clone.transform.localScale = Vector3.one * 0.5f;
clone.GetComponent<Movement2D>().Setup(lastMoveDirection);
}
}
}
'개발 > UNITY' 카테고리의 다른 글
Building System 만들기 (0) | 2022.05.03 |
---|---|
Unity 3D Basic - 1 (0) | 2022.04.26 |
Unity 2D Basic - 1 (0) | 2022.04.18 |
Unity Introduction (0) | 2022.04.18 |
유니티 깔짝거려보기 (0) | 2022.04.08 |