Добрый день. Продолжая тему уважаемого seamen по поводу принципов ООП тут не могу не затронуть тему морфинга кода логики в объектах. В C# данный принцип реализуется посредством делегатов. Статей написано немало, а из меня плохой писатель поэтому вкратце и на пальцах: Делегат, это назначаемый метод класса, который можно изменять по ходу выполнения программы пример псевдокода: class груз{ public delegate void move();
public void Квадратное(){ таскаем...} public void Круглое (){ катаем...} move _груз; public Go(){ _груз = new move(Квадратное); } }
в итоге получим выполнение для квадратного груза. если в процессе выполнения груз поменяется на круглый, то достаточно будет переназначить делегата.
Это как говорится 1я ступень.
Вторая ступень. тут все просто. теперь едем дальше например поведение объекта нужно описать вне рамок данного класса. (классов может быть много, но не все они могут быть наследованы друг от друга. (и человек падает - разбивается, и ваза стеклянная - падает разбивается, а делать и человека и вазу родственным какому-то классу предку - абсурд) ) В этом случае достаточно вынести методы в отдельный класс и рожать делегата уже от другого класса. все очень просто. Достаточно полностью вписать имя класса, где метод описан. Главное чтобы совпадали параметры и возвращаемое значение:
Код
using UnityEngine; using System.Collections; public class SphScript : MonoBehaviour { delegate string Printing(string s); // Use this for initialization void Start () { Printing weather;
if (true /* weather is fine*/) { weather = new Printing(SunStatus.SunIsShining);
} else { weather = new Printing(SunStatus.SunWasHiden); }
weather("And Im Happy"); } } public class SunStatus{ public static void SunIsShining(string _str){ Debug.Log("Sun Is Shining "+_str);} public static void SunWasHiden(string _str){ Debug.Log("Sun was hidden "+_str);}
}
Это как говорится 2я ступень.
Третья ступень. Ну ок... собрали значит проект, напихали в него логику поведения, а что если вы делали towerDef. но все монстры ходили по прямой, а вам ввести в проект нового монстра, чтобы он не по прямой ходил, а больше кругами. А проект большой.. 50 человек делают пересобирать его не хочется. Текстуры там модели и тд. все из бандлов получается. тут все ок. А скрипты? И тут очень пригождается возможность логику кода засунуть в DLL.
в монодевелопе создаем отдельный проект.
Пихаем следующий код туда.
Код
public class SunStatus{ public static string SunIsShining(string _str){ return ("Sun Is Shining "+_str);} public static string SunWasHiden(string _str){ return ("Sun was hidden "+_str);}
}
Здесь методы класса уже ничего на консоль не выводят, а только меняют данные и возвращают значения. Это сделано, чтобы добиться максимальной совместимости (не проверял ) на разных платформах
устанавливаем опции
Готовый DLL складываем в assets, и все, можно пользоваться классами из DLL
Четвертая ступень. До четвертой ступени не доковырял, но по идее dll должна подгружаться и методы экземпляров классов должны изменяться согласно загруженной DLL.
Теперь вопрос, как говорится, на рожна? Опять таки создание и совершенствование ИИ для противников и окружения. Можно писать интересные классы контейнеры позволяющие делать собств систему плагинов, но это уже больше для прикладного программирования
Чем могу как грится..
seamenу спасибо, что своим постом спровоцировал сначала дискуссию а потом написание моего поста. Материалы по делегатам: http://professorweb.ru/my/csharp/charp_theory/level10/10_1.php http://habrahabr.ru/post/143925/ http://msdn.microsoft.com/ru-ru/library/ms173171.aspx
Сообщение отредактировал Ranger - Четверг, 21 Ноября 2013, 19:09