inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

791

ekdud_____

작성한 질문수 5

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;

        }

    }

}

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

unity

답변 3

0

윤식

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 지시문 또는 어셈블리 참조가 있는지 확인하세요.]라는 오류 목록이 나와요

 

0

고박사

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

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

Movement2D 컴포넌트를 추가하세요

0

ekdud_____

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

0

고박사

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

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

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

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

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

03-01 (16. CharacterController)

0

24

2

05-02 실습에서 마지막 부분을 해보니 죽는 키를 누르면 die 가 두번 재생됩니다

0

64

2

02. 게임오브젝트 물리와 충돌 마지막 sun예제의 움직임

0

136

2

유니티3d 기초 하고 있는데. 따라하기가 전혀 안됩니다.

0

231

1

강의보다가 문득 궁금한게 있어서 여쭤봅니다.

0

331

1

다른 강의도 듣고 싶어요

0

297

1

2D Tilemap Editor 2:00에서요

0

386

2

제가 3d 멀미가 있어서 2D게임만 만들 생각인데요

0

324

1

게임오브젝트 삭제함수에서 질문이요

0

192

1

Instantiate() 활용 예제에서 11:30의 예제 질문이요

0

239

1

3D 네비게이션 메시 질문요(유니티 버전이 최근버전이라 잘 진행이 안되네요)

0

822

2

2D Basic 6강, 2D-Extras에서 애먹고있습니다.

0

425

1

사다리 밑으로 이동이 안 돼요

0

300

1

총알이 나가지 않습니다.

0

390

2

게임 월드로 배치되는 바닥, 장애물이 “Navigation Static”으로 설정이 안됩니다..

1

706

1

강의자료 다운로드가 가능할까요?

0

589

1

수업자료 버튼이 안보입니다

0

504

2

총알이 player 뒤로 나가게하려면 따로 설정이 필요한가요?

0

520

1

총알이 player 뒤로 생성되게 따로 설정이 필요한가요?

0

267

1

[asset] 이 로딩이 안되는 이유

0

820

1

used by composite 항목이 없어요

0

856

1

강의 자료를 다운받고 싶습니다.

0

506

1

23년인 지금 들어도 버전문제는 없을까요

0

583

1

NavigationMesh 응용 질문있어요

0

492

1