|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
11.10.2013, 23:28
|
#76
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
ребят, глупый вопрос но все-таки. Делаю метод CheckInBorders:
public class CameraNavigation : MonoBehaviour { List<float> Borders = 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 инициализируются при каждом вызове метода, типы соблюдаются... в чем может быть косяк?
|
(Offline)
|
|
11.10.2013, 23:40
|
#77
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
везде return забыл и тип функции GetBordersInfo, после каждого условия компилятор не понимает что делать со значением.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.10.2013, 00:46
|
#78
|
Знающий
Регистрация: 08.01.2013
Адрес: Самара
Сообщений: 284
Написано 104 полезных сообщений (для 180 пользователей)
|
Ответ: Передача переменной в метод
Зачем? Если все методы void?
Стоп! А что по мнению вопрошающего делает выражение "GetBordersInfo.Left"? Оно возвращает значение enum. Что делают с этим значением - либо присваивают чему то, либо возвращают из функции. pax решил, что надо вернуть. Что хотели Вы?
тип функции GetBordersInfo
|
Это ж не функция, а enum.
Ошибка в том, что нет скобки '}' у метода Start
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.10.2013, 06:54
|
#79
|
Знающий
Регистрация: 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)) записывать более компактно? Именно попадание переменной в диапазон
|
(Offline)
|
|
12.10.2013, 08:59
|
#80
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от EvilOkta
кстати еще один вопрос, есть ли в C# конструкции которые позволяют условия типа ((x > a)&(x < b)) записывать более компактно? Именно попадание переменной в диапазон
|
Вроде нет
|
(Offline)
|
|
12.10.2013, 14:30
|
#81
|
Знающий
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.10.2013, 17:09
|
#82
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Это не на много короче, а по сути одно и то же. Плюс ты написал расширение с проверкой, что граничные значения диапазона не учитываются.
Кстати ты используешь побитовый И (&). Для чего? Надо обязательно проверить два условия? Оператор && остановит выполнение если уже не верно левое условие.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
12.10.2013, 17:54
|
#83
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от pax
Кстати ты используешь побитовый И (&). Для чего? Надо обязательно проверить два условия? Оператор && остановит выполнение если уже не верно левое условие.
|
кстати да, имеет смысл использовать && я думаю даже доработать условия, по идее курсор мыши не может быть за пределами экрана, поэтому можно оставить только внутренние границы. Сейчас проверю.
|
(Offline)
|
|
14.10.2013, 00:53
|
#84
|
Знающий
Регистрация: 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 Speed, SpeedX, SpeedY, RealSpeedX, RealSpeedY, SpeedXFrom, SpeedYFrom; public int ScreenWidth, ScreenHeight; // размеры экрана public bool inInertia; //инерция камеры List<float> Borders = new List<float>(); //список экранных маркеров public enum GetBordersInfo {None,Left,Right,Up,Down,UpLeft,UpRight,DownLeft,DownRight}; // присвоение попавшей рамки public GetBordersInfo BordersInfo, BordersInfoSave; 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(SpeedXFrom, SpeedX, Time.time/2f); RealSpeedY = Mathf.Lerp(SpeedYFrom, SpeedY, Time.time/2f); if ((RealSpeedX == SpeedX)&&(RealSpeedY == SpeedY)) inInertia = false; } } }
По задумке переменная RealSpeedX должна плавно в течение двух секунд изменяться от SpeedXFrom до SpeedX, притом они отслеживаются при изменении направления движения камеры.
Т.е. если курсор был в левой части экрана GetBordersInfo.Left то при перемещении в центральную часть GetBordersInfo.None скорость должна плавно угаснуть с 1 до 0.
Но не выходит, всю голову поломал.
PS: Внимание, много говнокода!
|
(Offline)
|
|
14.10.2013, 01:08
|
#85
|
Мастер
Регистрация: 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
|
Знающий
Регистрация: 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 или я ошибаюсь?
|
(Offline)
|
|
14.10.2013, 07:24
|
#87
|
Unity/C# кодер
Регистрация: 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(SpeedXFrom, SpeedX, _interpolationTime/2f); RealSpeedY = Mathf.Lerp(SpeedYFrom, SpeedY, _interpolationTime/2f);
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.10.2013, 14:52
|
#88
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Спасибо pax! То что нужно. Сразу в голову не пришло что нужно фиксировать начало инерции.
|
(Offline)
|
|
15.10.2013, 21:49
|
#89
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
как-нибудь можно отследить одновременное нажатие двух клавиш с помощью Input.GetKey? в том плане, что одна кнопка вызывает одно действие, вторая - другое, а две вместе третье
|
(Offline)
|
|
15.10.2013, 22:46
|
#90
|
Unity/C# кодер
Регистрация: 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){ // вторая }
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:26.
|