NullReferenceException: Object reference not set to an instance of an object Unity [дубликат]

257
28 июля 2018, 21:10

На данный вопрос уже ответили:

  • Что такое NullReferenceException, и как мне исправить код? 2 ответа

Первый раз зашел в Unity, чтобы по видеоуроку сделать игру. И мне выдает такую ошибку, когда я пытаюсь стрельнуть в игре:

NullReferenceException: Object reference not set to an instance of an object Player.Shoot () (at Assets/Scripts/Player.cs:67) Player.Update () (at Assets/Scripts/Player.cs:45).

Класс персонажа:

public class Player : Unit
{
    [SerializeField]
    private int lives = 5;
    [SerializeField]
    private float speed = 3.0f;
    [SerializeField]
    private float jump_force = 15.0f;
    private CharState State
    {
        get { return (CharState)animator.GetInteger("State"); }
        set { animator.SetInteger("State", (int)value); }
    }
    new private Rigidbody2D rigidbody;
    private Animator animator;
    private SpriteRenderer sprite;
    private bool isGrounded = false;
    private Bullet bullet;
    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        sprite = GetComponentInChildren<SpriteRenderer>();
        bullet = Resources.Load<Bullet>("Bullet");
    }
    private void FixedUpdate()
    {
        CheckGround();
    }
    private void Update()
    {
        if (isGrounded)State = CharState.Idle;
        if (Input.GetButtonDown("Fire1")) Shoot();
        if(Input.GetButton("Horizontal")) Run();
        if ( isGrounded && Input.GetButtonDown("Jump")) Jump();
    }
    private void Run()
    {
        Vector3 direction = transform.right * Input.GetAxis("Horizontal");
        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
        sprite.flipX = direction.x < 0.0f;
        if (isGrounded) State = CharState.Run;
    }
    private void Jump()
    {
        rigidbody.AddForce(transform.up*jump_force, ForceMode2D.Impulse);
    }
    private void Shoot()
    {
        Vector3 position = transform.position; position.y += 0.8F;
        Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet;
    }
    private void CheckGround()
    {
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 3.0f);
        isGrounded = colliders.Length > 1;
        State = CharState.Jump;
    }
}
public enum CharState
{
    Idle,
    Run,
    Jump
}

Класс пули:

public class Bullet : MonoBehaviour
{
    private float speed=8.0f;
    private Vector3 direction;
    public Vector3 Direction { set { direction = value; } }
    private SpriteRenderer sprite;
    private void Awake()
    {
        sprite = GetComponentInChildren<SpriteRenderer>();
    }
    private void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
    }
}
Answer 1

В папке "Resources" (необходимо создать, если нет) должен быть префаб "Bullet". Этот префаб пули, разумеется, тоже должен быть создан Вами.

Видеоурок не видел, так что не могу точно сказать, сделаны ли Вами эти действия.

Answer 2
  Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet;

Проблема в этой строке. Давайте разберем. Instantiate - создает новый экземпляр. Вы пытаетесь создать экземпляр bullet. Это private Bullet bullet; - MonoBehavior , т.е. компонет) Компонент не может быть создан без GameObject.

Поменяйте

private Bullet bullet; 

на

private GameObject bullet; 

и строку создания пули

с Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet;

на Instantiate(bullet, position, bullet.transform.rotation)

нет смысла хранить ссылку на неё, она не используется. Должно работать.

READ ALSO
ASP.NET TCP прослушивание

ASP.NET TCP прослушивание

Можно ли слушать TCP порт в ASPNET web rest API проекте?

191
Не удается неявно преобразовать тип &ldquo;System.Collections.Generic.IEnumerable&lt;string&gt;&rdquo; в &ldquo;string&rdquo;

Не удается неявно преобразовать тип “System.Collections.Generic.IEnumerable<string>” в “string”

помогите пожалуйста закончить эксперимент: имеется код поиска похожей строки и проблема рисуется при попытке читать строки из файла

220