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

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

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

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

Ответ
 
Опции темы
Старый 27.02.2013, 03:14   #46
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,496
Написано 2,953 полезных сообщений
(для 5,217 пользователей)
Ответ: Передача переменной в метод

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, 12:45   #47
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

Вопрос про перечисление.
Есть у меня перечисление следующего вида:
public enum Sector {SectorISectorIISectorIII
каким способом присваивать переменной конкретное значение перечисления я понял:
SomeParameter = (int)Sector.SectorI
А вот вопрос, как увеличить значение перечисления на 1? Независимо от текущего значения?
Я хочу достигнуть циклического параметра, т.е. при текущем значении пересечения SectorI он превращался в SectorII а из него в SectorIII и затем снова в SectorI. В справке не нашел способа как менять значение на следующее в списке перечисление (аналогично на предыдущее).

Пробую так:
if (Input.GetKeyDown(KeyCode.Space)) Sector = (Sector) (int) Sector++; 
но компилятор матерится, и до сих пор не понял как извлечь значение текущего пересечения и допустим присвоить его другой переменной?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 12: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, 13:05   #49
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

Сообщение от 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, 13:22   #50
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

новая беда, где то туплю видимо.
выделил увеличение перечисления в отдельный метод, но он перестал из-за этого работать. Не могу понять что за фигня. Цель одним и тем же методом вертеть три перечисления:

using UnityEngine;
using System.Collections;

public class 
Unit MonoBehaviour {
        
    }



public class 
MoveGamer Unit {
    public 
enum Sector {SectorISectorIISectorIII// Ориентация секторов для определени углов поворота
    
public Sector CurrentSectorNSCurrentSectorWECurrentSectorAround// хранилища пересечений, Сектор текущего поворота по осям Север-Юг, Запад-Восток, Вокруг себя
    
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, 13:27   #51
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

вопрос снят, был дураком, разобрался сам. Неправильно выполнял метод
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, 17:55   #52
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

Хм, опять застрял в тупике. Объявляю массив:
public int[,] AngleArray = new int[3,2];
    
void Start () 
    {
    
AngleArray[0,0]    = 270AngleArray[0,1]    = 0AngleArray[0,2] = 90;
    
AngleArray[1,0]    = 180AngleArray[1,1]    = 270AngleArray[1,2] = 0;
    
AngleArray[2,0]    = 90AngleArray[2,1]    = 180AngleArray[2,2] = 270;
    
AngleArray[3,0]    = 0AngleArray[3,1]    = 90AngleArray[3,2] = 180;

компилятор радостно машет index out of range
почему?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 19:51   #53
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Передача переменной в метод

Максимум для твоего масива - [2,1].
Я думаю тебе стоит почитать про основы языка, чтобы не спрашивать каждый час на форуме о банальной проблеме
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (03.03.2013)
Старый 03.03.2013, 19:59   #54
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

читаю основы, но сказывается то, что раньше изучал blitz 3d, сложно сразу отвязаться от него
непонятно почему максимум [2,1] - в С# по другому задаются пределы массива?
в mdsn написано что "Индексация массивов начинается с нуля: массив с элементами n индексируется от 0 до n-1."
у меня размерность массива 4 элемента на 3 или при индексации с 0 - 3х2.

или я не так понял синтаксис?

upd: все разобрался, оказывается при объявлении массива нумерация начинается с 1, а при доступе к элементам с 0.
Не такой очевидный ньюанс, ибо в blitz объявление тоже было с 0.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 03.03.2013, 20:30   #55
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Передача переменной в метод

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

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

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

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

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

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

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

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

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

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

transform.parent = pivot.transform сделает объект дочерним к объекту pivot
transform.parent = null - сделает объект самостоятельным
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (04.03.2013)
Старый 17.03.2013, 20:04   #60
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 304
Написано 107 полезных сообщений
(для 228 пользователей)
Ответ: Передача переменной в метод

Третий час бьюсь над косяком в скрипте, кто поможет?
В общем задача скрипта практически завершена, но периодически появляются глюки.
Скрипт по команде кнопок WSAD (это пока-что) перекатывает юнит на соседнее поле. RotationPivot - объект который используется как точка через которую идет перекатывание.

Скрипт работает как часы, но в некоторых позициях (например при последовательности W-A-W) юнит начинает перекатываться через другую ось (а именно ось Y, хотя скрипт однозначно вращает только по X и Z) - как можно вылечить?

using UnityEngine;
using System.Collections;

public class 
Unit MonoBehaviour {
    private 
string UnitName// Наименование юнита
    
public int unitNSPositionunitWEPosition//Позиция юнита в координатах
    
public Transform RotationPivot// Точка вращения юнита
    
public Quaternion RotateFromRotateTo// Кватернионы вращения (начало-конец)
    
}

public class 
MoveGamer Unit {
    
    public    
bool UnitSetMove// Переменная отвечающая за инициализацию вектора
    
public bool UnitIsMove// Движется ли юнит?
    
public float UnitCurrentAngle// Скорость вращения юнита
    
public float CurrentUnitAngleNSCurrentUnitAngleAroundCurrentUnitAngleWE// Текущий уровень поворота юнита
    
public string UnitDirection// Направление движения
    
public enum Sector {SectorISectorIISectorIIISectorIV// Ориентация секторов для определени углов поворота
    
public Sector CurrentSectorNSCurrentSectorWECurrentSectorAround// Сектор текущего поворота по осям Север-Юг, Запад-Восток, Вокруг себя
    
    
    
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 != "") & !UnitIsMoveSetPointToRotation (); // Если команда задана, то инициировать точку поворота
        
if (UnitIsMoveRotatePlayerUnit (); // Если юнит в движении то выполнить поворот    
    
}
        
    public 
void RotatePlayerUnit()     {
        
RotationPivot.transform.rotation Quaternion.Lerp(RotateFrom,RotateToUnitCurrentAngle);    // Повернуть юнит
        
UnitCurrentAngle += 0.1f// изменение угла
        
if (UnitCurrentAngle 1fStopMove (); // Если поворот завершен, то остановить движение
    
}
    
    
// метод меняющий значение сектора поворота
    
public Sector ChangeSector(Sector ChangeSectorint Direct) {
        
int Sec = (int)ChangeSector// переменная показывающая текущий сектор
        
Sec += Direct// увеличение/уменьшение сектора в зависимости от входного параметра
        
Sec = (Sec > (int)Sector.SectorIV) ?  Sec;
        
Sec = (Sec < (int)Sector.SectorI) ?  Sec//условия перехода сектора через 0
        
ChangeSector = (Sector)Sec// установка сектора
        
return ChangeSector// возврат метода
    
}
    
    public 
void SetPointToRotation ()    {
        
// задаем смещение позиции родительского элемента относительно юнита, для вращения
        
float SetXSetZ//переменные позиции родителя
        
SetX SetZ 0f;
        
        
RotateFrom transform.rotation// Снять "слепок" текущего значения поворота
        
        
switch (UnitDirection) { // установка точки поворота
            
case "North"
                
SetX 0.5fSetZ 0f// позиция точки относительно юнита
                
CurrentUnitAngleWE -= 90f// приращение угла
                
CurrentUnitAngleWE = (CurrentUnitAngleWE 0) ? 270 CurrentUnitAngleWE// проход угла через 0
                
break;
            case 
"South"
                
SetX = -0.5fSetZ 0f;
                
CurrentUnitAngleWE += 90f;
                
CurrentUnitAngleWE = (CurrentUnitAngleWE 360) ? 90 CurrentUnitAngleWE;
                break;    
            case 
"West"
                
SetX 0fSetZ 0.5f;
                
CurrentUnitAngleNS += 90f;
                
CurrentUnitAngleNS = (CurrentUnitAngleNS 360) ? 90 CurrentUnitAngleNS;
                break;    
            case 
"East"
                
SetX 0fSetZ = -0.5f;
                
CurrentUnitAngleNS -= 90f;
                
CurrentUnitAngleNS = (CurrentUnitAngleNS 0) ? 270 CurrentUnitAngleNS;
                break;        
        }
        
        
RotateTo Quaternion.Euler(CurrentUnitAngleNSCurrentUnitAngleAroundCurrentUnitAngleWE); // установка кватерниона поворота
        
RotationPivot.position = new Vector3(transform.position.SetXtransform.position.0.5ftransform.position.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 (CurrentSectorNS1);
                
unitNSPosition -= 1;
                break;    
            case 
"West"
                
CurrentSectorWE ChangeSector (CurrentSectorWE1);
                
unitWEPosition += 1;
                break;    
            case 
"East"
            
CurrentSectorWE ChangeSector (CurrentSectorWE, -1);
            
unitWEPosition -= ;
            break;        
    }
    
// блок завершения движения
        
RotationPivot.rotation RotateTo// выровнять угол поворота (доводчик)
        
UnitCurrentAngle 0f;    // обнулить угол
        
transform.parent null// овязать точку вращения
        
UnitIsMove false// закончить движение
        
UnitDirection "";    // обнулить команду на движение
    
}

__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


Часовой пояс GMT +1, время: 13:06.


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