Объектно ориентированное программирование в Unreal Объектно ориентированное программирование (или ООП) является другим способом рассматривания структуры кода. Идея основанная вокруг понятия объекта, который является составной частью большего целого. Объект состоит из методов и свойств. "Метод" является функцией или процедурой, тогда как свойство является переменной. Представим пистолет. Пистолет имеет методы которые могут вызываться; мы сосредоточимся на методе "fireme" (стреляй из меня). Для того чтобы стрелять из пистолета, пользователь должет вызвать метод. Рассмотрим также, что пистолет имеет "свойства", такие как number_of_rounds (количество патронов). Методы могут быть частными или общими (private или public)(есть другие ключевые слова для обозначения, но давайте придерживаться этих). Private значит, что метод может быть вызван только объектом вызывающим его. Т.е. пистолет имеет "внутренние" методы которые хочется спрятать от пользователя обеспечив простоту использования. Пистолет должен проверить_патроны (check_rounds), поднять_пистолет (cock_pistol) и нажать_на_спусковой_крючок (pull_trigger). Все это является частными действиями, которые пистолет должет делать чтобы стрелять. Но пользователь просто хочет знать как пистолет стреляет. Поэтому пистолет делает метод fire_me общим, этот метод вызывает другие методы без ведома пользователя (инкапсуляция). Таким образом, вы может определить объекты по их методам и свойствам, т.е. Gun_Object ================================= +Properties - Number_of_rounds (private) +Methods - Fire_Me (public) - Check_Rounds (public) - Cock_Pistol (private) - Pull_Trigger (private) End of Gun_Object =========================== Check_Rounds (проверить_патроны) является интересным методом, т.к. пользователь может фактически захотеть подсчитать количество патронов оставшихся в пистолете перед тем как он будет стрелять. Метод является общим. Он является хорошим примером объектной ориентации, чтобы непосредственно подавить доступ к свойствам. Вместо этого свойства устанавливаются и получается их значения методом. В случае нашего пистолета, метод Check_Rounds (проверить_патроны) получает number_of_rounds (количество патронов). Если бы мы имели метод "reload" (перезарядить), был бы метод устанавливающий свойство. Что такое классы, packages и расширение ? Мы пошли немного неправильным путем, повернув в момент, пытаясь определиться с термином "объект". О чем мы фактически говорили когда мы рассматривали структуру объекта являющегося классом. Класс является определением объекта перед тем как объект создается (например - рождается (spawned) в UnrealScript). Объект существует только во время выполнения. Подумаем об этом несколько подругому. Когда вы видите скаржа в Unreal, он является объектом - он существует в игре. Тем не менее, если скарж еще не существует, откуда придет информация чтобы создать объект? Как он узнает когда создаваться? Ответ лежит в классе - класс является шаблоном для объекта который сидит в памяти. Когда объект создается, он использует класс чтобы выяснить как создавать его. Поэтому когда вы программируете в UnrealScript (и Java, и C++) вы фактически пишите класс, т.е.: class myGun expands unrealGun package myWeapon; Расширение? Я слышу как вы говорите? Расширение является одной из крутых особенностей объектно ориентированного программирования. Что вы собираетесь делать расширением существующего класса (шаблоном объекта) и добавлением новой функциональности в него, таким образом создавая новый класс, но со всем уже существующем кодом в нем. И самой лучшей вещью является то, что вы не видете код который вы копируете! Он просто присваивается тем методам и свойствам которые являются теми же самыми из расширяемого класса. В манере ООП, то что вы делаете является созданием дочернего класса из родительского. Дочерний наследует родительскую функциональность. Постойте минуту, я слышу как вы говорите, как я потом сделаю мой класс отличным от существующего класса? Хорошо, вы можете добавить методы и свойства просто, как если бы вы создавали новый класс сначала - или воспользуйтесь "полиморфизмом". Полиморфизм является понятием ООП для изменения в вашем классе, некоторые из существующей функциональности в родительском классе. Заметьте, что это не изменяет родительский класс, только ваш класс. Полиморфизм в действии называется "подавлением функции". В основном, вы объявляете метод, который уже существует в родительском классе, в вашем классе и затем добавляете код который вы хотите выполнять когда метод вызывается. Для того чтобы вызвать родительскую функцию внутри вашей новой функции, вы используете ключевое слово "super", т.е.: function FireMe() { //вы можете сделать ваши изменения здесь super.FireMe(); //или здесь, это не имеет значения } Наконец, packages. Package это группа родственных классов. Когда вы определяете что класс myGun из package myWeapon, вы говорите, что класс принадлежит этому собранию. Это способ организации модов и другого программного обеспечения. Использование ООП в UnrealScript Вы знаете что такое класс и его связь с объектами. Вы знаете как изменить класс для того чтобы дать ему новую функциональность и изменить существующую функциональность (полиморфизм). Вы знаете чтобы держать похожие объекты вместе, вы используете packages. Вы возможно хотите знать как это связано с UnrealScript и построить ваш собственный мод, разве не так? В майл листе посвященного программированию на PlanetUnreal была последняя дискуссия как сделать это. Появилось несколько методов. 1. Вытащите существующий код и замените его вашим кодом. 2. Используйте ключевое слово SUMMON чтобы создать ваш собственный объект Хм, первый пункт точно не в стиле ООП. Это значит, что вы должны редактировать исходный код (как вы делали в Quake2) чтобы создать фундаментальное изменение игровой логики. Фактически, для того чтобы запустить мод таким образом вам надо классифицировать весь код который изменился и вам надо заменить существующие файлы, когда вы будет инсталлировать мод. Лучший способ чтобы сделать это, спасибо Tim Sweeney, использовать команду SUMMON. Команда SUMMON создает объект в игре прямо напротив вас. Ваш объект - получите его? Как отличительная черта, объекты в UnrealScript включают метод "beginplay", который выполняется когда объект создается. Если вы используете некоторый код чтобы заменить ваш объект другим объектом в игре (используя функцию foreach, копируя данные места расположения и затем создавая ваш объект во время уничтожения другого) вы может эффективно моделировать изменение характеристик оружия (или любого объекта). Спасибо Tim за этот метод. В заключении... Прежде чем вы броситесь в работу прямо сейчас, потратьте время чтобы обнаружить некоторые нюансы, которые существуют в примерах ООП на UnrealScript. Посмотрите руководство по ООП by GreenMarine на http://www.planetquake.com/osp. Если будут вопросы шлите их мне. Я могу попытаться послать ответ когда я буду иметь время, но давайте посмотрим что случится.