작성
·
626
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
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
0
NullRenference 에러는 클래스 인스턴스가 비어있을 때 발생하는 오류입니다.
컴포넌트에 정의된 클래스 변수가 비어있거나
컴포넌트를 다른 컴포넌트에서 접근해 사용할 때 해당 컴포넌트가 없으면 발생합니다.
지금 같은 경우는 Bullet 게임오브젝트에 적용해야 되는 컴포넌트를 제대로 넣어뒀는지
확인해보면 될 거 같습니다.
아래 답변처럼 NullReference 에러는 클래스의 인스턴스(변수)가 비어있을 때 발생합니다.
clone.GetComponent<Movement2D>.. 이 부분에서 뜨기 때문에 게임오브젝트에 Movement2D 컴포넌트가 안들어가 있을 확률이 높습니다.
Movement2D 컴포넌트를 추가하세요