Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 21.02.2013, 21:16   #31
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

1. Все скрипты проекта компилируются одновремено. Так что наследники получат все что имеет класс Unit в не зависимости в каком файле или папке проекта ты его создашь. Главное чтобы скрипты User и AI были в файлах с соответствующим именем (потому что их надо вешать на объекты как скрипты).

2. В функцию MoveUnit(Unit unit) можно будет передать и экземпляр AI и User т.к. они оба будут наследниками Unit.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (21.02.2013)
Старый 21.02.2013, 21:21   #32
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 283
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Передача переменной в метод

в какой момент инициализируется связи между классами
В момент компиляции.
должен запуститься какой-то базовый скрипт, в котором и будет объявлены все наследуемые классы и интерфейсы
Ну компилятор (Моно) можно назвать таким "скриптом".
как быть с такими межскриптовыми связями наследования
Просто использовать. Все открытое в классе-родителе доступно в классе-потомке.
где этот базовый класс должен быть объявлен
В проекте. Если чисто базовый класс Вам не нужен можно его ни на какой ГО не вешать.
Последний вопрос не понял.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (26.02.2013)
Старый 21.02.2013, 22:29   #33
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Хм, пробую передать в метод переменную через интерфейс, компилятор ругается что я пытаюсь передать field как property, понимаю что несоответствие типов, тогда мне либо поле нужно объявить как свойство, либо научиться их передавать. Ниже скрипт (понимаю что много огорода). Задача передать интерфейсом поле UnitAngleNS и увеличить на 1. Для теста само собой.

using UnityEngine;
using System.Collections;

public interface 
IMoveDirection {
    
int Direction {getset;}
}

public class 
MoveGamer MonoBehaviourIMoveDirection {
    
    public 
bool UnitIsMove false// Движется ли юнит?
    
public float UnitCurrentAngle 100f// Скорость вращения юнита
    
public Vector3 UnitRotatingVectorUnitRotationPoint// Вектор вращения и точка вращения юнита
     
public    bool UnitSetMove true// Переменная отвечающая за инициализацию вектора
    
public int UnitAngleNSUnitAngleEW 0// Текущие углы поворота север-юг/запад-восток. Исходные углы = 0, Север+, Юг-, Восток-, Запад+
    
public string UnitDirection// Направление движения
    
public int UnitXPosUnitYPos;
    
    public 
int Direction
    
{
        
get{ return Direction;}
        
setDirection 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 (UnitSetMoveRotatePlayerUnit(MoveGamer.UnitAngleNS);    
    }
    
        
    public 
void RotatePlayerUnit(Direction MoveGamer
    {
        
MoveGamer.Direction++;
        }
    }

__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 21.02.2013, 22:37   #34
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

Direction в твоем случае свойство типа int (как поле), а не тип переменной который можно передавать в функицю. Правильно
вот так:
public void RotatePlayerUnit(IMoveDirection toMove)  
    { 
        
toMove.Direction++; 
    } 
RotatePlayerUnit(this); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 21.02.2013, 22:51   #35
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Хм, а как быть с переменной UnitAngleNS которую я хотел передать или я интерфейс вообще не в ту степь повел? получается передаем свойство, но оно пустое и самодостаточное, как в него положить нужную мне переменную?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 21.02.2013, 23:16   #36
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

Ты все еще привязываешь себя к переменным. Но теперь ты можешь передать объекты, обладающие одинаковыми свойствами в функцию обработки. Пусть функция меняет эти свойства объектов, а не непонятные переменные.

И на сколько я понял ты немного не так применил интерфейс.

public class User MonoBehaviourIMoveDirection 

    private 
int direction;
    public 
int Direction 
    

        
get{ return direction;} 
        
setdirection value;} 
    } 
public class AIMonoBehaviourIMoveDirection 

    private 
int direction;
    public 
int Direction 
    

        
get{ return direction;} 
        
setdirection value;} 
    } 
и тогда твоя функция будет вращать/двигать оба этих объекта используя интерфейс для свойства Direction.

вот так:
public void RotatePlayerUnit(IMoveDirection toMove)  

    
toMove.Direction++; 

RotatePlayerUnit(экземпляр_AI_или_User ); 
PS: private int direction; - это локальная переменная является хранилищем значения. Свойство само по себе это два метода, которые позволяют читать и записывать это значение и если надо делать какие-то дополнительные действия при чтении и сохранении.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 21.02.2013, 23:53   #37
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

фух, разобрался с реализацией интерфейса при передаче в него одного свойства. Действительно зациклился на переменных, использование свойств более удобно (ура! +1 к опыту программирования).
Но теперь возник вопрос, а как быть если у объекта (this) есть два свойства и надо выборочно передать в метод лишь одно из них, ну или изменить одно из них?

Создал свойства DirectionNS и DirectionEW у объекта, изначально равны нулю. При передаче в метод RotatePlayerUnit надо увеличить либо одно из них, либо второе в зависимости от значения переменной UnitDirection. Есть способ?

using UnityEngine;
using System.Collections;

public interface 
IMoveDirection {
    
int Direction {getset;}
}

public class 
MoveGamer MonoBehaviourIMoveDirection {
    
    public 
bool UnitIsMove false// Движется ли юнит?
    
public float UnitCurrentAngle 100f// Скорость вращения юнита
    
public Vector3 UnitRotatingVectorUnitRotationPoint// Вектор вращения и точка вращения юнита
     
public    bool UnitSetMove true// Переменная отвечающая за инициализацию вектора
    
    
public string UnitDirection// Направление движения
    
public int UnitXPosUnitYPos;
    
    public 
int directionNS 0// Текущие углы поворота север-юг/запад-восток. Исходные углы = 0, Север+, Юг-, Восток-, Запад+
    
public int DirectionNS 
    

        
get{ return directionNS;} 
        
setdirectionNS value;} 
    }
    
    public 
int directionEW 0// Текущие углы поворота север-юг/запад-восток. Исходные углы = 0, Север+, Юг-, Восток-, Запад+
    
public int DirectionEW 
    

        
get{ return directionEW;} 
        
setdirectionEW 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++;
        
//}
    
}

__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 01:24   #38
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

Я вероятно все еще не понимаю что за система у тебя, что она просто меняет переменные не зная что она меняет и все счастливы) Ты все еще держишься за изменение переменных и интерфейс не применяешь как таковой.

По коду
// Блок выбора направления движения
        
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); 
Т.е. обычная функция, обрабатывающая значение и возвращающая результат, который присваивается той переменной, с которой было взято исходное значение. И эту функцию можно вызвать для всех переменных, требующих изменения хоть в цикле, хоть по условию.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (22.02.2013)
Старый 22.02.2013, 10:49   #39
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

действительно, я все по ходу усложнил, положившись на понимание интерфейсов. Предложенное решение с передачей и обработкой функции - то, что надо.
Наверное еще не дорос я до оптимизации реализации кода, ну да ладно, буду стремиться.

Огромное спасибо за разъяснения, вынес из топика очень много нового!
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 25.02.2013, 11:21   #40
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Еще один вопрос для понимания алгоритмов, как я понял при организации классов в Unity переменные следует использовать для расчетов, а свойства для хранения параметров игровх объектов.
А моей ошибкой было то, что я хранил значения параметров в переменных так? Т.е. если я переведу все необходимые параметры в свойства то смогу гораздо проще обрабатывать взаимодействия объектов?

и еще пара вопросов:
- что еще может содержать в себе свойство кроме значений? (или только значения?)
- может ли одно свойство содержать в себе несколько значений?

Понимаю что вопросов много, но они неизбежно возникают при изучении нового материала. Зато интересно!
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 25.02.2013, 11:33   #41
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

организации классов в Unity
Тут поправка на то, что организация классов не в Unity, а C#. Свойство - это поле с поддержкой выполнения операций при взятии значения и записывании (get и set). Полюс - свойство нельзя вывести в инспектор компонента как поле (это уже Unity).
Подробнее о свойствах http://msdn.microsoft.com/ru-ru/library/w86s7x04.aspx

И поле и свойство может содержать в себе экземпляр класса или структуры, который может иметь N полей. А еще они могут содержать ссылки на методы - делегаты.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 25.02.2013, 12:05   #42
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

но чтобы вывести значение элемента свойства в инспектор в принципе можно в скрипте присвоить их значения какому-то полю, например хранилищу значения свойства? - ну для тестирования кода например

и еще разница в доступе к полям и свойствам конкретного объекта, хотел узнать так правильно? :
GameObject.Property++; //изменение свойства
GameField++; // изменение поля

А при доступе к объекту из других классов, как правильно делать подобное?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 25.02.2013, 12:11   #43
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,566
Написано 3,004 полезных сообщений
(для 5,317 пользователей)
Ответ: Передача переменной в метод

По обращению свойство и поле не отличаются. Т.е. объект.свойство++ и объект.поле++ в коде записываются одинаково. Отличие в том, что в свойстве при этом сработает сначала метод get для взятия значения, а потом метод set для установки нового инкрементированного значения.

Я как-то писал маленькую статейку на тему обмена данными между скриптами
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (25.02.2013)
Старый 25.02.2013, 12:15   #44
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

полезная статья, спасибо!
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 26.02.2013, 23:03   #45
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Сообщение от pax Посмотреть сообщение
И поле и свойство может содержать в себе экземпляр класса или структуры, который может иметь N полей. А еще они могут содержать ссылки на методы - делегаты.
А можно пример синтаксиса объявления свойства, которое содержит в себе экземпляр класса? Пытаюсь найти в msdn но не нахожу.
И для чего можно использовать подобное,хотя бы простенький пример?

Заранее спасибо )

На мой взгляд твоя задача сводится к следующему:

public int RotatePlayerUnit(int toMove
{
        return 
toMove++;

this.directionEW RotatePlayerUnit(this.directionEW); 
Такой вопрос, конструкция заработала при использовании команды
return ++toMove
почему, ведь по идее увеличение значения должно происходить в обоих случаях? Или в первом случае сначала срабатывает return?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 01:46.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com