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

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

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

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

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

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

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

ui префаб

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

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

» Unity 3D
Добрый день.
Подскажите, плиз, кто в курсе как узнать(найти) какой GameObject расположен по заданным координатам?
В процессе игры на сцене создаются различные игровые объекты. Как в определенный момент игры можно узнать какой же объект находится по заданным координатам в пространстве?
Спасибо.
alexprey #1 - 4 месяца назад 0
ZZBase, что-то мне подсказывает задача у тебя решается как-то не верное...
ZZBase #2 - 4 месяца назад 0
Да, похоже придется сдвигать начало луча на n, чтобы потом по направлению получить искомый коллайдер.
Буду копать в этом направлении.
Спасибо.
GeneralElConsul #3 - 4 месяца назад (отредактировано ) 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 - 4 месяца назад 0
Да, согласен, можно использовать данный алгоритм. Но данный метод, как и RayCast, имеет погрешность, которая зависит от радиуса сферы или от длины луча. Например если сфера целиком оказалась внутри объекта и коллайдеры не пересекаются, в данном случае если увеличивать радиус сферы, то в эту сферу могут попасть другие объекты. Или же лучом проверять RayCastHit, то от начала луча до проверяемого объекта может находится другой, меньший объект, и RayCast вернет именно мелкий объект, т.к. он первый "встретится" на пути луча.
В идеале было бы здорово если бы радиус сферы или длину луча можно было бы сделать равными нулю, но при этом функция вернула бы объект (или массив объектов) внутри которого находится проверяемся точка.
В любом случае, спасибо, буду пробовать данный метод.
GeneralElConsul #5 - 4 месяца назад (отредактировано ) 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 - 4 месяца назад 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 - 4 месяца назад 0
GeneralElConsul, а, ну он не деприкейтед, да... так что можно пользоваться пока что
GeneralElConsul #2 - 4 месяца назад (отредактировано ) 0
GeneralElConsul, если я не ошибаюсь, то этого свойства больше нет и надо создавать новый кватернион Quternion.FromEulers
Посмотрел, да. Но надо то надо, тут речь идет о том, что стыре свойства вполне себе доступны и даже визуально не зачеркнуты(не являются устаревшими) при автозаполнении по крайней мере в monodevelop, так что ничто не помешает невнимательному разрабу допустить ошибку.
alexprey #3 - 4 месяца назад 0
GeneralElConsul, если я не ошибаюсь, то этого свойства больше нет и надо создавать новый кватернион Quternion.FromEulers
GeneralElConsul #4 - 4 месяца назад (отредактировано ) 0
transform.rotation - отвечает за вращение.
Пусть автор будет осторожен - это кватернион, их очень сложно перепутать с углами Эйлера, т.к. у него тоже есть поля x, y, z и автор будет недоумевать, что же происходит, а дело в том, что он будет думать, что изменяет углы Эйлера, а на самом деле будет изменять кватернион.
Для углов Эйлера надо использовать trasform.euler_angles или transform.rotation.euler_angles. Лучше не первых порах ими обходится, если не знаешь что такое кватернион.
alexprey #5 - 4 месяца назад (отредактировано ) 2
просто реальные координаты) забудь про ячейки) какой аналог GetUnitX(..) ? ))
transform.position - это и есть координаты в пространстве.
transform.rotation - отвечает за вращение.
transform.scale - отвечает за масштаб объекта
При чем это будут глобальные координаты. Еще у Unity есть полезность в виде манипуляции локальными координатами (относительно родительского объекта).
transform.localPosition
transform.localRotation
transform.localScale
Diabfall #6 - 4 месяца назад 0
Может быть имеется ввиду получение глобальных координат вместо локальных? Или перевод локальных в глобальные?
нет

короче, спасибо за помощь! я все понял. просто сонный
Cinos #7 - 4 месяца назад 0
Может быть имеется ввиду получение глобальных координат вместо локальных? Или перевод локальных в глобальные?
Diabfall #8 - 4 месяца назад 0
Ты определись что тебе нужно, я думал тебе надо по координатом пространства получить координаты ячейки. Уточни задачу
мне все нужно) за любую лишнюю инфу сяп
просто реальные координаты) забудь про ячейки) какой аналог GetUnitX(..) ? ))
alexprey #9 - 4 месяца назад 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 - 4 месяца назад 0
Devion, спс!
Devion #2 - 4 месяца назад (отредактировано ) 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 - 4 месяца назад 0
alexprey, сяп
а так нельзя?
float x1 = .0;
x1 = Hero.transform.position.x;

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

и очевидный вопрос от дауна
float - аналог real в jass?
alexprey #4 - 4 месяца назад 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 - 4 месяца назад (отредактировано ) 0
Кто-то правила нарушает =_=
1 вопрос - 1 тема? D:
alexprey #6 - 4 месяца назад 0
Кто-то правила нарушает =_=
10

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

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

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

Изменение цвета текста при наведении

» Unity 3D
Люди, помогите, мне нужна функция в виде скрипта. Вообщем чтоб когда я наводил на текст в главном меню, текст менял свой цвет например на красный, а когда обратно убирал с этого текста он обратно менял цвет на белый.
Jusper #1 - 4 месяца назад 0
Тебе нужен объект UI -> Text.
У него есть компонент стандартный - Text (Script)
А в нем есть есть цвета:
On highlight - при наведении - то что тебе необходимо.
или On click - по клику
8

конверт анимации

» Unity 3D
хочу конвертировать анимацию в движок ,но не знаю как кости ik при этом удалить,в моей анимации всего 4 ik управляющих, но что будет если я засуну rigify c большим количеством ненужных костей
ledoed #1 - 4 месяца назад 0
разобрался как сделать просто реально запекание коряво работает если сделать склет достаточно плохо
Cinos #2 - 4 месяца назад 0
prog, спасибо, не знал.
prog #3 - 4 месяца назад (отредактировано ) 0
Cinos, есть, нативное я и дергаю под капотом, но там есть нюансы - до недавних пор без костылей оно работало только в пределах одной анимации, поэтому нужно было рулить им извне. Сейчас вроде и нативное починили, но скрипт то я уже написал под свои нужды когда нативное запекание надо было через боль и страдание использовать - он у меня и кости чистит лишние, и чеклист проверяет по ряду специфичных для движка свойств модели, некоторые из проблем чинит на ходу и всякое такое - мне нет смысла возвращаться на чистое нативное запекание, учитывая что потом всеравно заново пересобирать весь обвес своего плагина. Кстати, нативный fbx экспортер сейчас вполне может быть тоже умеет запекать IK анимацию, но он у меня тоже самодельным заменен еще во времена когда такой функции там точно не было.
Cinos #4 - 4 месяца назад 0
prog, неужто в блендере нету нативного запекания любого комплексного движения прямо на кости?
prog #5 - 4 месяца назад 0
ledoed, значит неправильно запекал. Лично я пользуюсь для своих целей (не юнити) самописным плагином под блендер, который сперва применяет встроенное блендеровское запекание ключей с IK на обычные кости, потом удаляет IK кости, а потом сохраняет результат в отдельный файл, из которого уже делается экспорт в fbx или любой другой нужный мне формат.
Cinos #6 - 4 месяца назад 0
ledoed, плохо понял о чём ты, неплохо было бы, если ты стукнул ко мне в кайп, и показал, в чём дело. Ты в каком пакете работаешь?
ledoed #7 - 4 месяца назад 0
делал перепекал в fbx потом удалял все ключи к управляющим и удалял сами ik кости,но в таком случае анимация неработает как будто у неё нет анимки но ключи на другие кости присуствуют
Cinos #8 - 4 месяца назад 2
Чтобы переместить костную анимацию в движок, сначала надо перепечь анимацию с рига на кости
2

Скрипт

» Unity 3D
Помогите пожалуйста. Вот написал что-то. Вообщем ребята я хочу чтоб когда проходило время 1 минута игровая у меня отнималась 1 ед. Еды, и когда еды становилось 0, тогда отнимались жизни по 30 секунд 1 ед. Жизни. И ещё ребята, у меня не отображается кнопки которые я создал в этом скрипте.
Наброски.
var Food : int = 100;
var Health : int = 100;
var Minus_Food = false;
var Time_For_MinusF : float = 10;
function OnGUI () {
GUI.Button(Rect(10,10,250,50), "Food" = (Food : int));
Minus_Food = true;
Time_For_MinusF = 10;
Food -= 1;
Food = 0;
Minus_Food = false;
Health -= 1;
}
GUI.Button(Rect(10,60,250,50), "Health" = (Health : int));
function DestroyGUI(){
yield WaitForSeconds (Time_For_MinusF);
Food -= 1;
}
alexprey #2 - 4 месяца назад (отредактировано ) 2
В общем советую прочитать офф доку по скриптингу в Unity. Потому что логика у тебя не правильно написана.
OnGUI - нужно использовать только для отображения интерфейса (и то, лучше потом попробовать новую систему UI.
GUI.Button(Rect(10,10,250,50), "Food" = (Food : int));
Эта строчка не валидна по синтаксису
Для изменение данных в течении времени надо использовать OnUpdate или OnFixedUpdate