|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
21.02.2013, 21:16
|
#31
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
1. Все скрипты проекта компилируются одновремено. Так что наследники получат все что имеет класс Unit в не зависимости в каком файле или папке проекта ты его создашь. Главное чтобы скрипты User и AI были в файлах с соответствующим именем (потому что их надо вешать на объекты как скрипты).
2. В функцию MoveUnit(Unit unit) можно будет передать и экземпляр AI и User т.к. они оба будут наследниками Unit.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.02.2013, 21:21
|
#32
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Передача переменной в метод
в какой момент инициализируется связи между классами
|
В момент компиляции.
должен запуститься какой-то базовый скрипт, в котором и будет объявлены все наследуемые классы и интерфейсы
|
Ну компилятор (Моно) можно назвать таким "скриптом".
как быть с такими межскриптовыми связями наследования
|
Просто использовать. Все открытое в классе-родителе доступно в классе-потомке.
где этот базовый класс должен быть объявлен
|
В проекте. Если чисто базовый класс Вам не нужен можно его ни на какой ГО не вешать.
Последний вопрос не понял.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.02.2013, 22:29
|
#33
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Хм, пробую передать в метод переменную через интерфейс, компилятор ругается что я пытаюсь передать field как property, понимаю что несоответствие типов, тогда мне либо поле нужно объявить как свойство, либо научиться их передавать. Ниже скрипт (понимаю что много огорода). Задача передать интерфейсом поле UnitAngleNS и увеличить на 1. Для теста само собой.
using UnityEngine; using System.Collections; public interface IMoveDirection { int Direction {get; set;} } public class MoveGamer : MonoBehaviour, IMoveDirection { public bool UnitIsMove = false; // Движется ли юнит? public float UnitCurrentAngle = 100f; // Скорость вращения юнита public Vector3 UnitRotatingVector, UnitRotationPoint; // Вектор вращения и точка вращения юнита public bool UnitSetMove = true; // Переменная отвечающая за инициализацию вектора public int UnitAngleNS, UnitAngleEW = 0; // Текущие углы поворота север-юг/запад-восток. Исходные углы = 0, Север+, Юг-, Восток-, Запад+ public string UnitDirection; // Направление движения public int UnitXPos, UnitYPos; public int Direction { get{ return Direction;} set{ Direction = value;} } // Use this for initialization void Start () { } // Update is called once per frame void Update () { UnitWaitMove (); // Юнит ожидает движение } public void UnitWaitMove () { // Блок выбора направления движения if ((Input.GetKeyDown(KeyCode.W)) & !(UnitIsMove)) UnitDirection = "North"; // север if ((Input.GetKeyDown(KeyCode.S)) & !(UnitIsMove)) UnitDirection = "South"; // юг if ((Input.GetKeyDown(KeyCode.D)) & !(UnitIsMove)) UnitDirection = "East"; // восток if ((Input.GetKeyDown(KeyCode.A)) & !(UnitIsMove)) UnitDirection = "West"; // запад if (UnitDirection != "") UnitSetMove = true; // Если команда задана, то инициировать вектор поворота if (UnitSetMove) RotatePlayerUnit(MoveGamer.UnitAngleNS); } public void RotatePlayerUnit(Direction MoveGamer) { MoveGamer.Direction++; } } }
|
(Offline)
|
|
21.02.2013, 22:37
|
#34
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Direction в твоем случае свойство типа int (как поле), а не тип переменной который можно передавать в функицю. Правильно
вот так:
public void RotatePlayerUnit(IMoveDirection toMove) { toMove.Direction++; }
|
(Offline)
|
|
21.02.2013, 22:51
|
#35
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Хм, а как быть с переменной UnitAngleNS которую я хотел передать или я интерфейс вообще не в ту степь повел? получается передаем свойство, но оно пустое и самодостаточное, как в него положить нужную мне переменную?
|
(Offline)
|
|
21.02.2013, 23:16
|
#36
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Ты все еще привязываешь себя к переменным. Но теперь ты можешь передать объекты, обладающие одинаковыми свойствами в функцию обработки. Пусть функция меняет эти свойства объектов, а не непонятные переменные.
И на сколько я понял ты немного не так применил интерфейс.
public class User : MonoBehaviour, IMoveDirection {
private int direction; public int Direction { get{ return direction;} set{ direction = value;} }
public class AI: MonoBehaviour, IMoveDirection {
private int direction; public int Direction { get{ return direction;} set{ direction = value;} }
и тогда твоя функция будет вращать/двигать оба этих объекта используя интерфейс для свойства Direction.
вот так:
public void RotatePlayerUnit(IMoveDirection toMove) { toMove.Direction++; }
RotatePlayerUnit(экземпляр_AI_или_User );
PS: private int direction; - это локальная переменная является хранилищем значения. Свойство само по себе это два метода, которые позволяют читать и записывать это значение и если надо делать какие-то дополнительные действия при чтении и сохранении.
|
(Offline)
|
|
21.02.2013, 23:53
|
#37
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
фух, разобрался с реализацией интерфейса при передаче в него одного свойства. Действительно зациклился на переменных, использование свойств более удобно (ура! +1 к опыту программирования).
Но теперь возник вопрос, а как быть если у объекта (this) есть два свойства и надо выборочно передать в метод лишь одно из них, ну или изменить одно из них?
Создал свойства DirectionNS и DirectionEW у объекта, изначально равны нулю. При передаче в метод RotatePlayerUnit надо увеличить либо одно из них, либо второе в зависимости от значения переменной UnitDirection. Есть способ?
using UnityEngine; using System.Collections;
public interface IMoveDirection { int Direction {get; set;} }
public class MoveGamer : MonoBehaviour, IMoveDirection { public bool UnitIsMove = false; // Движется ли юнит? public float UnitCurrentAngle = 100f; // Скорость вращения юнита public Vector3 UnitRotatingVector, UnitRotationPoint; // Вектор вращения и точка вращения юнита public bool UnitSetMove = true; // Переменная отвечающая за инициализацию вектора public string UnitDirection; // Направление движения public int UnitXPos, UnitYPos; public int directionNS = 0; // Текущие углы поворота север-юг/запад-восток. Исходные углы = 0, Север+, Юг-, Восток-, Запад+ public int DirectionNS { get{ return directionNS;} set{ directionNS = value;} } public int directionEW = 0; // Текущие углы поворота север-юг/запад-восток. Исходные углы = 0, Север+, Юг-, Восток-, Запад+ public int DirectionEW { get{ return directionEW;} set{ directionEW = value;} } // Use this for initialization void Start () { } // Update is called once per frame void Update () { UnitWaitMove (); // Юнит ожидает движение } public void UnitWaitMove () { // Блок выбора направления движения if ((Input.GetKeyDown(KeyCode.W)) & !(UnitIsMove)) UnitDirection = "North"; // север if ((Input.GetKeyDown(KeyCode.S)) & !(UnitIsMove)) UnitDirection = "South"; // юг if ((Input.GetKeyDown(KeyCode.D)) & !(UnitIsMove)) UnitDirection = "East"; // восток if ((Input.GetKeyDown(KeyCode.A)) & !(UnitIsMove)) UnitDirection = "West"; // запад if (UnitDirection != "") UnitSetMove = true; // Если команда задана, то инициировать вектор поворота if ((UnitIsMove) & ((UnitDirection == "North") && (UnitDirection == "South"))) RotatePlayerUnit(this.directionNS); if ((UnitIsMove) & ((UnitDirection == "East") && (UnitDirection == "West"))) RotatePlayerUnit(this.directionEW); } public void RotatePlayerUnit(IMoveDirection toMove) { //float UnitAngle; //if (UnitSetMove) //{ //UnitRotationPoint = new Vector3(transform.position.x, transform.position.y - 0.5f, transform.position.z + 0.5f); //UnitRotatingVector = new Vector3(1,0,0); //UnitSetMove = !UnitSetMove; //} //transform.RotateAround(UnitRotationPoint, UnitRotatingVector, UnitCurrentAngle * Time.deltaTime); //UnitAngle = transform.eulerAngles.x; //if (UnitAngle == 90f) //{ //transform.rotation = Quaternion.Euler(90,transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z); //UnitIsMove = false; toMove.Direction++; //} } }
|
(Offline)
|
|
22.02.2013, 01:24
|
#38
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Я вероятно все еще не понимаю что за система у тебя, что она просто меняет переменные не зная что она меняет и все счастливы) Ты все еще держишься за изменение переменных и интерфейс не применяешь как таковой.
По коду
// Блок выбора направления движения if ((Input.GetKeyDown(KeyCode.W)) & !(UnitIsMove)) UnitDirection = "North"; // север if ((Input.GetKeyDown(KeyCode.S)) & !(UnitIsMove)) UnitDirection = "South"; // юг if ((Input.GetKeyDown(KeyCode.D)) & !(UnitIsMove)) UnitDirection = "East"; // восток if ((Input.GetKeyDown(KeyCode.A)) & !(UnitIsMove)) UnitDirection = "West"; // запад
Вот этот код выше присваивает переменной UnitDirection одно из значений North/South/East/West и следовательно ни одно из следующих условий не сработает, т.к. в условии обязательно в переменной наличие двух значений, что можно сделать только битовыми флагами, а не строками.
if ((UnitIsMove) & ((UnitDirection == "North") && (UnitDirection == "South"))) RotatePlayerUnit(this.directionNS); if ((UnitIsMove) & ((UnitDirection == "East") && (UnitDirection == "West"))) RotatePlayerUnit(this.directionEW);
Вот тут есть пример по перечислениям с битовыми флагами: http://msdn.microsoft.com/ru-ru/libr...attribute.aspx
И тут в коде нет того, что ты хочешь избежать - исключения конструкций if или case. Они есть и довольно сложные.
На мой взгляд твоя задача сводится к следующему:
public int RotatePlayerUnit(int toMove) { return toMove++; }
this.directionEW = RotatePlayerUnit(this.directionEW);
Т.е. обычная функция, обрабатывающая значение и возвращающая результат, который присваивается той переменной, с которой было взято исходное значение. И эту функцию можно вызвать для всех переменных, требующих изменения хоть в цикле, хоть по условию.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.02.2013, 10:49
|
#39
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
действительно, я все по ходу усложнил, положившись на понимание интерфейсов. Предложенное решение с передачей и обработкой функции - то, что надо.
Наверное еще не дорос я до оптимизации реализации кода, ну да ладно, буду стремиться.
Огромное спасибо за разъяснения, вынес из топика очень много нового!
|
(Offline)
|
|
25.02.2013, 11:21
|
#40
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Еще один вопрос для понимания алгоритмов, как я понял при организации классов в Unity переменные следует использовать для расчетов, а свойства для хранения параметров игровх объектов.
А моей ошибкой было то, что я хранил значения параметров в переменных так? Т.е. если я переведу все необходимые параметры в свойства то смогу гораздо проще обрабатывать взаимодействия объектов?
и еще пара вопросов:
- что еще может содержать в себе свойство кроме значений? (или только значения?)
- может ли одно свойство содержать в себе несколько значений?
Понимаю что вопросов много, но они неизбежно возникают при изучении нового материала. Зато интересно!
|
(Offline)
|
|
25.02.2013, 11:33
|
#41
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
организации классов в Unity
|
Тут поправка на то, что организация классов не в Unity, а C#. Свойство - это поле с поддержкой выполнения операций при взятии значения и записывании (get и set). Полюс - свойство нельзя вывести в инспектор компонента как поле (это уже Unity).
Подробнее о свойствах http://msdn.microsoft.com/ru-ru/library/w86s7x04.aspx
И поле и свойство может содержать в себе экземпляр класса или структуры, который может иметь N полей. А еще они могут содержать ссылки на методы - делегаты.
|
(Offline)
|
|
25.02.2013, 12:05
|
#42
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
но чтобы вывести значение элемента свойства в инспектор в принципе можно в скрипте присвоить их значения какому-то полю, например хранилищу значения свойства? - ну для тестирования кода например
и еще разница в доступе к полям и свойствам конкретного объекта, хотел узнать так правильно? :
GameObject.Property++; //изменение свойства
GameField++; // изменение поля
А при доступе к объекту из других классов, как правильно делать подобное?
|
(Offline)
|
|
25.02.2013, 12:11
|
#43
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
По обращению свойство и поле не отличаются. Т.е. объект.свойство++ и объект.поле++ в коде записываются одинаково. Отличие в том, что в свойстве при этом сработает сначала метод get для взятия значения, а потом метод set для установки нового инкрементированного значения.
Я как-то писал маленькую статейку на тему обмена данными между скриптами
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.02.2013, 12:15
|
#44
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
полезная статья, спасибо!
|
(Offline)
|
|
26.02.2013, 23:03
|
#45
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от pax
И поле и свойство может содержать в себе экземпляр класса или структуры, который может иметь N полей. А еще они могут содержать ссылки на методы - делегаты.
|
А можно пример синтаксиса объявления свойства, которое содержит в себе экземпляр класса? Пытаюсь найти в msdn но не нахожу.
И для чего можно использовать подобное,хотя бы простенький пример?
Заранее спасибо )
На мой взгляд твоя задача сводится к следующему:
public int RotatePlayerUnit(int toMove) { return toMove++; }
this.directionEW = RotatePlayerUnit(this.directionEW);
|
Такой вопрос, конструкция заработала при использовании команды почему, ведь по идее увеличение значения должно происходить в обоих случаях? Или в первом случае сначала срабатывает return?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:15.
|