Ты вообще ничего пока что не понял.
Сообщение от Foxymist
А у меня есть скрипт “PickedEntity” он двигает сферу при клике(Камеру вокруг сферы) а вчера я продублировал его “PickedEntity1” и добавил возможность клонирования объекта(Станции - куба)
Вот и понял, что тут чтото не так, а конкретно я не использую ООП а надо бы.
|
Это называется Entity Component System.
У тебя на сцене есть объект и по сути это просто точка в пространстве как в блитзе пивот (CreatePivot()). На нем есть уже стандартные от юнити3д компоненты (Transform, Renderer, etc) и ты еще навешиваешь свои компоненты (скрипты), которые им или другими объектами как то манипулируют.
Сообщение от Foxymist
|
У тебя вот есть станция. Если ты захочешь добавить еще одну станцию, то ты вероятно как в блитзе начнешь писать новый код для этой станции. Но если подумать, то у станций если некоторые одинаковые возможности. Допустим стандартная возможность это продать станцию.
В случае без ООП ты будешь писать два раза функцию ПродатьСтанцию1() и ПродатьСтанцию2().
С ООП ты можешь сделать базовый класс для станций.
public class Station {
protected int cost = 100 // цена станции
public virtual void Sell(){ // функция продажи станции
playerMoney += cost / 2; // возвращаем половину цены за станцию в казну
}
}
Далее код станции Харвестера:
// создаем новый класс для Харвестера
public class StationHarvester : Station { // и наследуем возможности из класса "Station"
// и вдруг оказалось, что Харвестер при постройке занимает
// 10 единиц электричества (привет Red Alert, C&C: Generals)
// и соответственно нужно возвращать в казну эти 10 единиц электричества, но
// в базовой функции продажи такой возможности нет. Поэтому нужно изменить функцию (перезаписать).
public override void Sell(){
playerEnergy += 10; // новая возможность (возвращение энергии)
base.Sell(); // и при этом через base.Sell() мы вызываем стандартную функцию продажи, которая
// возвращает деньги за станцию.
}
}
1. Меньше кода нужно писать ведь функция Sell может быть огромная, а тут изменили одну строку при той же
функциональности.
2. Если нужно все переделать, то это будет легко и все внезапно не перестанет работать так как все
разложено по полочкам (по классам), а не как в Блитзе все в одной куче.
Главное не слишком увлекаться "разбиением" по классам и функциям. Еще есть интерфейсы, но это уже другая история.
playerEnergy += 10; -
"+=" это тоже самое, что и
"playerEnergy = playerEnergy + 10;"
virtual - это ключевое слово значит, что если это класс кто-то наследует, то эту функцию можно изменить.
override - это ключевое слово значит, что мы изменяем (перезаписываем) функцию, которая кстати должна быть помечена ключевым словом
virtual.
Вроде можно изменять (перезаписывать) функцию в лоб просто объявив новую с таким же именем, но тогда мы потеряем возможности старой функции и это вроде не совсем правильно.
Пример не самый лучший, но возможно поможет не много разобраться.