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

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

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

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

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

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

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

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

Основы программирования шейдеров. #6 Surface Shader

» Unity 3D
Шестая статья из серии статьей по основам программирования шейдеров в Unity. В этой статье мы начнем разбираться, что там творится с Surface шейдерами в Unity.

Читать далее...
Jusper #1 - 2 месяца назад 0
Спасибо.
Благодаря тебе и курсу на Udemy, я запрограммировал свой первый Surface шейдер.
1

управление

» Unity 3D
Здравствуйте. Я новичок. Скажите, можно ли сделать управление, с разделением тачпада на зоны. Допустим игра "осьминог". Тачпад разделен на 8 вертикальных полос. Каждая полоса - движение одной из щупалец. То есть разбить тачпад на 8 осей координат, независимых друг от друга. Если это реально, то подскажите, каким образом это можно реализовать. Заранее спасибо&#8206;
alexprey #1 - 2 месяца назад 1
Тачскрин или обычный тачпад для ноутбуков? Во втором случае есть проблема в том, что у него специфичные драйверы, которые не дадут получить информацию более чем об одном касании, а так же информацию о положении касания относительно тачпада.
С тачскрином работать проще, т.к. он предоставляет всю эту информацию.