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

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

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

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

Ответ
 
Опции темы
Старый 27.02.2013, 07:14   #46
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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++;
} 
По поводу префиксной записи инкремента - префиксная запись сначала делает инкремент, потом возвращает это значение, постфиксная - как я написал теряет значение, потому что сначала возвращает старое значение, потом делает инкремент.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (27.02.2013)
Старый 03.03.2013, 16:45   #47
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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++; 
но компилятор матерится, и до сих пор не понял как извлечь значение текущего пересечения и допустим присвоить его другой переменной?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 16:52   #48
Dream
быдло
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (03.03.2013)
Старый 03.03.2013, 17:05   #49
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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;
            }
        } 
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 17:22   #50
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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;
    }
} 
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 17:27   #51
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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); 
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 21:55   #52
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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
почему?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 23:51   #53
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Передача переменной в метод

Максимум для твоего масива - [2,1].
Я думаю тебе стоит почитать про основы языка, чтобы не спрашивать каждый час на форуме о банальной проблеме
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (04.03.2013)
Старый 03.03.2013, 23:59   #54
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 04.03.2013, 00:30   #55
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Передача переменной в метод

При обьявлении ты указываешь размер, и от нуля до 2 какраз поучается те твои 3 элемента. протсо нужно привыкнуть. Всётаки читай msdn. Меньше вопросов будет.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (04.03.2013)
Старый 04.03.2013, 22:13   #56
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

и снова нубский вопрос (да-да, только что из справки и тестирования скрипта)
Я научился поворачивать объект с помощью rotatearound и с помощью quaternion.slerp
а теперь вопрос - как объединить эти два способа в один? Мне нужно вращать объект вокруг определенной точки в пространстве используя кватернионы (ибо с помощью углов эйлера получаю шарнирный замок в одном из положений)
вращать вокруг центра объекта - понятно как, а вот как это сделать с помощью transform.RotateAround неясно, ибо оно хочет в качестве параметров два вектора а не кватернионы.

рассматриваю вариант вращения через дочерние пивоты но мне этот метод кажется черезчур проблемным, ибо количество таких пивотов и их настройка слишком суровая заявка для простого поворота объекта на заданный угол вокруг определенной точки.

Вот если бы как то в transform.RotateAround передать кватернион либо решить проблему шарнирного замка (читал про обход проблемы через вращение матрицами, но если честно нихрена не понял).

Надеюсь хотя бы пнете в нужном направлении. ))

p.s. тему впору переименовать в нубские вопросы очередного новичка ))
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 04.03.2013, 22:55   #57
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Самое простое - поместить пустой объект в точку поворота, поместить твой объект в чайлды к пустому, повернуть пустышку как надо, вывести твой объект из чайлдов пустышки, убить пустышку.

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

Сообщение от pax Посмотреть сообщение
Самое простое - поместить пустой объект в точку поворота, поместить твой объект в чайлды к пустому, повернуть пустышку как надо, вывести твой объект из чайлдов пустышки, убить пустышку.

Пустышку можно и не убивать, так будет быстрее.
хорошая идея, спасибо! Нужно будет немного поменять скрипт но должно сработать. В принципе position для этой пустышки можно будет взять из positiona вектора для rotatearound.
А с привязкой/отвязкой дочерних объектов буду штудировать справку.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 04.03.2013, 23:33   #59
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

transform.parent = pivot.transform сделает объект дочерним к объекту pivot
transform.parent = null - сделает объект самостоятельным
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (05.03.2013)
Старый 18.03.2013, 00:04   #60
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 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 = "";    // обнулить команду на движение
    
}
} 
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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