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

ui префаб

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

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

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

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

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

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

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

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

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

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

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

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

» Unity 3D
хочу конвертировать анимацию в движок ,но не знаю как кости ik при этом удалить,в моей анимации всего 4 ik управляющих, но что будет если я засуну rigify c большим количеством ненужных костей
ledoed #1 - 2 месяца назад 0
разобрался как сделать просто реально запекание коряво работает если сделать склет достаточно плохо
Cinos #2 - 2 месяца назад 0
prog, спасибо, не знал.
prog #3 - 2 месяца назад (отредактировано ) 0
Cinos, есть, нативное я и дергаю под капотом, но там есть нюансы - до недавних пор без костылей оно работало только в пределах одной анимации, поэтому нужно было рулить им извне. Сейчас вроде и нативное починили, но скрипт то я уже написал под свои нужды когда нативное запекание надо было через боль и страдание использовать - он у меня и кости чистит лишние, и чеклист проверяет по ряду специфичных для движка свойств модели, некоторые из проблем чинит на ходу и всякое такое - мне нет смысла возвращаться на чистое нативное запекание, учитывая что потом всеравно заново пересобирать весь обвес своего плагина. Кстати, нативный fbx экспортер сейчас вполне может быть тоже умеет запекать IK анимацию, но он у меня тоже самодельным заменен еще во времена когда такой функции там точно не было.
Cinos #4 - 2 месяца назад 0
prog, неужто в блендере нету нативного запекания любого комплексного движения прямо на кости?
prog #5 - 2 месяца назад 0
ledoed, значит неправильно запекал. Лично я пользуюсь для своих целей (не юнити) самописным плагином под блендер, который сперва применяет встроенное блендеровское запекание ключей с IK на обычные кости, потом удаляет IK кости, а потом сохраняет результат в отдельный файл, из которого уже делается экспорт в fbx или любой другой нужный мне формат.
Cinos #6 - 2 месяца назад 0
ledoed, плохо понял о чём ты, неплохо было бы, если ты стукнул ко мне в кайп, и показал, в чём дело. Ты в каком пакете работаешь?
ledoed #7 - 2 месяца назад 0
делал перепекал в fbx потом удалял все ключи к управляющим и удалял сами ik кости,но в таком случае анимация неработает как будто у неё нет анимки но ключи на другие кости присуствуют
Cinos #8 - 2 месяца назад 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 #1 - 2 месяца назад (отредактировано ) 2
В общем советую прочитать офф доку по скриптингу в Unity. Потому что логика у тебя не правильно написана.
OnGUI - нужно использовать только для отображения интерфейса (и то, лучше потом попробовать новую систему UI.
GUI.Button(Rect(10,10,250,50), "Food" = (Food : int));
Эта строчка не валидна по синтаксису
Для изменение данных в течении времени надо использовать OnUpdate или OnFixedUpdate
XGM Bot #2 - 3 месяца назад 0
Похожие вопросы:

» ответ
    var cloneButon = Instantiate(button);
    cloneButon.transform.SetParent(button.transform, false);
    cloneButon.name = "button." + cloneButon.transform.GetSiblingIndex();
У сетпарента обязательно выставляешь false, тогда положение/поворот/масштаб будет "как надо", на том же месте.
» ответ
Возможно порядок вызова отрабатывает не правильно. Я бы сделал немного иначе. Внутри фигуры запрашивал бы данные от кубов.
	var cubeComponents = GetChildrenComponents<CubComponent>(); // получаем список дочерних компонентов типа CubeComponent
	var isRightCollision = cubeComponents.Any(cube => cube.isRight); // проверяем у каждого флаг isRight и если хотя бы у одного стоит, то возврашаем true
	// .. остальные действия
» ответ
Дорогой друг.
Вопрос должен содержать сам вопрос, а не задачу с мутной постановкой.
Следующий раз получишь победные штрафные баллы.

1

AnimationEvent

» Unity 3D
возможно создать евент для анимации не вручную, а из кода и собственно управлять им от туда
GeneralElConsul #1 - 3 месяца назад 2
Разве это не показано в этом коде?
4

Источники частиц

» Unity 3D
Начал разбираться с источниками частиц в юнити. Нашёл почти все параметры какие хотел найти, кроме одного, области спавна частиц, они излучаются вокруг объекта (как на скрине), а хотелось бы чтобы излучались из точки (то есть из самого объекта-пули)
А вообще был бы крайне признателен, если бы кто нибудь шарящий в устройстве источников частиц WC3 и юнити расписал здесь аналогию, какие параметры частиц из WC3 есть в юнити и где их можно найти.
Empyreal #1 - 3 месяца назад (отредактировано ) 0
Вроде понял, когда создал источник частиц отдельно, ответ нашёлся сам собой.
Внизу справа Angle и Radius, вот Radius и отвечает за область излучения.
прикреплены файлы
Jusper #2 - 3 месяца назад 2
а вокруг неё.
Создай пустой Gameobject внутри пули с центром в центре пули. LoL.
И к ней присоедини Particle System, а не к спрайту пули.
Надеюсь ты меня понял :D
Empyreal #3 - 3 месяца назад (отредактировано ) 0
Вроде как он к ней и привязан, след из частиц оставляет за собой именно пуля. Просто частицы излучаются не из центра пули, а вокруг неё.
Делал через Inspector -> Add Component -> Particle System в спрайте пули.
Я не шарю прост совсем, скачал юнити пару дней назад.
Jusper #4 - 3 месяца назад (отредактировано ) 0
Ты же можешь источник частиц привязать к точке, присоединенной к пуле (в центре) и, по идее, задача будет решена.