forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

WISHMASTER35 11.01.2012 22:16

Ответ: Вопросы от новичка
 
Lestar, по ширине или длине экрана выравнивать? На планшетах не будет очень большими элементы? тут желательно плотность пикселей еще знать.

pax 11.01.2012 23:40

Ответ: Вопросы от новичка
 
если использовать ортогональную камеру и плейны, то высота ортогональной камеры выстанавливается в половину высоты экрана, если экран уменьшается, то плены остаются в том же масштабе относительно размеров экрана. Единственное можно скорректировать горизонтальную позицию немного. Интерфейс такой можно рендерить отдельной камерой.

WISHMASTER35 11.01.2012 23:58

Ответ: Вопросы от новичка
 
pax, т.е. рисовать не через GUI, а в 3д? Тогда еще сложнее будет т.к. все будет растягиваться в зависимости от соотношения сторон. Ну ладно как нибудь буду подстраивать размеры GUITexture.
Кстати, нет скрипта что-то типа GUITexture, только чтобы отслеживал нажатие мышкой\тачем на текстуру как GUI.Button? А то из-за такой мелочи свой скрипт создавать не очень хочется)

Lestar 12.01.2012 00:57

Ответ: Вопросы от новичка
 
Не будет ничего нигде растягиваться если не трогать камеру. Через Screen позиционировать элементы, а не скейлить их. Отслеживаем нажатие через OnMouseDown + вешаем на камеру(я так понял ты добиваешься, чтобы на девайсах работало)
PHP код:

sing UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class 
OnTouchDown MonoBehaviour
{
    
void Update()
    {
        
// Code for OnMouseDown in the iPhone. Unquote to test.
        
RaycastHit hit = new RaycastHit();
        for (
int i 0Input.touchCount; ++i)
        {
            if (
Input.GetTouch(i).phase.Equals(TouchPhase.Began))
            {
                
// Construct a ray from the current touch coordinates
                
Ray ray Camera.main.ScreenPointToRay(Input.GetTouch(i).position);
                if (
Physics.Raycast(rayout hit))
                {
                    
hit.transform.gameObject.SendMessage("OnMouseDown");
                }
            }
        }
    }



WISHMASTER35 12.01.2012 02:03

Ответ: Вопросы от новичка
 
Аа, ну да, в ортогональной камере вроде не должно растягивается. Но все же для 2д интерфейса я бы все же использовал бы GUI, а не парился с плейнами и вторыми камерами.
Отслеживать нажатие 2д элементов через Raycast это уже слишком.
Я хочу, что бы на девайсах с разными размерами экранов нормально смотрелся интерфейс.

Lestar 12.01.2012 02:33

Ответ: Вопросы от новичка
 
GUI все одно лучше рисовать во второй камере(так собственно все и делают), тогда получишь полный контроль над ним, независимо от поведения первой камеры. Вот использовать для девайсов родную систему GUI это да, жопа, припарки от нее получишь еще те.

WISHMASTER35 12.01.2012 13:34

Ответ: Вопросы от новичка
 
А конкретнее какой полный контроль? Мне не так и много надо.
И какие припарки от GUI можно получить?
Вот, кстати, еще одни вопрос по адаптации под все размеры. Как сделать, что бы размер шрифта был нормального размера на всех экранах?

Lestar 12.01.2012 14:39

Ответ: Вопросы от новичка
 
Твой гуй не будет никак зависеть от того, что ты делаешь с главной камерой и в случае с плашками проще будет работать, так как будет возможность вывести 1 пиксель=1 юнит. Стандартный ГУЙ даже если твой код очень чист периодически вызывает уборщик, который в свою очередь дает лишнюю нагрузку. Стандартный ГУЙ дает +1 ДК на каждую выведенную кнопку, текстуру. Для шрифтов используй GUIStyle.

WISHMASTER35 12.01.2012 15:29

Ответ: Вопросы от новичка
 
Не знаю, что надо сделать с камерой, что бы испортить GUI.
Вообщем я так понимаю стандартный GUI медленный, вызывает сборщик мусора, и лучше 2д рисовать плейном и в отдельной ортогональной камерой.
Мне бы пока как по легче, нет особого желания сильно возится с GUI, тем более в самом начале проекта.

Lestar 12.01.2012 16:40

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 216626)
Не знаю, что надо сделать с камерой, что бы испортить GUI.

Тем не менее у тебя это получилось.
Такое чувство, что я кого то уговариваю. Хоть на голове стойте, но не жалуйтесь потом, что на девайсе "шото тупит игра, движок гавно".

WISHMASTER35 12.01.2012 17:01

Ответ: Вопросы от новичка
 
У меня GUI не портился. Просто например в GUITexture Pixel Inset при разных разрешениях всегда одинаковые. В принципе это можно выравнять.
Да и если плейнами делать GUI в ортогональной камере, то выравниваться они будут только по высоте. По ширине все равно надо будет корректировать, если будет другое соотношение сторон.
А если свой GUI сделать, то как текст рисовать?

Lestar 12.01.2012 17:11

Ответ: Вопросы от новичка
 
Есть как Screen.width, так и Screen.height .Для букв писать дополнительно тузлу. Генерить плайник, на него накладывать шрифт.

WISHMASTER35 14.01.2012 00:13

Ответ: Вопросы от новичка
 
Если я в коде генерирую меш, то куда его можно сохранить, что бы повторно не создавать его? Можно конечно в статическую ссылку, но в unity вроде что-то для этого есть.

Кто-нибудь знает как работает проектор?
На сколько он тормазит? МИ можно ли проецируемую им картинку немного отодвинуть от плоскости на которую проецируется?
И можно ли его яркость увеличить, а то совсем ели видно.

pax 14.01.2012 01:02

Ответ: Вопросы от новичка
 
1. Если генерируешь в редакторе, то сохраняй в ассеты. Если в рантайме, то статическая переменная подойдет.
2. Не пробовал, не могу подсказать.

WISHMASTER35 14.01.2012 01:16

Ответ: Вопросы от новичка
 
Со статической переменной он вообще никогда не удалиться.
Еще сейчас предупреждение начало лезть
Cleaning up leaked objects in scene since no game object, component or manager is referencing them
Mesh has been leaked 1 times.
Пишет, что на меш ссылок уже нет, а он существует. Хз где и как его удалять(

pax 14.01.2012 01:31

Ответ: Вопросы от новичка
 
Если создаешь в редакторе, то естественно ссылок на него не останется, если он не на объекте, а в статической переменной. Если потом хочешь его переиспользовать - сохрани в ассеты.

WISHMASTER35 14.01.2012 16:34

Ответ: Вопросы от новичка
 
Черт! Как эти триггеры работают?
Повесил на игрока большой сферический триггер.
Сделал, что бы в OnTriggerEnter этот триггер включал у врага полосу жизней, а в OnTriggerExit выключал.
Но включается только когда я уже в впритык подхожу, а выключаться он вообще не думает.
Пробовал и с OnTriggerStay, но было не лучше.

Lestar 14.01.2012 17:29

Ответ: Вопросы от новичка
 
http://unity3d.com/support/documenta...xCollider.html смотреть коллизионную матрицу. Я так понимаю ригидбоди на одном из обьектов есть.

WISHMASTER35 14.01.2012 20:41

Ответ: Вопросы от новичка
 
Тригер работает только, если на двух объектах Rigidbody?
У меня на игроке, на котором триггер, был CharacterMotor, а враги пока были просто сферы с Rigidbody. OnTriggerEnter иногда срабатывал только, если впритык подойти, а иногда и из далека.
Снял Rigidbody и вообще все перестало работать(

Можно, кстати, сделать, что бы триггер проверялся только с объектами определенного слоя или тега?

pax 14.01.2012 21:45

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 216781)
Можно, кстати, сделать, что бы триггер проверялся только с объектами определенного слоя или тега?

А в чем проблема то? Либо настрой столкновения между слоями, либо в функции проверяй с каким объектом столкнулся.

WISHMASTER35 14.01.2012 21:53

Ответ: Вопросы от новичка
 
Да я для оптимизации хотел это сделать так что проверять с чем уже столкнулись не подходит. А вот как настраивать столкновение между слоями выглядит интересно, хотя пока не знаю как это делать.

Так все же, если игрок под управлением CharacterController и не имеет Rigidbody, то как определить какие игроки рядом с ним? Не перебирать же все GameObject. А триггеры вообще как-то тупо устроены.

pax 14.01.2012 21:57

Ответ: Вопросы от новичка
 
Настройки столкновений между слоями.
http://unity3d.com/support/documenta...csManager.html

Для того, чтобы найти вокруг объекты можно использовать http://unity3d.com/support/documenta...lapSphere.html

WISHMASTER35 15.01.2012 00:06

Ответ: Вопросы от новичка
 
OverlapSphere - классная функция. Жаль только kAllLayers надо самому вычислять т.к. в LayerMask это поленились реализовать( Да и не нравится мне, что нет класса в котором хранились бы имена всех тегов и слоев, а то вручную писать константные величины - опасное дело.

Вот такая демка получается http://dl.dropbox.com/u/55489242/My%...WebPlayer.html
На SE x10 fps 25-30.
Теперь буду делать автоприцеп. т.е. буду из этих ближних врагов выбирать того, на который больше всего смотрит игрок и на него поворачиваться при стрельбе. Должно получится удобное управление)

pax 15.01.2012 02:11

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 216812)
Да и не нравится мне, что нет класса в котором хранились бы имена всех тегов и слоев, а то вручную писать константные величины - опасное дело.

Ну так напиши сам, в чем проблема то?

WISHMASTER35 15.01.2012 02:43

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 216822)
Ну так напиши сам, в чем проблема то?

А можно такое сделать? Я имею ввиду, что бы при каждом изменении тегов или слоев пересоздавался класс в котором для каждого тега и слоя была константа.
Тут как минимум не отловишь событие изменения слоев или тегов.
В Android'е R класс так сделан. В нем содержатся id всех ресурсов.

pax 15.01.2012 02:52

Ответ: Вопросы от новичка
 
Ну я вообще имел ввиду написать вручную, как добавляешь тег, так в свой класс добавляешь константы. Но раз это сложно... Для тегов написать нельзя, потому что тегов может быть больше, чем записано в редакторе, вдруг ты в рантайме теги создаешь? Для слоев можно утилитку написать с помощью вот этого:
http://unity3d.com/support/documenta...yerToName.html

WISHMASTER35 15.01.2012 14:55

Ответ: Вопросы от новичка
 
Не представляю зачем в рантайме создавать теги, если только не для подобных случаях с константами.
А где настройки тегов, слоев и др храниться? А то скачал пример Third Person MMO Controller, а там надо было вручную добавлять теги.

pax 15.01.2012 17:18

Ответ: Вопросы от новичка
 
Выбираешь из выпадающего списка слоев пункт Edit Layers и первый раскрывающийся список - это теги.

WISHMASTER35 15.01.2012 18:04

Ответ: Вопросы от новичка
 
Я имел ввиду в каком файле.

pax 15.01.2012 20:09

Ответ: Вопросы от новичка
 
Никогда не задавался этим вопросом, вероятно в TagManager.asset

WISHMASTER35 15.01.2012 22:15

Ответ: Вопросы от новичка
 
Я немного перепутал) В Third Person MMO Controller надо было вручную настраивать Input. С эти немного провозился) Но уже вижу, что все настройки хранятся в папке Library. А эта папка не запаковывается в package(

WISHMASTER35 16.01.2012 18:56

Ответ: Вопросы от новичка
 
Как можно OnGUI заставить выполняться в редакторе? [ExecuteInEditMode] не помогает, специальных событий для этого вроде тоже нету.

pax 16.01.2012 20:40

Ответ: Вопросы от новичка
 
Почему не помогает? Объект в сцене, чтобы работало? Ты смотришь в окне Game?

WISHMASTER35 16.01.2012 21:11

Ответ: Вопросы от новичка
 
Я в окне сцены смотрю. Мне интересно как GUITexture там рисуется.

pax 16.01.2012 21:16

Ответ: Вопросы от новичка
 
http://unity3d.com/support/documenta....BeginGUI.html повторю ссылку из этой темы: http://forum.boolean.name/showthread.php?t=14066

WISHMASTER35 19.01.2012 23:43

Ответ: Вопросы от новичка
 
А вот если использовать методы Slerp и Lerp, то скорость интерполяции вектора\кватерниона будет же разной в начале и конце. И до цели результат так и не дойдет.
Есть методы, что бы интерполировать с одинаковой скоростью? Для вектора такой метод еще не сложно написать, а с кватернионом как это сделать хз.

pax 20.01.2012 01:11

Ответ: Вопросы от новичка
 
Ты вообще о чем? Оба метода это линейная интерполяция, там не может быть разной скорости по определению.

WISHMASTER35 20.01.2012 02:32

Ответ: Вопросы от новичка
 
pax, да, но получается иначе. Вот пример написал.
Код:

private static float lerp(float from, float to, float t) {
        return from + ( to-from )*t;
}

        float current = 0;
        float to = 50;
        for (int i = 0; i < 15; i++) {
            current = lerp(current, to, 0.2f);
            System.out.println( current );
        }

Результат:
10.0
18.0
24.4
29.52
33.616
36.8928
39.51424
41.611393
43.289116
44.631294
45.705036
46.56403
47.251225
47.80098
48.240784

WISHMASTER35 20.01.2012 02:38

Ответ: Вопросы от новичка
 
А вот другой вариант.
Код:

private static float test(float from, float to, float max) {
        float delta = to-from;
        if( delta < -max ) delta = -max;
        if( delta > max )  delta = max;
        return from + delta;
}

        float current = 0;
        float to = 50;
        for (int i = 0; i < 15; i++) {
            current = test( current, to, 5 );
            System.out.println( current );
        }

Результат равномерный.
5.0
10.0
15.0
20.0
25.0
30.0
35.0
40.0
45.0
50.0
50.0
50.0
50.0
50.0
50.0

Для вектора такое легко сделать, а вот если бы для кватерниона, то было бы класс.

pax 20.01.2012 07:26

Ответ: Вопросы от новичка
 
Хоть пользоваться интерполяцией научись сначала - все дело в неизменном начальном и конечном значении и изменении параметра, а у тебя исходные данные всегда разные. ты все время двигаешь по одному и тому же параметру но используешь разные значения, которые на каждом шаге ближе друг к другу.

PHP код:

private static float lerp(float fromfloat tofloat t) {
        return 
from + ( to-from )*t;
}
        
float from0;
        
float current 0;
        
float to 50;
        for (
int i 015i++) {
            
current lerp(fromtoi/14f);
            
System.out.printlncurrent );
        } 


WISHMASTER35 20.01.2012 16:09

Ответ: Вопросы от новичка
 
Я же об этой проблеме и писал. В одном цикле оно легко правильно пользоваться интерполяцией.
А если мне надо сгладить поворот персонажа?
Тогда надо интерполировать в нескольких кадрах и хранить начальный и конечный кватернион наверно будет глупо. Да еще и кадры от начального до конечного кватерниона считать.
Согласитесь, будет порядком удобнее просто задавать максимальное значение дельты при интерполяции как я писал во втором примере.
Конечно на крайний случай можно использовать углы эйлера, тем более вращение происходит вокруг одной оси. Но все же почему нету таких функций как я хотел(.

Lestar 20.01.2012 16:44

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 217309)
Но все же почему нету таких функций как я хотел(.

Unity убог, в нем ничего нет и разработчики не заложили возможность расширения.

pax 20.01.2012 18:56

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 217309)
Но все же почему нету таких функций как я хотел(.

Блин, читайте справку, все за вас искать надо чтоли? http://unity3d.com/support/documenta...teTowards.html
http://unity3d.com/support/documenta...veTowards.html

Не охото совсем учиться программировать?

WISHMASTER35 20.01.2012 20:11

Ответ: Вопросы от новичка
 
Охота, но не всегда с моим английским нахожу, что надо. Искать не надо, если не помните.

Aikon 21.01.2012 03:29

Ответ: Вопросы от новичка
 
Обнаружил вот какой косяк:
Добавляю свой шрифт в Unity, перетащив из папки Windows ttf-файл.
У меня две сцены, на каждой по GUIText, у которого выставлен мой шрифт.
Сначала запускается первая сцена (лого), потом вторая (игра). Во второй сцене - надписи этим шрифтом более не пишутся, причем только в собранном exe (в Editor все показывается!).

У первой сцены ставлю Arial, у второй мой - все ок. У первой мой, у второй Arial - все ок. Сильное подозрение, что шрифт просто выгружается или это какая то бага.
Пробовал в первой сцене вызывать DontDestroyOnLoad и передавать ему, как сам компонент GUIText, так и GUIText.font. Вбестолку :(

Какие будут идеи?

И вот еще:
Что-то гавкнулось в сцене. Теперь добавляя к Dummy объекту компонент GUITexture
и устанавливая черную текстурку, получаю текстуру на весь экран, хотя размеры и
прочее по нулям. Аналогично с GUIText - новый компонент добавляется с пустым
значением font и его прописывание ничего не дает, текст не отображается.
Если добавлять не как компоненты, а как объекты, то некоторое время все ок, а потом
отваливается.
Как такое лечить то? Unity 3.4.2 Pro cracked.

pax 21.01.2012 13:38

Шрифт загружается кодом, или назначается на поле гуитекста?

По поводу как лечить не знаю, не пользуюсь данными компонентами.

Aikon 21.01.2012 14:22

Ответ: Вопросы от новичка
 
pax, через назначение в редакторе. Для шрифтов в Unity API функций почти нет, только через Resources.Load (пробовал повторно подгружать, но не получилось; шрифт клал в папку Resources разумеется).

pax 21.01.2012 14:24

Ответ: Вопросы от новичка
 
Странные у тебя глюки, попробуй Unity переустановить. Поставь последнюю 3.4.2f3 если стоит не она.

Aikon 21.01.2012 15:31

Ответ: Вопросы от новичка
 
pax, пересоздал сцену - действительно те же глюки. Сейчас буду переустанавливать :(
P.S. Версия последняя, доступная с сайта - 3.4.2.

pax 21.01.2012 15:33

Ответ: Вопросы от новичка
 
3.4.2f3? или f2

L-ee-X 21.01.2012 15:36

Ответ: Вопросы от новичка
 
А, что там по части версии 3.5?? :) Кто нибудь уже пробовал с ней работать?

pax 21.01.2012 15:38

Ответ: Вопросы от новичка
 
Пробовали, она пока бета.
http://chess-of-honour.shgames.ru/ написали для конкурса, ждем результатов.

Aikon 21.01.2012 17:31

Ответ: Вопросы от новичка
 
С GUITexture и GUIText разобрался. Оказалось, что не стоит навешивать обе компоненты на один объект, поскольку каждый из компонент требует свой transform.

С шрифтом пока не ясно.

WISHMASTER35 25.01.2012 02:19

Ответ: Вопросы от новичка
 
Вложений: 1
Снова я в затуплении) Не пойму такое количество драв калов это нормально?
Включен режим эмуляции Opengl es 1.x т.е. на крутое освещение дравкалы не будут создаваться.
В камере видно всего пару одинаковых деревьев и врагов, а дравкалов до 50 можит быть. До запуска сцены показывает 3 батча, а после запуска 0, хотя деревья должны батчится.
occlusion culling считал, но ничего не изменилось.
Если отключить терейн, то дравкалы падают до 17(в принципе норм для оставшихся объектов). Террейн так и должен вызывать столько дравкаллов(получается аж 28 ) или у меня где-то руки кривые?
Кстате, скайбокс вызывает 6 дравкалов. Не мало.

Lestar 25.01.2012 02:28

Ответ: Вопросы от новичка
 
Посмотри сколько материалов висит на солдате. 39к трисов для девайса это очень много. У террайна увеличить pixel error. И деревья, расставленные через terrain engine не должны батчится.

pax 25.01.2012 07:32

Ответ: Вопросы от новичка
 
Не используй террейн для мобильников. И обрати внимание что у тебя 23 текстуры используется. Еще GUI. Для скайбокса это нормальное если ты его сделал из шести текстур, а не кубмэпой.

pie 05.02.2012 18:25

Ответ: Вопросы от новичка
 
Я написал код. Вот кусочек. Тут есть ошибка. Думаю Вы её заметили. Мне нужно именно вот такой способ, если такой нельзя, то хотя бы альтернативный метод.

Код:

function ShootDouble () {

        yield WaitForSeconds(fireDelay);

        switch (currentMode){
                case 0:
                          canShoot = true;
                break;

                case 1:
                          if (bulletsToGo == 0){canShoot = true;}
                          if (gunAmmo == 0){
                              canShoot = false;
                              Reload();
                      }
                 
                          Shoot();
                          bulletsToGo--;
                          gunAmmo--;
                          ShootDouble();
                break;

                case 2:
                          if (Input.GetButton ("Fire1")){
                              if (gunAmmo == 0){
                                Reload();
                                canShoot = false;
                        }
     
                              Shoot();
                              gunAmmo--;
                              ShootDouble();
                          }else{canShoot = true;}
                break;
        }
}


Lestar 05.02.2012 18:33

Ответ: Вопросы от новичка
 
Засовывать в switch
PHP код:

if (Input.GetButton ("Fire1")) 

да еще и ждать,что он сработает с задержкой fireDelay это ждать, что он никогда не сработает.

pie 05.02.2012 20:04

Ответ: Вопросы от новичка
 
Он работает отлично. Не работает вот этот момент:

PHP код:

case 2:
               if (
Input.GetButton ("Fire1")){
                  if (
gunAmmo == 0){
                     
Reload();
                     
canShoot false;
                 }
      
                  
Shoot();
                  
gunAmmo--;
                  
ShootDouble(); // вот на эту строчку ругается.
               
}else{canShoot true;}
        break; 


pax 05.02.2012 22:20

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pie (Сообщение 218703)
Он работает отлично.

Даже если он работает - это, извиняюсь, быдлокод. Попробуй переписать функцию заново.

И еще одно: когда говоришь, что ругается, то не делай всех телепатами, напиши текст ошибки.

pie 05.02.2012 22:36

Ответ: Вопросы от новичка
 
Assets/scripts/player/machinegun.js(105,25): BCE0070: Definition of 'machinegun.ShootDouble' depends on 'machinegun.ShootDouble' whose type could not be resolved because of a cycle. Explicitly declare the type of either one to break the cycle.

pax 05.02.2012 23:06

Ответ: Вопросы от новичка
 
попробуй
PHP код:

function ShootDouble ():IEnumerator 


Lestar 05.02.2012 23:34

Ответ: Вопросы от новичка
 
PHP код:

function ShootDouble ()
{
 
Invoke("MyFunction",fireDelay)
}
function 
MyFunction()
{
  switch (
currentMode){
        case 
0:
               
canShoot true;
        break;

        case 
1:
               if (
bulletsToGo == 0){canShoot true;}
               if (
gunAmmo == 0){
                  
canShoot false;
                  
Reload();
              }
           
               
Shoot();
               
bulletsToGo--;
               
gunAmmo--;
               
ShootDouble();
        break;

        case 
2:
               if (
Input.GetButton ("Fire1")){ //Это не может работать правильно. По крайней мере я не представляю себе логику, чтобы это могло работь правильно.
                  
if (gunAmmo == 0){
                     
Reload();
                     
canShoot false;
                 }
      
                  
Shoot();
                  
gunAmmo--;
                  
ShootDouble();
               }else{
canShoot true;}
        break;



WISHMASTER35 07.02.2012 00:17

Ответ: Вопросы от новичка
 
pax, ты же в своем кубизме в скрипте объединял блоки в большие меши.
А если все эти блоки будят статические, то статический батчинг сможет так же оптимизировать?
Вот еще я думаю можно ли эти кубы генерировать на лету в шейдере? Есть же какой-то геометрический шейдер, который может создавать геометрию.
Что-то меня тоже заинтересовала идея тайлового уровня. Только маленького как в старых играх)


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot