На данный вопрос уже ответили:
Первый раз зашел в 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);
}
}
В папке "Resources" (необходимо создать, если нет) должен быть префаб "Bullet". Этот префаб пули, разумеется, тоже должен быть создан Вами.
Видеоурок не видел, так что не могу точно сказать, сделаны ли Вами эти действия.
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)
нет смысла хранить ссылку на неё, она не используется. Должно работать.
Виртуальный выделенный сервер (VDS) становится отличным выбором
помогите пожалуйста закончить эксперимент: имеется код поиска похожей строки и проблема рисуется при попытке читать строки из файла