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

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

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

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

Ответ
 
Опции темы
Старый 11.10.2013, 23:28   #76
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

ребят, глупый вопрос но все-таки. Делаю метод CheckInBorders:
public class CameraNavigation MonoBehaviour {    
List<
floatBorders = new List<float>(); //список экранных маркеров
    
public enum GetBordersInfo {None,Left,Right,Up,Down}; // присвоение попавшей рамки
    
public GetBordersInfo BordersInfo;
    const 
float ScreenPercent 0.05f;
        
    
void Start () {
    
ScreenWidth Screen.width;
    
ScreenHeight Screen.height;    
    
    
Borders.Add ((float)0f); // 0 - слева начало
    
Borders.Add ((float)ScreenWidth*ScreenPercent); // 1 - слева конец
    
Borders.Add ((float)ScreenWidth*(1-ScreenPercent)); // 2 - справа начало
    
Borders.Add ((float)ScreenWidth); // 3 - справа конец
    
Borders.Add ((float)0f); // 4 - сверху начало
    
Borders.Add ((float)ScreenHeight*ScreenPercent); // 5 - сверху конец
    
Borders.Add ((float)ScreenHeight*(1-ScreenPercent)); // 6 - снизу начало 
    
Borders.Add ((float)ScreenHeight); // 7 - снизу конец

public void CheckInBorders () {
    
float MouseXCord Input.mousePosition.x;
    
float MouseYCord Input.mousePosition.y;
    
    if ((
MouseXCord >= Borders[0])&(MouseXCord <= Borders[1])) GetBordersInfo.Left;
    if ((
MouseXCord >= Borders[2])&(MouseXCord <= Borders[3])) GetBordersInfo.Right;    
    if ((
MouseYCord >= Borders[4])&(MouseYCord <= Borders[5])) GetBordersInfo.Up;
    if ((
MouseYCord >= Borders[6])&(MouseYCord <= Borders[7])) GetBordersInfo.Down;
    if ((
MouseXCord >= Borders[1])&(MouseXCord <= Borders[2])&(MouseYCord >= Borders[5])&(MouseYCord <= Borders[6])) GetBordersInfo.None;
    }

привел выдержки из кода касаемые этого метода

он по идее должен проверить в какую из рамок экрана попал курсор мыши (для навигации камеры)
но компилятор на каждом условии выдает ошибку cs0201
метод вызывается из метода update.
Не могу понять почему так. MouseXCord, MouseYCord инициализируются при каждом вызове метода, типы соблюдаются... в чем может быть косяк?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 11.10.2013, 23:40   #77
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

везде return забыл и тип функции GetBordersInfo, после каждого условия компилятор не понимает что делать со значением.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (12.10.2013)
Старый 12.10.2013, 00:46   #78
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Передача переменной в метод

везде return забыл
Зачем? Если все методы void?
Стоп! А что по мнению вопрошающего делает выражение "GetBordersInfo.Left"? Оно возвращает значение enum. Что делают с этим значением - либо присваивают чему то, либо возвращают из функции. pax решил, что надо вернуть. Что хотели Вы?
тип функции GetBordersInfo
Это ж не функция, а enum.

Ошибка в том, что нет скобки '}' у метода Start
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (12.10.2013)
Старый 12.10.2013, 06:54   #79
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

про скобку - просто пропустил в цитате.
return не используется, но я понял с вашей помощью в чем косяк, я не правильно обновлял контейнер для enum
if ((MouseXCord >= Borders[0])&(MouseXCord <= Borders[1])) BordersInfo GetBordersInfo.Left;
    if ((
MouseXCord >= Borders[2])&(MouseXCord <= Borders[3])) BordersInfo GetBordersInfo.Right;    
    if ((
MouseYCord >= Borders[4])&(MouseYCord <= Borders[5])) BordersInfo GetBordersInfo.Up;
    if ((
MouseYCord >= Borders[6])&(MouseYCord <= Borders[7])) BordersInfo GetBordersInfo.Down;
    if ((
MouseXCord >= Borders[1])&(MouseXCord <= Borders[2])&(MouseYCord >= Borders[5])&(MouseYCord <= Borders[6])) BordersInfo GetBordersInfo.None
глупо, контейнер объявил но его не обновлял, но ваши подсказки как раз и дали понять )) спасибо

кстати еще один вопрос, есть ли в C# конструкции которые позволяют условия типа ((x > a)&(x < b)) записывать более компактно? Именно попадание переменной в диапазон
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 12.10.2013, 08:59   #80
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Сообщение от EvilOkta Посмотреть сообщение
кстати еще один вопрос, есть ли в C# конструкции которые позволяют условия типа ((x > a)&(x < b)) записывать более компактно? Именно попадание переменной в диапазон
Вроде нет
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 12.10.2013, 14:30   #81
seaman
Знающий
 
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений
(для 180 пользователей)
Ответ: Передача переменной в метод

Напиши расширение, если нужно:
public static class Extension
{
    public static bool InRange(this float val, float min, float max)
    {
        return val > min && val < max;
    }
}
Используем:
if(x.InRange(a, b))
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (12.10.2013)
Старый 12.10.2013, 17:09   #82
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Это не на много короче, а по сути одно и то же. Плюс ты написал расширение с проверкой, что граничные значения диапазона не учитываются.

Кстати ты используешь побитовый И (&). Для чего? Надо обязательно проверить два условия? Оператор && остановит выполнение если уже не верно левое условие.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (12.10.2013)
Старый 12.10.2013, 17:54   #83
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Сообщение от pax Посмотреть сообщение
Кстати ты используешь побитовый И (&). Для чего? Надо обязательно проверить два условия? Оператор && остановит выполнение если уже не верно левое условие.
кстати да, имеет смысл использовать && я думаю даже доработать условия, по идее курсор мыши не может быть за пределами экрана, поэтому можно оставить только внутренние границы. Сейчас проверю.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 14.10.2013, 00:53   #84
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Вопрос Ответ: Передача переменной в метод

блин, ребят помогите, опять застрял, четвертый час бьюсь а косяка не могу найти до сих пор.
В чем смысл - делаю навигацию камеры с небольшим движением по инерции после смены направления. Но почему-то весь блок где инерция должна по идее происходить - не происходит. Хотя если вставить отладчики, то видно что эти блоки выполняются.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class 
CameraNavigation MonoBehaviour {
     
    public 
Transform CameraTransform//основа навигации камеры
    
public GameObject CameraTarget//цель камеры
    
public float SpeedSpeedXSpeedYRealSpeedXRealSpeedYSpeedXFromSpeedYFrom;
    public 
int ScreenWidthScreenHeight// размеры экрана
    
public bool inInertia//инерция камеры
        
    
List<floatBorders = new List<float>(); //список экранных маркеров
    
public enum GetBordersInfo {None,Left,Right,Up,Down,UpLeft,UpRight,DownLeft,DownRight}; // присвоение попавшей рамки
    
public GetBordersInfo BordersInfoBordersInfoSave;
    
    const 
float ScreenPercent 0.05f;
    
// Use this for initialization
    
    
    
void Start () {
    
ScreenWidth Screen.width;
    
ScreenHeight Screen.height;    
    
CameraTransform transform;
    
Speed 0.5f;
            
    
inInertia false;    
    
Borders.Add ((float)ScreenWidth*ScreenPercent); // 0 - слева
    
Borders.Add ((float)ScreenWidth*(1-ScreenPercent)); // 1 - справа
    
Borders.Add ((float)ScreenHeight*ScreenPercent); // 2 - сверху
    
Borders.Add ((float)ScreenHeight*(1-ScreenPercent)); // 3 - снизу 
    
    
}
    
    
// Update is called once per frame
    
void Update () {
    
        
СheckInBorders(); // - проверка попадания в рамки
    
CameraTransform.Translate(new Vector3(RealSpeedX,0,RealSpeedY));    
    
    }
        
    public 
void CheckInBorders () {
    
float MouseXCord Input.mousePosition.x;
    
float MouseYCord Input.mousePosition.y;
    
    if (
inInertia == false) {    
        
BordersInfoSave BordersInfo;
        if ((
MouseXCord <= Borders[0])&&(BordersInfo != GetBordersInfo.Left)) BordersInfo GetBordersInfo.Left;
        if ((
MouseXCord >= Borders[1])&&(BordersInfo != GetBordersInfo.Right)) BordersInfo GetBordersInfo.Right;
        if ((
MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.Down)) BordersInfo GetBordersInfo.Down;
        if ((
MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.Up)) BordersInfo GetBordersInfo.Up;
        if ((
MouseXCord <= Borders[0])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpLeft)) BordersInfo GetBordersInfo.UpLeft;
        if ((
MouseXCord >= Borders[1])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpRight)) BordersInfo GetBordersInfo.UpRight;
        if ((
MouseXCord <= Borders[0])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownLeft)) BordersInfo GetBordersInfo.DownLeft;
        if ((
MouseXCord >= Borders[1])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownRight)) BordersInfo GetBordersInfo.DownRight;
        if ((
MouseXCord >= Borders[0])&&(MouseXCord <= Borders[1])&&(MouseYCord >= Borders[2])&&(MouseYCord <= Borders[3])&&(BordersInfo != GetBordersInfo.None)) BordersInfo GetBordersInfo.None;
        }
        
    if (
BordersInfoSave != BordersInfo
        {
SpeedXFrom SpeedX;
        
SpeedYFrom SpeedY;
        
inInertia true;
        
        switch (
BordersInfo) {
        case 
GetBordersInfo.Left:
            
SpeedY Speed;
            
SpeedX 0f;
            break;
        case 
GetBordersInfo.Right:
            
SpeedY = -Speed;
            
SpeedX 0f;
            break;
        case 
GetBordersInfo.Up:
            
SpeedX Speed;
            
SpeedY 0f;
            break;
        case 
GetBordersInfo.Down:
            
SpeedX = -Speed;
            
SpeedY 0f;
            break;
        case 
GetBordersInfo.UpLeft:
            
SpeedX SpeedY Speed;
            break;
        case 
GetBordersInfo.DownLeft:
            
SpeedX = -Speed;
            
SpeedY Speed;
            break;
        case 
GetBordersInfo.UpRight:
            
SpeedX Speed;
            
SpeedY = -Speed;
            break;    
        case 
GetBordersInfo.DownRight:
            
SpeedX SpeedY = -Speed;
            break;
        case 
GetBordersInfo.None:
            
SpeedX SpeedY 0f;
            break;
            }
        
BordersInfoSave BordersInfo;
        }
                    
        if (
inInertia == true) {
            
RealSpeedX Mathf.Lerp(SpeedXFromSpeedXTime.time/2f);
            
RealSpeedY Mathf.Lerp(SpeedYFromSpeedYTime.time/2f);
            if ((
RealSpeedX == SpeedX)&&(RealSpeedY == SpeedY)) inInertia false;
        }
    }
    

По задумке переменная RealSpeedX должна плавно в течение двух секунд изменяться от SpeedXFrom до SpeedX, притом они отслеживаются при изменении направления движения камеры.
Т.е. если курсор был в левой части экрана GetBordersInfo.Left то при перемещении в центральную часть GetBordersInfo.None скорость должна плавно угаснуть с 1 до 0.
Но не выходит, всю голову поломал.

PS: Внимание, много говнокода!
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 14.10.2013, 01:08   #85
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Передача переменной в метод

RealSpeedX = Mathf.Lerp(SpeedXFrom, SpeedX, Time.time/2f); сдается мне что третье число в формуле должно лежать в диапазоне 0...1, а оно уже через 2 секунды от старта будет всегда больше 1, то есть надо выделить целую часть от такого числа и вычесть из исходного. Но хз как то оче сложно все для такой задачи.
(Offline)
 
Ответить с цитированием
Старый 14.10.2013, 01:15   #86
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Сообщение от dsd Посмотреть сообщение
RealSpeedX = Mathf.Lerp(SpeedXFrom, SpeedX, Time.time/2f); сдается мне что третье число в формуле должно лежать в диапазоне 0...1, а оно уже через 2 секунды от старта будет всегда больше 1
делал по справкам, там как раз рекомендуют Time.time делить на кол-во секунд на протяжении которых делается интерполяция, я пока для пристрела поставил две секунды чтобы отследить правильность реагирования скрипта.
Вроде до второй секунды Time.time/2f и будет давать диапазон 0..1 или я ошибаюсь?
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 14.10.2013, 07:24   #87
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Как-то так

float _interpolationTime 0// поле класса
...
   if (
BordersInfoSave != BordersInfo
        {
SpeedXFrom SpeedX;
        
SpeedYFrom SpeedY;
        
inInertia true;
        
_interpolationTime 0// при начале инерции обнуляем время начала

...
   
        if (
inInertia == true) {
            
_interpolationTime += Time.deltaTime// прибавляем прошедшее время
            
RealSpeedX Mathf.Lerp(SpeedXFromSpeedX_interpolationTime/2f);
            
RealSpeedY Mathf.Lerp(SpeedYFromSpeedY_interpolationTime/2f); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (14.10.2013)
Старый 14.10.2013, 14:52   #88
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

Спасибо pax! То что нужно. Сразу в голову не пришло что нужно фиксировать начало инерции.
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 15.10.2013, 21:49   #89
EvilOkta
Знающий
 
Аватар для EvilOkta
 
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений
(для 229 пользователей)
Ответ: Передача переменной в метод

как-нибудь можно отследить одновременное нажатие двух клавиш с помощью Input.GetKey? в том плане, что одна кнопка вызывает одно действие, вторая - другое, а две вместе третье
__________________
Области Хаоса - мой новый Youtube проект
(Offline)
 
Ответить с цитированием
Старый 15.10.2013, 22:46   #90
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Передача переменной в метод

Ну...
if(Input.GetKey(1) && Input.GetKey(2)){
// две
} else if(Input.GetKey(1){
 
// первая
}else if(Input.GetKey(2){
 
// вторая

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
EvilOkta (16.10.2013)
Ответ


Опции темы

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

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


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


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