inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Tìm hiểu những điều cơ bản về Unity của Tiến sĩ Ko bằng cách làm theo

Ví dụ về sử dụng Instantiate() (16:37)

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

793

ekdud1212

5 câu hỏi đã được viết

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

Câu trả lời 3

0

hamsick1809562

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

unitynote

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

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

Movement2D 컴포넌트를 추가하세요

0

ekdud1212

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

0

unitynote

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

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

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

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

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

03-01 (16. CharacterController)

0

39

2

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

0

67

2

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

0

146

2

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

0

237

1

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

0

336

1

다른 강의도 듣고 싶어요

0

300

1

2D Tilemap Editor 2:00에서요

0

390

2

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

0

330

1

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

0

201

1

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

0

243

1

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

0

827

2

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

0

429

1

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

0

305

1

총알이 나가지 않습니다.

0

393

2

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

1

710

1

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

0

595

1

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

0

510

2

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

0

525

1

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

0

272

1

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

0

827

1

used by composite 항목이 없어요

0

862

1

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

0

514

1

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

0

591

1

NavigationMesh 응용 질문있어요

0

504

1