Где надо изменить код чтоб исчезли эти ошибки
Ошибки:
- 'Doors.collider' hides inherited member 'Component.collider'. Use the new keyword if hiding was intended. (Doors название класса)
- An object reference is required for the non-static field, method, or property 'Component.transform'
Я сильно еще не разбираюсь в кодинге, и хотел бы узнать мой косяк в данном коде. Заранее спасибо.
public class Doors: MonoBehaviour
{
private const float OPENABLE_DISTANCE = 1.5f;
private static bool isOpened;
private static SpriteRenderer rend;
private static BoxCollider2D collider;
[SerializeField] private Sprite OpenedDoor, ClosedDoor;
private void Awake () {
rend = GetComponent<SpriteRenderer>();
collider = GetComponent<BoxCollider2D>();
}
private void Update () {
if (Input.GetKeyDown(KeyCode.E)) {
float dist = Vector3.Distance(transform.position, PlayerMovement.transform.position);
if (dist <= OPENABLE_DISTANCE) {
MoveDoor(!isOpened);
}
}
}
private void MoveDoor (bool open) {
if (open) {
rend.sprite = OpenedDoor;
collider.enabled = false;
}
else {
rend.sprite = ClosedDoor;
collider.enabled = true;
}
}
}
Ответы (3 шт):
'Doors.collider' hides inherited member 'Component.collider'. Use the new keyword if hiding was intended. (Doors название класса)
У вас в классе Doors уже есть готовый collider, доставшийся ему от класса-предка, не нужно объявлять его заново как статическое поле класса.
An object reference is required for the non-static field, method, or property 'Component.transform'
Если я правильно понял, вам нужно инициализировать transform в конструкторе класса, так же как вы это делаете с collider, например. Но я не настолько хорошо знаю Unity, могу тут и ошибаться. Ошибки должны быть представлены в вопросе в виде стек-трейса, чтобы было понятно, к каким строкам кода они относятся. У вас непонятно.
Ответ на 1
Вы создаёте новое поле collider и этим скрываете унаследованный от класса Component поле с таким же названием, Вам необходимо переименовать поле под другим названием, к примеру: boxCollider2D и тому подобное по усмотрению, и использовать эту переменную далее.
Пример:
private BoxCollider2D _boxCollider2D;
private void Start()
{
_boxCollider2D.enabled = true;
}
Ответ на 2
Вы хотите получить transform у класса без обьявления его на сцене, напрямую через класс, Вам нужно его проинициализировать, и использовать ссылку на обьект, создайте поле для PlayerMovement, перетащите в инспекторе обьект с таким компонентом внутри, и используйте это поле, и используйте эту переменную далее
Пример:
[SerializeField] private PlayerMovement _playerMovement;
private void Start()
{
_playerMovement.transform.position = transform.position
}
Написал код. Он сработал. Спасибо кто помог с решением ошибки!
public class DoorOpens: MonoBehaviour
{
private const float openableDistance = 1.5f;
private static BoxCollider2D collider;
private static SpriteRenderer sr;
[SerializeField] private Sprite OpenedDoor, ClosedDoor;
[SerializeField] private PlayerMovement playerMovement;
private void Awake() {
sr = GetComponent<SpriteRenderer>();
collider = GetComponent<BoxCollider2D>();
}
private void Update() {
if (Input.GetKeyDown(KeyCode.E)) {
float dist = Vector3.Distance(transform.position, playerMovement.transform.position);
if (dist <= openableDistance) {
SetStay();
}
}
}
private void SetStay() {
if (collider.enabled == true) {
sr.sprite = OpenedDoor;
collider.enabled = false;
}
else if (collider.enabled == false) {
sr.sprite = ClosedDoor;
collider.enabled = true;
}
}
}