Зачем нужно писать в метод класс rb = GetComponent();?
Зачем нужно писать rb = GetComponent<Rigidbody2D()? Если мы и так взаимодействуем им, когда написали Rigidbody2D rb; Что означает rb = GetComponent<Rigidbody2D()? Извините если не понятно написал
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
Rigidbody2D rb;
public float speed;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
Flip();
}
void FixedUpdate()
{
rb.velocity = new Vector2(Input.GetAxis("Horizontal") * speed, rb.velocity.y);
}
void Flip()
{
if(Input.GetAxis("Horizontal") > 0)
{
transform.localRotation = Quaternion.Euler(0, 0, 0);
}
if(Input.GetAxis("Horizontal") < 0)
{
transform.localRotation = Quaternion.Euler(0, 180, 0);
}
}
}
Ответы (2 шт):
// обьявление ПУСТОЙ переменной типа Rigidbody2D
Rigidbody2D rb;
void Start()
{
// Инициализация даной переменной при создании инстанса Player в сцене
rb = GetComponent<Rigidbody2D>();
}
если строки инициализации не будет, то rb будет null.
Соответственно, ты получишь null reference exception как только попробуешь что-либо сделать с ним.
и отдельно стоит отметить что здесь ПРАВИЛЬНО размещен этот запрос - на старте. Плохая практика это писать в других местах кроме Start или Awake
Для наглядности это можно записать так:
[Тип переменной] [Имя переменной] = [Значение переменной];
Например когда мы пишем:
float speed = 100f;
Мы объявляем переменную типа float с именем speed и присваиваем ей значении 100f.
Если мы объявляем переменную и не присваиваем ей никакого значения, то компилятор сделает это за нас и присвоит значение по умолчанию. Для float это будет 0f. Для Rigidbody2D это будет null (отсутствие ссылки, пустота).
Естественно с пустотой работать не получится и строчкой кода:
rb = GetComponent<Rigidbody2D>();
мы присваиваем переменной rb типа Rigidbody2D значение конкретного Rigidbody2D.
Компилятор не может сам догадаться о каком именно Rigidbody2D идет речь, потому что мы можем хотеть работать с компонентом Rigidbody2D, подключенном к другому игровому объекту (или даже создать новый Rigidbody2D). Например, мы могли использовать такую строчку кода, что бы подключить к переменной rb компонент Rigidbody2D с игрового объекта с тегом Enemy:
rb = GameObject.FindWithTag("Enemy").GetComponent<Rigidbody2D>();
PS: этот мой первый ответ на этом сайте, дайте знать если я сделал что-то не так.