강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của ekdud1212
ekdud1212

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

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)

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

Viết

·

769

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

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

 

unitynote님의 프로필 이미지
unitynote
Người chia sẻ kiến thức

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

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

Movement2D 컴포넌트를 추가하세요

0

ekdud1212님의 프로필 이미지
ekdud1212
Người đặt câu hỏi

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

0

unitynote님의 프로필 이미지
unitynote
Người chia sẻ kiến thức

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

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

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

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

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

Hình ảnh hồ sơ của ekdud1212
ekdud1212

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

Đặt câu hỏi