Скрыть поля в дочернем классе при наследовании

Неужели нельзя скрыть эти два поля в инспекторе дочернего класса при наследовании, не используя собственный инспектор?

Если да, то как лучше всего изменить значение currentState в классе EnemyBattleLogic?

Спасибо!

public class EnemyMoveLogic : MonoBehaviour
{
    [SerializeField, Range(1f, 10f)] internal float movingSpeed;
    [SerializeField] internal float detectionDistance;

    internal GameObject player;
    internal NavMeshAgent agent;

    internal enum CurrentState
    {
        Sleep,
        Patrol,
        Chase
    }

    internal CurrentState currentState = CurrentState.Sleep;
public class EnemyBattleLogic : EnemyMoveLogic
{
    [SerializeField, Range(1f, 5000f)] internal float health;
    [SerializeField, Range(1f, 5000f)] internal float damage;
    [SerializeField, Range(0.1f, 3f)] internal float attackSpeed;
    [SerializeField] internal float attackDistance;

Почему вы используете здесь ключевое слово internal?

Max Play 19.06.2024 15:00

вам следует спросить себя: действительно ли EnemyBattleLogic является EnemyMoveLogic, или же у него просто есть несколько общих членов и он каким-то образом использует некоторые EnemyMoveLogic? Другими словами: отдавайте предпочтение композиции, а не наследованию.

MakePeaceGreatAgain 19.06.2024 15:10

Внутренние мне нужны для доступа к полям других классов, например для отображения ХП противника, что реализуется через GetComponent. Однако я не уверен, что использование GetComponent для всего является хорошим решением.

Ilya 19.06.2024 18:42

Я бы сказал, что второй вариант правильный, сейчас проверю, спасибо!

Ilya 19.06.2024 18:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Нет, вы не можете скрыть эти поля, если унаследуете их. Попробуйте использовать разделенные компоненты, чтобы иметь разную логику и поля.
  2. Чтобы изменить текущее состояние, вы можете изменить его через инспектор, если поставите [SerealizedField], или, если оно предназначено для изменения в коде, вы можете сделать общедоступные функции, такие как SetStateSleep, SetStatePatrol и т. д. Это полезно, если вы хотите добавить вызовы событий в эти функции или какая-то другая логика в будущем.

Это были прямые ответы на ваши вопросы, но, похоже, есть несколько советов, которые помогут вам никогда не задаваться такими вопросами.

  1. Если вам не нужны какие-то переменные или логика, вам не следует их наследовать. Если вам нужна только некоторая часть полей и/или логики, вам может потребоваться разделить базовый класс, поскольку существуют разные варианты поведения. Также на вашем скриншоте я вижу EnemyMoveLogic и EnemyBattleLogic одновременно. Вы хотите изменить значения только в EnemyMoveLogic. Тогда кажется, что вы не должны унаследовать EnemyMoveLogic, а просто еще один компонент. Итак, у вас будет только это:
public class EnemyMoveLogic : MonoBehaviour
{
    [SerializeField, Range(1f, 10f)] internal float movingSpeed;
    [SerializeField] internal float detectionDistance;

    internal GameObject player;
    internal NavMeshAgent agent;

    internal enum CurrentState
    {
        Sleep,
        Patrol,
        Chase
    }

    internal CurrentState currentState = CurrentState.Sleep;

    public void SetStateSleep()
    {
        // Some other logic
        currentState = CurrentState.Sleep;
        //Some other logic
    }

    // Other State change funcs...
}

// You can also split this class as there might be units that don't attack
// absurd but happened in my game
public class EnemyUnitLogic : MonoBehaviour
{
    [SerializeField, Range(1f, 5000f)] internal float health;
    [SerializeField, Range(1f, 5000f)] internal float damage;
    [SerializeField, Range(0.1f, 3f)] internal float attackSpeed;
    [SerializeField] internal float attackDistance;
}

Есть много других идей по улучшению кода, но было бы неправильно оставлять это под этим вопросом. Это может быть огромная дискуссия. Не волнуйтесь, опыт приходит со временем.

Другие вопросы по теме