Комментарии проекта Unity 3D
1

Случайная генерация и взаимодействие с ними.

» Unity 3D
Всем привет, видел недавно игру в ней player прыгает по облакам, но не как Doodle jump по y, а по x, я бы хотел ввести подобную мини игру в свой проект, кто нибудь подскажет как это возможно реализовать?(т.е. Player приземляется на бокс и если в течении 0.5s не нажмет space, то проигрыш, а если успел, полетит до следующего, случайно сгенерирующиеся от 2 до 10 метров от предыдущего)
Зарание СПАСИБО!
Ancient #1 - 2 месяца назад 0
Приземление на бокс запускает таймер в твои 0.5 сек. Далее отлавливаем событие нажатия пробела и если таймер не истек - то запускаем Player в нужном направлении, генерируя очередной бокс для его следующего приземления. И так до победы/проигрыша.
4

InvalidCastException при работе с хэш-таблицей.

» Unity 3D
Доброго времени суток. Делаю сценку с процедурной генерацией объектов.
На объекте WOLRDвисит скрипт WorldController:Mono Behavior. В WorldController'е есть поле хэш-таблица sectors, которая заполняется во время работы Start () и обрабатывается в Update().
Суть в том, что есть некоторое кол-во объектов, которые генерируются не сразу, а в течении игры. Информация о них и хранится в хэш-таблице c помощью класса Sector. Собственно Sector.SectorObj это поле, ссылающееся на объект, который генерируется не сразу а при определенных условиях.
НО что-то я не так делаю, когда перебираю хэш-таблицу и пытаюсь сгенерировать эти самые объекты на сцене.

Читать далее...
alexprey #1 - 3 месяца назад 0
И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.
Ага, надо, он возвращает object
GeneralElConsul #2 - 3 месяца назад (отредактировано ) 6
Всегда использую Dictionary вместо Hashtable и давно забыл, что там за траблы с преобразованиями.
Еще интересный вопрос в самом foreach: почему ты решил, что foreach вытянет из коллекции именно значения в виде объекта s, а не ключи или что-то еще?
Бери s из sectors.Values или используй foreach (DictionaryEntry de in sectors), где потом DictionaryEntry.Value - значение. И еще вопрос, надо ли будет делать явное преобразование из Object - уже забыл.
В общем, я бы сделал так: Dictionary<string, Sector> и foreach (Sector s in sectors.Values)
alexprey #3 - 3 месяца назад 1
  1. Где находится 35 строчка? Вручную не получилось посчитать
  2. Если у тебя используется в качестве ключа всегда строка, используй Dictionary<string, Sector> или как-то так
GeneralElConsul #4 - 3 месяца назад 0
По-моему в foreach можно только читать s, а не изменять s.
6

Это реально?

» Unity 3D
Хочу перенести свой проект, выложенный на XGM, на отдельный движок, позволяющий реализовать механ, как в варкрафте (камера сверху вниз смотрит, управление юнмтами как в стратегии с возможностью атаковать, что угодно таргетом). Так, как варкрафт не даёт возможности игрокам подключатся к уже запущенной игре. Делал вов сервер, но там проблематично контролировать массу юнитов.
Скайп:Gro_nrash
Garena:drako3y
VK:Николай Фон–Карштайн
alexprey #1 - 3 месяца назад 2
для этого нужен модифицированный клиент, офк
ох уж эти извращения :D

Возможно все, только для достижения этого необходимо затратить соответсвующие усилия
prog #2 - 3 месяца назад (отредактировано ) 0
А еще можно UnrealEngine4 взять. Или любой другой движок, хоть с нуля его написать. Вопрос в наличии нужных навыков для этого и ассетов (модели, текстуры, звуки и так далее). Более того, при желании даже вар3 можно научить понимать подключение игроков к запущеной игре (для этого нужен модифицированный клиент, офк)
GeneralElConsul #3 - 3 месяца назад 0
Та ссылка в комменте сверху - пример родной реализации сети в Unity. Но учти, что также есть другие пути: например, всякие там ассеты типо Photon или вообще свой сервер самому написать.
BrEd Pitt #4 - 3 месяца назад 0
Где-то на хабрахабре было, принцип "подключился новый член - число игроков увеличивается@превышен ли лимит чуваков?"
кажется, это оно. Либо не совсем верно понял вопрос, тут уж извините.
Doc #5 - 3 месяца назад 17
Абсолютно нереально. Варкрафт 3 например сделали с помощью магии.
Ancient #6 - 3 месяца назад 2
Несколько минут гугла + наличие головы на плечах превращают это из мечты в реальность.
7

Дайджест проектов на Unity - 2 выпуск

» Unity 3D
Привет, XGM!
Много воды утекло спустя публикации первого выпуска, я уж и не знал, продолжать ли мне вовсе.
К счастью, мне попалось пару действительно занимательных проектов..

Читать далее...
Diabfall #4 - 4 месяца назад 0
GeneralElConsul #5 - 4 месяца назад 0
жаль Ген забросил, норм получалось вроде
Да не жаль, в топку словоблудие, надо делами заниматься.
Diabfall #6 - 4 месяца назад 0
о черные копатели
жаль Ген забросил, норм получалось вроде
DARGO #7 - 4 месяца назад 0
Странно, что Rimword не популярен тут. Там ведь тоже мастерская модов есть
4

Помогите со скриптом

» Unity 3D
Как сделать чтобы главный игрок уничтожался при соприкосновении с другим обьектом
Ancient #1 - 4 месяца назад (отредактировано ) 0
В юнити есть целое событые на соприкосновение обьектов, да к тому далеко не одно!
Я бы сделал таким методом:
Создаем скрипт, вешаем на наш обьект. Далее удаляем стандартные функции и пишем след:

void OnCollisionEnter (collision col)
{
Destroy(this.gameobject);
}
При любом контакте данного обьекта с чем угодно - он удалится.
Более подробные обьяснения - милости прошу в гугл.
Naadir #2 - 4 месяца назад 0
prog, на самом деле я понятия не имею, ни какие функции есть в Unity, ни что он собой представляет. :D
Наверняка на Unity уже понаписано множество библиотек, которые, конечно, ну ни в какую не скачиваются с открытых источников, которые могут помочь в данном вопросе. Нужно просто их поискать, очень часто полезную инфу я находил на иноязычных форумах, где предлагалось даже несколько решений конкретной проблемы.
prog #3 - 4 месяца назад (отредактировано ) 0
Naadir, быть того не может чтобы в юнити не было родной проверки на столкновения... Впрочем, все целиком и полностью зависит от постановки задачи, которая в данном конкретном случае сильно хромает. Вдруг вопрос вобще по варкрафту на самом деле xD
Naadir #4 - 4 месяца назад 0
Могу помочь с алгоритмом: запихиваешь координаты всех своих объектов (если движутся) в массивчик, а потом делаешь сверку согласно ширине, высоте и длине своего объекта, типа там: If (self.coord.x + self.length <= obj1.x) and (self.coord.y + self.width <= obj1.y)... И так далее, и тому подобное.
2

ui префаб

» Unity 3D
вот кнопку я в префаб добавляю а потом создаю через скрипт динамически и присваиваю её дочерней к канвасу а она не хочет отображаться,может кто подскажет как с этим бороться а лутше сылки на статьи
ledoed #1 - 7 месяцев назад 0
alexprey:
Может координаты не правильно задаешь при создании?
ага оказалась так что маска у меня стояла вот за её пределами и невидно было
alexprey #2 - 7 месяцев назад 2
Может координаты не правильно задаешь при создании?
6

Поиск объекта

» Unity 3D
Добрый день.
Подскажите, плиз, кто в курсе как узнать(найти) какой GameObject расположен по заданным координатам?
В процессе игры на сцене создаются различные игровые объекты. Как в определенный момент игры можно узнать какой же объект находится по заданным координатам в пространстве?
Спасибо.
alexprey #1 - 8 месяцев назад 0
ZZBase, что-то мне подсказывает задача у тебя решается как-то не верное...
ZZBase #2 - 8 месяцев назад 0
Да, похоже придется сдвигать начало луча на n, чтобы потом по направлению получить искомый коллайдер.
Буду копать в этом направлении.
Спасибо.
GeneralElConsul #3 - 8 месяцев назад (отредактировано ) 0
Тут зависит от конкретных обстоятельств.
Например, пусть у тебя высота самого высокого объекта n и ты делаешь рейкаст с такими параметрами:
ray.origin = position;
ray.direction = Vector3.up;
Но у тебя в RaycastHit не попадает коллайдер, внутри которого начинается луч. Ну так никто нам не мешает изменить направление на обратное:
ray.origin = position;
ray.direction = Vector3.up;
ray.origin = ray.GetPoint(n+100);
ray.direction = -Vector3.up;
из той точки, в которой точно не будет объектов. Потолки и прочее можно игнорировать, добавив в отдельный слой или как там это делается.
ZZBase #4 - 8 месяцев назад 0
Да, согласен, можно использовать данный алгоритм. Но данный метод, как и RayCast, имеет погрешность, которая зависит от радиуса сферы или от длины луча. Например если сфера целиком оказалась внутри объекта и коллайдеры не пересекаются, в данном случае если увеличивать радиус сферы, то в эту сферу могут попасть другие объекты. Или же лучом проверять RayCastHit, то от начала луча до проверяемого объекта может находится другой, меньший объект, и RayCast вернет именно мелкий объект, т.к. он первый "встретится" на пути луча.
В идеале было бы здорово если бы радиус сферы или длину луча можно было бы сделать равными нулю, но при этом функция вернула бы объект (или массив объектов) внутри которого находится проверяемся точка.
В любом случае, спасибо, буду пробовать данный метод.
GeneralElConsul #5 - 8 месяцев назад (отредактировано ) 0
Например, использовать docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html
Пример:
Collider[] colliders;
if((colliders = Physics.OverlapShere(transform.position, 1f)).Length > 1)
   {
        foreach(var collider in colliders)
        {
             //Твои действия с найденными объектами через collider.gameObject
        }
   }
Проверить времени нет, но вроде бы должно работать.
XGM Bot #6 - 8 месяцев назад 0
Похожие вопросы:

» ответ
Если я правильно понял, ты хочешь добавить в какой-либо массив юнита, который находится в триггере и соответствует некоторым условиям ( в данном случае tag = "Tag" и lvl = 5) ? Я тут использовал лист, т.к. с ним удобнее работать, но при желании ты можешь юзать статический массив.
» код
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test : MonoBehaviour {

    public List<GameObject> Units = new List<GameObject>();
    void OnTriggerStay2D(Collider2D col)
    {
        if (col.tag == "Tag" || col.GetComponent<MyComponent>().lvl == 5)
        {
            Units.Add(col.gameObject);
        }
    }

10

Как получить координаты коллайдера?

» Unity 3D
Возвращает вектор же, берешь и используешь X и Z. Если тебя интересует горизонтальная плоскость. Если ты говоришь про координаты ячейки. то тут просто округляешь.
var position = ...
const float cellSize = 20.0f;
var cellX = Mathf.Round(position.x / cellSize);
var cellY = Mathf.Round(position.y / cellSize);
как я понял, это координаты ячейки внутри сетки? а если мне нужны "чистые" координаты во всем пространстве?
так?
float x1 = .0;
x1 = box.transform.position.x;
хотя наверное внутри сетки логичнее и удобнее брать
alexprey #1 - 8 месяцев назад 0
GeneralElConsul, а, ну он не деприкейтед, да... так что можно пользоваться пока что
GeneralElConsul #2 - 8 месяцев назад (отредактировано ) 0
GeneralElConsul, если я не ошибаюсь, то этого свойства больше нет и надо создавать новый кватернион Quternion.FromEulers
Посмотрел, да. Но надо то надо, тут речь идет о том, что стыре свойства вполне себе доступны и даже визуально не зачеркнуты(не являются устаревшими) при автозаполнении по крайней мере в monodevelop, так что ничто не помешает невнимательному разрабу допустить ошибку.
alexprey #3 - 8 месяцев назад 0
GeneralElConsul, если я не ошибаюсь, то этого свойства больше нет и надо создавать новый кватернион Quternion.FromEulers
GeneralElConsul #4 - 8 месяцев назад (отредактировано ) 0
transform.rotation - отвечает за вращение.
Пусть автор будет осторожен - это кватернион, их очень сложно перепутать с углами Эйлера, т.к. у него тоже есть поля x, y, z и автор будет недоумевать, что же происходит, а дело в том, что он будет думать, что изменяет углы Эйлера, а на самом деле будет изменять кватернион.
Для углов Эйлера надо использовать trasform.euler_angles или transform.rotation.euler_angles. Лучше не первых порах ими обходится, если не знаешь что такое кватернион.
alexprey #5 - 8 месяцев назад (отредактировано ) 2
просто реальные координаты) забудь про ячейки) какой аналог GetUnitX(..) ? ))
transform.position - это и есть координаты в пространстве.
transform.rotation - отвечает за вращение.
transform.scale - отвечает за масштаб объекта
При чем это будут глобальные координаты. Еще у Unity есть полезность в виде манипуляции локальными координатами (относительно родительского объекта).
transform.localPosition
transform.localRotation
transform.localScale
Diabfall #6 - 8 месяцев назад 0
Может быть имеется ввиду получение глобальных координат вместо локальных? Или перевод локальных в глобальные?
нет

короче, спасибо за помощь! я все понял. просто сонный
Cinos #7 - 8 месяцев назад 0
Может быть имеется ввиду получение глобальных координат вместо локальных? Или перевод локальных в глобальные?
Diabfall #8 - 8 месяцев назад 0
Ты определись что тебе нужно, я думал тебе надо по координатом пространства получить координаты ячейки. Уточни задачу
мне все нужно) за любую лишнюю инфу сяп
просто реальные координаты) забудь про ячейки) какой аналог GetUnitX(..) ? ))
alexprey #9 - 8 месяцев назад 0
Ты определись что тебе нужно, я думал тебе надо по координатом пространства получить координаты ячейки. Уточни задачу
6

перебор колайдеров

» Unity 3D
напоминаю, что только осваиваю Unity и шарп
точка=колайдер
Какая точка определяется, используя
Physics2D.OverlapCircle(Hero.transform.position, 5);
?

Чем принципиально отличается
Physics2D.OverlapCircle(Hero.transform.position, 5); 
и
Physics2D.OverlapCircleAll(Hero.transform.position, 5); 
?
понятно, что приставка All намекает на все точки вокруг, но опять таки: как это использовать?

Diabfall #1 - 8 месяцев назад 0
Devion, спс!
Devion #2 - 8 месяцев назад (отредактировано ) 2
float - аналог real в jass?
да.
в C# есть два типа для значений с плавающей точкой. double и float. double более точный, то есть может сохранить больше знаков. float менее точный, хранит около 7 знаков. Это типы с погрешностью. Они могут хранить очень маленькие и очень большие значения, содержащие не более 32 нулей (или около того) подряд.
То есть через тип float можно выразить числа
12345670000000000000000
1234567
123.4567
0.000000000000001234567
Причем любые числа будут округлены до 6-7 знаков в случае float, то есть число
123.456789 будет округлено до 123.4568
Эти погрешности возникают часто непредсказуемо в зависимости от способа подсчета (быстрый/медленный). Потому строгое сравнение чисел в этом формате недопустимо.
Например сравнение типа x == 0.0f может не произойти, даже если ты вычитаешь из числа само себя. Потому при проверке равенства используют определенные формулы, например
Mathf.Abs(x) < 0.000001f
То есть проверяют число на принадлежность диапозону от -.000001f до +.000001f в данном случае. (Mathf.Abs - это операция модуля)
В зависимости от способа написания числа ты получаешь разный тип.
например в твоем случае
var x1 = .0f; //x1 - переменная типа float
var x1 = .0; //x1 - переменная типа double
var x1 = .0d; //x1 - переменная типа double
Diabfall #3 - 8 месяцев назад 0
alexprey, сяп
а так нельзя?
float x1 = .0;
x1 = Hero.transform.position.x;

OverlapCircleAll - вернет все коллайдеры
ааа, это массив?
Collider2D[] hitbox = Physics2D.OverlapCircleAll(Hero.transform.position, 5);

и очевидный вопрос от дауна
float - аналог real в jass?
alexprey #4 - 8 месяцев назад 4
Diabfall, да, переделай я на часть думаю отвечу)
Хоят
Hero.transform.position
Возвращает вектор же, берешь и используешь X и Z. Если тебя интересует горизонтальная плоскость. Если ты говоришь про координаты ячейки. то тут просто округляешь.
var position = ...
const float cellSize = 20.0f;
var cellX = Mathf.Round(position.x / cellSize);
var cellY = Mathf.Round(position.y / cellSize);
По поводу оверлапов. Смотрим доку и видим:
If more than one collider falls within the circle then the one returned will be the one with the lowest Z coordinate value.
По русски: возвращается первый попавшийся с наименьшей z координатой
OverlapCircleAll - вернет все коллайдеры
Причем они будут уже отсортированы по z координате
Diabfall #5 - 8 месяцев назад (отредактировано ) 0
Кто-то правила нарушает =_=
1 вопрос - 1 тема? D:
alexprey #6 - 8 месяцев назад 0
Кто-то правила нарушает =_=
10

перестали работать скрипты

» Unity 3D
только начал осваивать Unity и шарп
такая проблема: написал простой скрипт, все работало, но после сейва проекта и перезапуска юнити, все скрипты перестали что-то делать или они делают, но я не вижу
при закрытии юнити написали что-то про сцену, я просто прокликал ок
после visual studio стал выдавать сообщение про несовместимые завершения строк
в чем проблема? в сцене? в кривом сейве скрипта?

Читать далее...
alexprey #4 - 8 месяцев назад 0
Diabfall, нет вроде, но он тебя при закрытии спрашивал должен был, ты видимо не стал читать)
Diabfall #5 - 8 месяцев назад 0
alexprey, а автосейв нигде нельзя включить?
alexprey #6 - 8 месяцев назад 2
Diabfall, ты видимо забыл засейвить сцену или после запуска юнити её открыть. Потому что по дефолту юнька может кинуть на новую сцену, вместо предыдущей
Diabfall #7 - 8 месяцев назад (отредактировано ) 0
Гейм обджект определён?
да
все, проблема решена, видимо юнити создал новую сцену, а я оказался настолько туп, что забыл что к ней надо заново прикрепить скрипты
GeneralElConsul #8 - 8 месяцев назад 0
Судя по всему это какой-то тест, так что, думаю, не будет ничего страшного, если ты нажмешь на папку Assets правой клавишей, Export Packages и потом файл .unitypackage пришлешь сюда.
"Тут экстрасенсов нет."(c)
Jusper #9 - 8 месяцев назад 0
Diabfall, сори. Не заметил, что скрипт прокручивается вниз.
Гейм обджект определён?
Diabfall #10 - 8 месяцев назад 0
Ракальный совет - поставь ещё одну скобку } в конце
вот теперь в консоли отображается ошибка про лишнюю } :)