Показать сообщение отдельно
Старый 27.07.2016, 15:21   #21
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Mistshift Обучение

Ты вообще ничего пока что не понял.

Сообщение от Foxymist Посмотреть сообщение
А у меня есть скрипт “PickedEntity” он двигает сферу при клике(Камеру вокруг сферы) а вчера я продублировал его “PickedEntity1” и добавил возможность клонирования объекта(Станции - куба)
Вот и понял, что тут чтото не так, а конкретно я не использую ООП а надо бы.
Это называется Entity Component System.
У тебя на сцене есть объект и по сути это просто точка в пространстве как в блитзе пивот (CreatePivot()). На нем есть уже стандартные от юнити3д компоненты (Transform, Renderer, etc) и ты еще навешиваешь свои компоненты (скрипты), которые им или другими объектами как то манипулируют.

Сообщение от Foxymist Посмотреть сообщение
Типо. Несовсем так, вот он пишет;
https://habrahabr.ru/post/148015/
У тебя вот есть станция. Если ты захочешь добавить еще одну станцию, то ты вероятно как в блитзе начнешь писать новый код для этой станции. Но если подумать, то у станций если некоторые одинаковые возможности. Допустим стандартная возможность это продать станцию.
В случае без ООП ты будешь писать два раза функцию ПродатьСтанцию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.
Вроде можно изменять (перезаписывать) функцию в лоб просто объявив новую с таким же именем, но тогда мы потеряем возможности старой функции и это вроде не совсем правильно.

Пример не самый лучший, но возможно поможет не много разобраться.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо Nex за это полезное сообщение:
ABTOMAT (28.07.2016), Foxymist (27.07.2016), impersonalis (03.08.2016), Randomize (31.07.2016), St_AnGer (31.07.2016)