Неужели нельзя скрыть эти два поля в инспекторе дочернего класса при наследовании, не используя собственный инспектор?
Если да, то как лучше всего изменить значение 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;
вам следует спросить себя: действительно ли EnemyBattleLogic
является EnemyMoveLogic
, или же у него просто есть несколько общих членов и он каким-то образом использует некоторые EnemyMoveLogic
? Другими словами: отдавайте предпочтение композиции, а не наследованию.
Внутренние мне нужны для доступа к полям других классов, например для отображения ХП противника, что реализуется через GetComponent. Однако я не уверен, что использование GetComponent для всего является хорошим решением.
Я бы сказал, что второй вариант правильный, сейчас проверю, спасибо!
[SerealizedField]
, или, если оно предназначено для изменения в коде, вы можете сделать общедоступные функции, такие как SetStateSleep
, SetStatePatrol
и т. д. Это полезно, если вы хотите добавить вызовы событий в эти функции или какая-то другая логика в будущем.Это были прямые ответы на ваши вопросы, но, похоже, есть несколько советов, которые помогут вам никогда не задаваться такими вопросами.
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;
}
Есть много других идей по улучшению кода, но было бы неправильно оставлять это под этим вопросом. Это может быть огромная дискуссия. Не волнуйтесь, опыт приходит со временем.
Почему вы используете здесь ключевое слово
internal
?