인프런 커뮤니티 질문&답변

ekdud_____님의 프로필 이미지

작성한 질문수

따라하면서 배우는 고박사의 유니티 기초

Instantiate() 활용 예제 (16:37)

총알이 발사가 되지 않습니다!

21.03.03 17:21 작성

·

614

0

해당 에러가 뜨면서 총알이 발사되지 않습니다ㅠㅠ

PlayerController코드는 다음과 같이 작성했습니다.

using UnityEngine;

public class PlayerController : MonoBehaviour

{

    [SerializeField]

    private KeyCode keyCodeFire = KeyCode.Space;

    [SerializeField]

    private GameObject bulletPrefab;

    private float moveSpeed = 3.0f;

    private Vector3 lastMoveDirection = Vector2.right; // 마지막에 움직인 방향을 저장하기 위한 변수

    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(bulletPrefab, transform.position, Quaternion.identity);

            clone.name = "Bullet";

            clone.transform.localScale = Vector3.one * 0.5f;

            clone.GetComponent<SpriteRenderer>().color = Color.red;

            clone.GetComponent<Movement2D>().Setup(lastMoveDirection);

        }

    }

 }

Movement2D 코드

using UnityEngine;

public class Movement2D : MonoBehaviour

{

    private float moveSpeed = 5.0f;

    private Vector3 moveDirection;

    public void Setup(Vector3 direction)

    {

        moveDirection = direction;

    }

    private void Update()

    {

        transform.position += moveDirection * moveSpeed * Time.deltaTime;

    }

}

ObjectSpawner 코드

using UnityEngine;

public class ObjectSpawner : MonoBehaviour

{

    [SerializeField]

    private int objectSpawnCount = 30;

    [SerializeField]

    private GameObject[] prefabArray;

    [SerializeField]

    private Transform[] spawnPointArray;

    private int currentObjectCount = 0;

    private float objectSpawnTime = 0.0f;

    private void Update()

    {

        // objectSpawnCount 개수만큼만 생성하고 더이상 생성하지 않도록 하기 위해 설정

        if (currentObjectCount + 1 > objectSpawnCount)

        {

            return;

        }

        // deltaTime만을 덧셈으로 활용하면 실체 시간과 동일하게 흘러감

        objectSpawnTime += Time.deltaTime;

        // 0.5초마다 한 번씩 실행

        if (objectSpawnTime >= 0.5f) 

        {

            int prefabIndex = Random.Range(0, prefabArray.Length);

            int spawnIndex = Random.Range(0, spawnPointArray.Length);

            Vector3 position = spawnPointArray[spawnIndex].position;

            GameObject clone = Instantiate(prefabArray[prefabIndex], position, Quaternion.identity);

            Vector3 moveDirection = (spawnIndex == 0 ? Vector3.right : Vector3.left);

            clone.GetComponent<Movement2D>().Setup(moveDirection);

            currentObjectCount++;

            objectSpawnTime =  0.0f;

        }

    }

}

어디서 문제가 발생한 건지 에러 알림을 봐도 잘 모르겠습니다ㅠㅠ

답변 3

0

윤식님의 프로필 이미지

2024. 03. 02. 23:23

public class ObjectSpawner : MonoBehaviour

{

[SerializeField] private int objectSpawnCount = 30;

// Start is called before the first frame update

[SerializeField] private GameObject[] prefabArray;

[SerializeField] private Transform[] spawnPointArray;

private int currentObjectCount = 0;

private float objectSpawnTime = 0.0f;

void Start()

{

}

// Update is called once per frame

void Update()

{

if(currentObjectCount + 1 > objectSpawnCount)

{

return;

}

objectSpawnTime += Time.deltaTime;

if(objectSpawnTime >= 0.5f)

{

int prefabIndex = Random.Range(0, prefabArray.Length);

int spawnIndex = Random.Range(0, spawnPointArray.Length);

Vector3 position = spawnPointArray[spawnIndex].position;

GameObject clone = Instantiate(prefabArray[prefabIndex], position, Quaternion.identity);

Vector3 moveDirection = (spawnIndex == 0 ? Vector3.right : Vector3.left);

clone.GetComponent<Movement2D>().Setup(moveDirection);

currentObjectCount++;

objectSpawnTime = 0.0f;

}

}

}

 

Instantiate()활용예제에서 11:29의 예제를 실행해 보았는데

clone.GetComponent<Movement2D>().Setup(moveDirection);에서 Setup이 빨간줄 그어지더니

['Movement2D'에는 'Setup'에 대한 정의가 포함되어 있지 않고, 'Movement2D' 형식의 첫 번째 인수를 허용하는 액세스 가능한 확장 메서드 'Setup'이(가) 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하세요.]라는 오류 목록이 나와요

 

고박사님의 프로필 이미지
고박사
지식공유자

2024. 03. 03. 15:49

아래 답변처럼 NullReference 에러는 클래스의 인스턴스(변수)가 비어있을 때 발생합니다.

clone.GetComponent<Movement2D>.. 이 부분에서 뜨기 때문에 게임오브젝트에 Movement2D 컴포넌트가 안들어가 있을 확률이 높습니다.

Movement2D 컴포넌트를 추가하세요

0

ekdud_____님의 프로필 이미지
ekdud_____
질문자

2021. 03. 04. 17:55

Bullet 게임오브젝트에 Movement2D를 넣어주지 않아서 에러가 발생했습니다! 도움주셔서 감사합니다

0

고박사님의 프로필 이미지
고박사
지식공유자

2021. 03. 04. 15:12

NullRenference 에러는 클래스 인스턴스가 비어있을 때 발생하는 오류입니다.

컴포넌트에 정의된 클래스 변수가 비어있거나

컴포넌트를 다른 컴포넌트에서 접근해 사용할 때 해당 컴포넌트가 없으면 발생합니다.

지금 같은 경우는 Bullet 게임오브젝트에 적용해야 되는 컴포넌트를 제대로 넣어뒀는지

확인해보면 될 거 같습니다.