|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
27.02.2013, 07:14
|
#46
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
public class VarsHolder{ public int var1; public string var2;}
public class MyClass{ public VarsHolder myValues = new VarsHolder();
}
...
void Start() { myValues.var1++; }
По поводу префиксной записи инкремента - префиксная запись сначала делает инкремент, потом возвращает это значение, постфиксная - как я написал теряет значение, потому что сначала возвращает старое значение, потом делает инкремент.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2013, 16:45
|
#47
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Вопрос про перечисление.
Есть у меня перечисление следующего вида:
public enum Sector {SectorI, SectorII, SectorIII}
каким способом присваивать переменной конкретное значение перечисления я понял:
SomeParameter = (int)Sector.SectorI;
А вот вопрос, как увеличить значение перечисления на 1? Независимо от текущего значения?
Я хочу достигнуть циклического параметра, т.е. при текущем значении пересечения SectorI он превращался в SectorII а из него в SectorIII и затем снова в SectorI. В справке не нашел способа как менять значение на следующее в списке перечисление (аналогично на предыдущее).
Пробую так:
if (Input.GetKeyDown(KeyCode.Space)) Sector = (Sector) (int) Sector++;
но компилятор матерится, и до сих пор не понял как извлечь значение текущего пересечения и допустим присвоить его другой переменной?
|
(Offline)
|
|
03.03.2013, 16:52
|
#48
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Передача переменной в метод
это как самое простое и по хардкору
Sector var1=Sector.SectorI; int value=(int)var1; value+=1; if(value>(int)Sector.SecotrIII) value=0; var1=(Sector)value;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2013, 17:05
|
#49
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от Dream
это как самое простое и по хардкору
Sector var1=Sector.SectorI; int value=(int)var1; value+=1; if(value>(int)Sector.SecotrIII) value=0; var1=(Sector)value;
|
спасибо, в принципе решение устраивает. Модернизировал вот так, чтобы не сбивался счетчик:
if (Input.GetKeyDown(KeyCode.Space)) { Sec = (int)CurrentSectorNS; Sec += 1; CurrentSectorNS = (Sector)Sec; if (Sec > (int)Sector.SectorIII) { CurrentSectorNS = Sector.SectorI; Sec = 0; } }
|
(Offline)
|
|
03.03.2013, 17:22
|
#50
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
новая беда, где то туплю видимо.
выделил увеличение перечисления в отдельный метод, но он перестал из-за этого работать. Не могу понять что за фигня. Цель одним и тем же методом вертеть три перечисления:
using UnityEngine; using System.Collections; public class Unit : MonoBehaviour { } public class MoveGamer : Unit { public enum Sector {SectorI, SectorII, SectorIII} // Ориентация секторов для определени углов поворота public Sector CurrentSectorNS, CurrentSectorWE, CurrentSectorAround; // хранилища пересечений, Сектор текущего поворота по осям Север-Юг, Запад-Восток, Вокруг себя public int Sec; // отладка // Use this for initialization void Start () { CurrentSectorNS = CurrentSectorWE = CurrentSectorAround = Sector.SectorI; } // Update is called once per frame void Update () { UnitWaitMove (); // Юнит ожидает движение } public void UnitWaitMove () { if (Input.GetKeyDown(KeyCode.X)) ChangeSector (CurrentSectorNS); if (Input.GetKeyDown(KeyCode.C)) ChangeSector (CurrentSectorWE); if (Input.GetKeyDown(KeyCode.V)) ChangeSector (CurrentSectorAround); } public Sector ChangeSector(Sector ChangeSector) { Sec = (int)ChangeSector; Sec += 1; ChangeSector = (Sector)Sec; if (Sec > (int)Sector.SectorIII) { ChangeSector = Sector.SectorI; Sec = 0;} return ChangeSector; } }
|
(Offline)
|
|
03.03.2013, 17:27
|
#51
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
вопрос снят, был дураком, разобрался сам. Неправильно выполнял метод
if (Input.GetKeyDown(KeyCode.X)) CurrentSectorNS = ChangeSector(CurrentSectorNS); if (Input.GetKeyDown(KeyCode.C)) CurrentSectorWE = ChangeSector(CurrentSectorWE); if (Input.GetKeyDown(KeyCode.V)) CurrentSectorAround = ChangeSector(CurrentSectorAround);
|
(Offline)
|
|
03.03.2013, 21:55
|
#52
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Хм, опять застрял в тупике. Объявляю массив:
public int[,] AngleArray = new int[3,2]; void Start () { AngleArray[0,0] = 270; AngleArray[0,1] = 0; AngleArray[0,2] = 90; AngleArray[1,0] = 180; AngleArray[1,1] = 270; AngleArray[1,2] = 0; AngleArray[2,0] = 90; AngleArray[2,1] = 180; AngleArray[2,2] = 270; AngleArray[3,0] = 0; AngleArray[3,1] = 90; AngleArray[3,2] = 180; }
компилятор радостно машет index out of range
почему?
|
(Offline)
|
|
03.03.2013, 23:51
|
#53
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Передача переменной в метод
Максимум для твоего масива - [2,1].
Я думаю тебе стоит почитать про основы языка, чтобы не спрашивать каждый час на форуме о банальной проблеме
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.03.2013, 23:59
|
#54
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
читаю основы, но сказывается то, что раньше изучал blitz 3d, сложно сразу отвязаться от него
непонятно почему максимум [2,1] - в С# по другому задаются пределы массива?
в mdsn написано что "Индексация массивов начинается с нуля: массив с элементами n индексируется от 0 до n-1."
у меня размерность массива 4 элемента на 3 или при индексации с 0 - 3х2.
или я не так понял синтаксис?
upd: все разобрался, оказывается при объявлении массива нумерация начинается с 1, а при доступе к элементам с 0.
Не такой очевидный ньюанс, ибо в blitz объявление тоже было с 0.
|
(Offline)
|
|
04.03.2013, 00:30
|
#55
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Передача переменной в метод
При обьявлении ты указываешь размер, и от нуля до 2 какраз поучается те твои 3 элемента. протсо нужно привыкнуть. Всётаки читай msdn. Меньше вопросов будет.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.03.2013, 22:13
|
#56
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
и снова нубский вопрос (да-да, только что из справки и тестирования скрипта)
Я научился поворачивать объект с помощью rotatearound и с помощью quaternion.slerp
а теперь вопрос - как объединить эти два способа в один? Мне нужно вращать объект вокруг определенной точки в пространстве используя кватернионы (ибо с помощью углов эйлера получаю шарнирный замок в одном из положений)
вращать вокруг центра объекта - понятно как, а вот как это сделать с помощью transform.RotateAround неясно, ибо оно хочет в качестве параметров два вектора а не кватернионы.
рассматриваю вариант вращения через дочерние пивоты но мне этот метод кажется черезчур проблемным, ибо количество таких пивотов и их настройка слишком суровая заявка для простого поворота объекта на заданный угол вокруг определенной точки.
Вот если бы как то в transform.RotateAround передать кватернион либо решить проблему шарнирного замка (читал про обход проблемы через вращение матрицами, но если честно нихрена не понял).
Надеюсь хотя бы пнете в нужном направлении. ))
p.s. тему впору переименовать в нубские вопросы очередного новичка ))
|
(Offline)
|
|
04.03.2013, 22:55
|
#57
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Самое простое - поместить пустой объект в точку поворота, поместить твой объект в чайлды к пустому, повернуть пустышку как надо, вывести твой объект из чайлдов пустышки, убить пустышку.
Пустышку можно и не убивать, так будет быстрее.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.03.2013, 23:01
|
#58
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от pax
Самое простое - поместить пустой объект в точку поворота, поместить твой объект в чайлды к пустому, повернуть пустышку как надо, вывести твой объект из чайлдов пустышки, убить пустышку.
Пустышку можно и не убивать, так будет быстрее.
|
хорошая идея, спасибо! Нужно будет немного поменять скрипт но должно сработать. В принципе position для этой пустышки можно будет взять из positiona вектора для rotatearound.
А с привязкой/отвязкой дочерних объектов буду штудировать справку.
|
(Offline)
|
|
04.03.2013, 23:33
|
#59
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
transform.parent = pivot.transform сделает объект дочерним к объекту pivot
transform.parent = null - сделает объект самостоятельным
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.03.2013, 00:04
|
#60
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Третий час бьюсь над косяком в скрипте, кто поможет?
В общем задача скрипта практически завершена, но периодически появляются глюки.
Скрипт по команде кнопок WSAD (это пока-что) перекатывает юнит на соседнее поле. RotationPivot - объект который используется как точка через которую идет перекатывание.
Скрипт работает как часы, но в некоторых позициях (например при последовательности W-A-W) юнит начинает перекатываться через другую ось (а именно ось Y, хотя скрипт однозначно вращает только по X и Z) - как можно вылечить?
using UnityEngine; using System.Collections;
public class Unit : MonoBehaviour { private string UnitName; // Наименование юнита public int unitNSPosition, unitWEPosition; //Позиция юнита в координатах public Transform RotationPivot; // Точка вращения юнита public Quaternion RotateFrom, RotateTo; // Кватернионы вращения (начало-конец) }
public class MoveGamer : Unit { public bool UnitSetMove; // Переменная отвечающая за инициализацию вектора public bool UnitIsMove; // Движется ли юнит? public float UnitCurrentAngle; // Скорость вращения юнита public float CurrentUnitAngleNS, CurrentUnitAngleAround, CurrentUnitAngleWE; // Текущий уровень поворота юнита public string UnitDirection; // Направление движения public enum Sector {SectorI, SectorII, SectorIII, SectorIV} // Ориентация секторов для определени углов поворота public Sector CurrentSectorNS, CurrentSectorWE, CurrentSectorAround; // Сектор текущего поворота по осям Север-Юг, Запад-Восток, Вокруг себя void Start () { UnitCurrentAngle = 0; UnitIsMove = false; UnitSetMove = false; CurrentSectorNS = CurrentSectorWE = CurrentSectorAround = Sector.SectorI; } void Update () { UnitWaitMove (); // Юнит ожидает движение } public void UnitWaitMove () { // Блок выбора направления движения (времянка) if ((Input.GetKeyDown(KeyCode.W)) & !(UnitSetMove)) UnitDirection = "North"; // север if ((Input.GetKeyDown(KeyCode.S)) & !(UnitSetMove)) UnitDirection = "South"; // юг if ((Input.GetKeyDown(KeyCode.D)) & !(UnitSetMove)) UnitDirection = "East"; // восток if ((Input.GetKeyDown(KeyCode.A)) & !(UnitSetMove)) UnitDirection = "West"; // запад if ((UnitDirection != "") & !UnitIsMove) SetPointToRotation (); // Если команда задана, то инициировать точку поворота if (UnitIsMove) RotatePlayerUnit (); // Если юнит в движении то выполнить поворот } public void RotatePlayerUnit() { RotationPivot.transform.rotation = Quaternion.Lerp(RotateFrom,RotateTo, UnitCurrentAngle); // Повернуть юнит UnitCurrentAngle += 0.1f; // изменение угла if (UnitCurrentAngle > 1f) StopMove (); // Если поворот завершен, то остановить движение } // метод меняющий значение сектора поворота public Sector ChangeSector(Sector ChangeSector, int Direct) { int Sec = (int)ChangeSector; // переменная показывающая текущий сектор Sec += Direct; // увеличение/уменьшение сектора в зависимости от входного параметра Sec = (Sec > (int)Sector.SectorIV) ? 0 : Sec; Sec = (Sec < (int)Sector.SectorI) ? 3 : Sec; //условия перехода сектора через 0 ChangeSector = (Sector)Sec; // установка сектора return ChangeSector; // возврат метода } public void SetPointToRotation () { // задаем смещение позиции родительского элемента относительно юнита, для вращения float SetX, SetZ; //переменные позиции родителя SetX = SetZ = 0f; RotateFrom = transform.rotation; // Снять "слепок" текущего значения поворота switch (UnitDirection) { // установка точки поворота case "North": SetX = 0.5f; SetZ = 0f; // позиция точки относительно юнита CurrentUnitAngleWE -= 90f; // приращение угла CurrentUnitAngleWE = (CurrentUnitAngleWE < 0) ? 270 : CurrentUnitAngleWE; // проход угла через 0 break; case "South": SetX = -0.5f; SetZ = 0f; CurrentUnitAngleWE += 90f; CurrentUnitAngleWE = (CurrentUnitAngleWE > 360) ? 90 : CurrentUnitAngleWE; break; case "West": SetX = 0f; SetZ = 0.5f; CurrentUnitAngleNS += 90f; CurrentUnitAngleNS = (CurrentUnitAngleNS > 360) ? 90 : CurrentUnitAngleNS; break; case "East": SetX = 0f; SetZ = -0.5f; CurrentUnitAngleNS -= 90f; CurrentUnitAngleNS = (CurrentUnitAngleNS < 0) ? 270 : CurrentUnitAngleNS; break; } RotateTo = Quaternion.Euler(CurrentUnitAngleNS, CurrentUnitAngleAround, CurrentUnitAngleWE); // установка кватерниона поворота RotationPivot.position = new Vector3(transform.position.x + SetX, transform.position.y - 0.5f, transform.position.z + SetZ); // устанавливаем точку вращения this.transform.parent = RotationPivot.transform; // привязываем юнит к родителю UnitIsMove = true; // начнаем вращение UnitSetMove = false; // заканчиваем инициализацию } public void StopMove () { switch (UnitDirection) { case "North": CurrentSectorNS = ChangeSector (CurrentSectorNS, -1); // изменение сектора вращения unitNSPosition += 1; // изменить позицию break; case "South": CurrentSectorNS = ChangeSector (CurrentSectorNS, 1); unitNSPosition -= 1; break; case "West": CurrentSectorWE = ChangeSector (CurrentSectorWE, 1); unitWEPosition += 1; break; case "East": CurrentSectorWE = ChangeSector (CurrentSectorWE, -1); unitWEPosition -= 1 ; break; } // блок завершения движения RotationPivot.rotation = RotateTo; // выровнять угол поворота (доводчик) UnitCurrentAngle = 0f; // обнулить угол transform.parent = null; // овязать точку вращения UnitIsMove = false; // закончить движение UnitDirection = ""; // обнулить команду на движение } }
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:05.
|