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)

FREE MAN 11.09.2015 02:23

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

Жека 11.09.2015 06:54

Ответ: Вопросы от новичка
 
Phyton, а в чём проблема программно удалить чайлда? Он ничем не отличается от других объектов.

gruz = Instantiate();
gruz.setParent(gruzovik);
// что-то делаем
Destroy(gruz);

всё должно работать. даже gruz.setParent(null); можно не делать.

FREE MAN 11.09.2015 09:35

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

Сообщение от Жека (Сообщение 299525)
Phyton, а в чём проблема программно удалить чайлда? Он ничем не отличается от других объектов.

gruz = Instantiate();
gruz.setParent(gruzovik);
// что-то делаем
Destroy(gruz);

всё должно работать. даже gruz.setParent(null); можно не делать.

Проблем в создании, удаление нету. Проблема в том, что груз считает дистанцию только от точки, где создался. А нужно, что бы считалась от грузовика. Грузовик то двигается и дистанция не считается с грузовиком, а точку, где создался префаб не двигается вместе с грузовиком.

Жека 11.09.2015 13:24

Ответ: Вопросы от новичка
 
Щас проверил: если двигать родителя, то дочерний transform.position тоже меняется. В редакторе не меняется, а если вывести в коде
PHP код:

print(transform.position.x+","+transform.position.y); 

то получим сдвиг как у родителя. выходит, и дистанция должна корректно считаться.

EDIT: в редакторе мы видим координаты, которые соответствуют transform.localPosition - это смещение относительно родителя.

FREE MAN 11.09.2015 16:26

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

Сообщение от Жека (Сообщение 299538)
Щас проверил: если двигать родителя, то дочерний transform.position тоже меняется. В редакторе не меняется, а если вывести в коде
PHP код:

print(transform.position.x+","+transform.position.y); 

то получим сдвиг как у родителя. выходит, и дистанция должна корректно считаться.

EDIT: в редакторе мы видим координаты, которые соответствуют transform.localPosition - это смещение относительно родителя.

Я решил проблему другим способом сделал Тригер в виде сферы и повесил ее на грузовик, по тегу проверяю вышел ли груз за пределы сферы и все нормально. С дистанцией таки не смог разобраться как ни крути груз считает дистанцию только от точки где создался. Если бы груз был просто в сцене загружен сразу то проблем нету считает дистанцию корректно. Когда создаешь префаб кодом происходит натуральное шило.

pax 12.09.2015 02:08

Ответ: Вопросы от новичка
 
Да имхо ты где-то простой косяк в расчетах сделал.
PHP код:

Vector3.Distance (cars[0].positiontransform.position); 

Тут как я понял дистанция между объектом potera_gruza (transform) и машиной cars[0]. Где сам груз то?

FREE MAN 12.09.2015 11:34

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

Сообщение от pax (Сообщение 299558)
Да имхо ты где-то простой косяк в расчетах сделал.
PHP код:

Vector3.Distance (cars[0].positiontransform.position); 

Тут как я понял дистанция между объектом potera_gruza (transform) и машиной cars[0]. Где сам груз то?

Код:

using UnityEngine;
using System.Collections;

public class potera_gruza : MonoBehaviour {

        public Transform[] cars;
        //public static int seletc_gruz_random;
        public float Distance_gruz;
        void Start () {
       
        }

        //void Update () {
                void LateUpdate() {
                Debug.Log ("Destroy_gruzes "+Destroy_gruz.Destroy_gruzes);

                if (Time.frameCount % 20 == 0) {
                        if (cars[0]) {
                        float dist = Vector3.Distance (cars[0].position, transform.position);
                                        if (dist > Distance_gruz) {
                                        Destroy_gruz.Destroy_gruzes = 1;
                                                return;
                               
                                        }
                        }
        }
}
}

Этот скрипт и висит на грузе.
А вот и сам просчет дистанции с машиной и грузом.
Код:

float dist = Vector3.Distance (cars[0].position, transform.position);

pax 12.09.2015 16:59

Ответ: Вопросы от новичка
 
Есть вероятность, что при создании кодом и создании в редакторе структуры объектов отличаются? Или возможно скрипт potera_gruza добавляется не тому объекту?

FREE MAN 12.09.2015 18:26

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

Сообщение от pax (Сообщение 299567)
Есть вероятность, что при создании кодом и создании в редакторе структуры объектов отличаются? Или возможно скрипт potera_gruza добавляется не тому объекту?

Скрипт добавляется грузу. Я думаю, что при создании кодом теряется связь префаба с грузовиком. По факту я решил проблему уже только через тригер.

pax 12.09.2015 21:27

Ответ: Вопросы от новичка
 
Префаб никак не может быть связан с объектом сцены, только наоборот. При создании экземпляра префаба в сцене надо обязательно ему ссылки на объекты сцены передавать.

RegIon 13.10.2015 00:58

Ответ: Вопросы от новичка
 
В Unity 5 Wheel Collider теперь направлен по строго по Y ригида к которому он прикручен???
Что за ересь, теперь никак не развернуть?( у меня танк боком ездить теперь только умеет(у blendera поменяны x и y оси) )

ILonion 26.10.2015 23:09

Ответ: Вопросы от новичка
 
Как убрать устаревшие ненужные из списка?
http://puu.sh/kYyiu/566f6f7ae8.png

pax 27.10.2015 07:09

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

ILonion 27.10.2015 16:08

Ответ: Вопросы от новичка
 
Подскажите 2 вещи в свете производительности:
1. Если у меня одинаковые текстуры для материалов, но часть мешей требует материала cutout, прочие opaque. Разделять ли их по материалам как они "просят", или всех сажать на 1 cutout и пусть ориентируются по альфа-маске? В свете производительности?

2. Отрезаются ли те объекты, которые вне поля зрения камеры (но в пределах planes) если не используется Occl.cul.? В руководстве как-то туманно для меня это описано.
И если не отрезаются и рендерятся все вместе, то можно как-то их отрезать не используя Occl.cul.?

pax 27.10.2015 17:44

Ответ: Вопросы от новичка
 
1. Если для мобильников, то лучше два материала.
2. Если отключен окклюжн кулинг, то рисуются абсолютно все объекты. Отрезать вручную вроде нельзя (если только отключать Renderer'ы ненужных объектов).

ILonion 27.10.2015 21:25

Ответ: Вопросы от новичка
 
Нет, для ПЦ.
Плохо, что нельзя.
Спасибо!

RegIon 08.11.2015 23:23

Ответ: Вопросы от новичка
 
Лучше не использовать анимацию UI на мобилках ?
Просто простейшее перемещение капец как лагает.

pax 09.11.2015 00:03

Ответ: Вопросы от новичка
 
Пробуй на перемещаемые объекты вешать CanvasGroup.

RegIon 09.11.2015 00:07

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

Сообщение от pax (Сообщение 301148)
Пробуй на перемещаемые объекты вешать CanvasGroup.

А зачем?
Что бы отключать рейкаст на время перемщения?

pax 09.11.2015 14:07

Ответ: Вопросы от новичка
 
Скорее для того, чтобы не пересчитывать весь UI, ты же не описал что у тебя за лаги. Ну и PixelPerfect выключай до кучи. Он больно много жрет.

RegIon 10.11.2015 08:27

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

Сообщение от pax (Сообщение 301175)
Скорее для того, чтобы не пересчитывать весь UI, ты же не описал что у тебя за лаги. Ну и PixelPerfect выключай до кучи. Он больно много жрет.

Анимация проскакивает, разрывается UI, типо как в играх,когда при рассинхронизации развертки и монитора бывают разрывы. Показать не могу - на мобилке только.
PixelPerfect всегда был выключен, не знаю почему вырубил, наверное с ним вообще все плохо.

pax 10.11.2015 09:10

Ответ: Вопросы от новичка
 
К сожалению с мобильниками опыта нету, в стимкрафте UI анимирован через Mecanim и окно Animation. У нас еще Unity 4.6.5 без оптимизаций UI, как в Unity 5.2

RegIon 10.11.2015 13:32

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

Сообщение от pax (Сообщение 301238)
К сожалению с мобильниками опыта нету, в стимкрафте UI анимирован через Mecanim и окно Animation. У нас еще Unity 4.6.5 без оптимизаций UI, как в Unity 5.2

Ну так и я анимировал.

Okay 11.11.2015 01:25

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

Vector3 vec = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.parent.transform.position = new Vector3(vec.x, 0, 0);

Пытаюсь передвинуть парента, который находится в Canvas'e, координаты по оси Z улетают сразу в -549. В чем может быть проблема?

RegIon 11.11.2015 07:23

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

Сообщение от Okay (Сообщение 301284)
Код:

Vector3 vec = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.parent.transform.position = new Vector3(vec.x, 0, 0);

Пытаюсь передвинуть парента, который находится в Canvas'e, координаты по оси Z улетают сразу в -549. В чем может быть проблема?

Может потому что канва относительно экрана?

Okay 11.11.2015 11:32

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

Сообщение от RegIon (Сообщение 301287)
Может потому что канва относительно экрана?

Прошу прощения, почти сразу после написания поста это понял)

Okay 13.11.2015 20:38

Ответ: Вопросы от новичка
 
Такой вопрос про Resources.Load
В Editor'e все нормально работает. Билд же просто напросто отказывается загружать текстуры из этой папки.


Цитата:

NullReferenceException
at (wrapper managed-to-native) UnityEngine.Material:Internal_CreateWithShader (UnityEngine.Material,UnityEngine.Shader)

at UnityEngine.Material..ctor (UnityEngine.Shader shader) [0x00006] in C:\buildslave\unity\build\artifacts\generated\comm on\runtime\ShaderBindings.gen.cs:168

at PlayGameController.Start () [0x00012] in D:\bdocuments\ForKidsPuzzle\Assets\Game\PlayGameCo ntroller.cs:21
Код:

gObject.gameObject.GetComponent<SpriteRenderer>().material = new Material(Shader.Find("MaskedTexture"));

Okay 13.11.2015 21:05

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

Сообщение от Okay (Сообщение 301379)
Такой вопрос про Resources.Load
В Editor'e все нормально работает. Билд же просто напросто отказывается загружать текстуры из этой папки.




Код:

gObject.gameObject.GetComponent<SpriteRenderer>().material = new Material(Shader.Find("MaskedTexture"));

Проблема решена. Шейдер не входил в билд (Думаю из-за того, что его не было на ГО нигде)
Занес в Preload assets - Все работает

Okay 16.11.2015 20:07

Ответ: Вопросы от новичка
 
Откуда появляются черные линии?
Сурс имейдж - 100x100
Готовая нарезка - 50x50

Вот код
Код:

Details = new Texture2D[4];
            for (int i = 0; i < 4; i++ )
            {
                Details[i] = new Texture2D(50, 50, TextureFormat.RGBAFloat, false);
            }
            //tempColor = new Color32[625];
            int c = 0;
            for(int x = 0; x < 2; x++)
            {
                for (int y = 0; y < 2; y++)
                {
                    Color[] pixes = GetTexture.GetPixels(x * 50, y * 50, 50, 50);
                    Details[c].SetPixels(pixes);
                    c++;
                }
            }


Arton 16.11.2015 20:21

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

Сообщение от Okay (Сообщение 301534)
Откуда появляются черные линии?

Возможно с противоположной стороны, надо тогда отключить «бесшовность», не знаю как правильно назвать. Что бы текстура не повторялась.

Okay 16.11.2015 20:28

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

Сообщение от Arton (Сообщение 301536)
Возможно с противоположной стороны, надо тогда отключить «бесшовность», не знаю как правильно назвать. Что бы текстура не повторялась.

Не думаю. Границы везде прозрачные

pax 16.11.2015 22:07

Ответ: Вопросы от новичка
 
texture.wrapMode = TextureWrapMode.Clamp;

Okay 16.11.2015 22:16

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

Сообщение от pax (Сообщение 301546)
texture.wrapMode = TextureWrapMode.Clamp;

NICE!
Проблема сразу решилась, благодарю :super:

Okay 18.11.2015 03:24

Ответ: Вопросы от новичка
 
Есть ли где шейдер, похожий на Toon Outline, только для 2D?
Сроду не писал шейдеры, поэтому написать самому не представляется возможность

ILonion 24.11.2015 15:37

Ответ: Вопросы от новичка
 
pax, подскажи, пожалуйста такую штуку:
есть GO, двигаю его через Translate z+. В зависимости от поворота GO направление перемещения соотв. меняется. Как мне получить координаты точки идущей впереди от GO, скажем, со смещением +1 (без использования дочернего смещенного GO)?

pax 24.11.2015 17:46

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

var offset 0.5f;
var 
point transform.position transform.forward offset

Вариант 2:
PHP код:

var point transform.TransformPoint(new Vector3(0,0,0.5f)); 

Вариант 3:
PHP код:

var point transform.localToWorldMatrix.MultiplyPoint(new Vector3(0,0,0.5f)); 


Taugeshtu 24.11.2015 20:31

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

var direction Vector3.forward *0.5f;
var 
rotatedDirection transform.rotation *direction;
var 
point transform.position rotatedDirection

Ну так, в коллекцию :)

Подумал, и дописал:
Может пригодиться, когда трансформа нет, только кватернион.

ILonion 24.11.2015 23:45

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

RegIon 11.12.2015 21:50

Ответ: Вопросы от новичка
 
Блин, Unity обновили, но косяк со студией так и остался - открывается очень долго и порой по несколько раз.
А в монодевелоп совсем сломали copypast

RegIon 14.12.2015 12:37

Ответ: Вопросы от новичка
 
Не могу понять почему не сохраняется quality в settings_quality, showFPS главное сохраняется, а он нет.
События updateSettings и saveSettings 100% вызываются.
После загрузки, quality = 0


Собственно проблема тут: http://iexpo.tk/game/

pax 14.12.2015 16:11

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

RegIon 14.12.2015 16:41

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

Сообщение от pax (Сообщение 302606)
Проверь, в каком порядке вызываются. Может ты сохраняешь настройки еще не загрузив их.

Да вроде проверял. И очередность судя по логам нормальная:


Цитата:

[SETTINGS] be saved
нету -значит вообще при старте не сохраняет, только при изменении.

Гребаный делегат, почему он вызывается при старте? А, хотя понятно почему.


Исправил, поставив загрузку настрое до присвоения события.

RegIon 15.12.2015 13:49

Ответ: Вопросы от новичка
 
Можно как-то получить все объекты на сцене, включая выключенные из CustomEditor ? По идее для редактора они должны быть равнозначными и как-то можно получить, но не нашел в справке!!

Жека 30.01.2016 15:52

Ответ: Вопросы от новичка
 
Локализация игры.
Подскажите какой-нибудь способ - как подменять картинки согласно текущей локали.
С текстами я придумал простой способ, а с картинками пока нет. Просто вытаскиванием из бандла/ресурсов, разве что.

pax 31.01.2016 09:51

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

AVL 01.02.2016 00:56

Ответ: Вопросы от новичка
 
Товарищи, я нифига не понял... По какой логике работает сжатие текстур в юнити? В гугле выдается куча статей и обсуждений по теме того как оптимизировать размер билда, но там обычно уже оптимизации на тему того как уменьшить размер текстуры, не сильно потеряв в качестве. Но блин, как получается так что когда все ассеты в png весят 20мб, билд под Android - 30мб, но при этом билд под винду - 200мб, а под webgl - вообще все 300? При том что для всех текстур стоит сжатие по умолчанию - Compressed.
С webgl вот что непонятно: в папке билда появляются 2 папки - Compressed и Release. И во всех туториалах написано, что сервер, увидев .htaccess файл, будет отправлять браузеру только Compressed. Тогда зачем вообще нужна папка с несжатыми ассетами, зачем ее заливать на сервер, и почему без нее игра не запускается? Например, хочу залить на itch.io, все 300мб в zip сжались до 30, но вот игра не запускается - сайт жалуется на слишком большой файл.

pax 01.02.2016 07:24

Ответ: Вопросы от новичка
 
Обновись уже на Unity 5.3, там в webgl только сжатый билд. Вообще с WebGL надо разные версии Unity пробовать, 5.3.1 крашится у нас к примеру. Я бы на твоем месте взял последний патч релиз отсюда: http://unity3d.com/unity/qa/patch-releases

Жека 01.02.2016 08:01

Ответ: Вопросы от новичка
 
Ещё в юнити есть штука Sprite Packer в меню Window. По дефолту выключена. Если твои картинки в отдельных файлах, то полезно включать пакер.

RegIon 01.02.2016 13:06

Ответ: Вопросы от новичка
 
Его лучше включить после того, как добавил-изменил ресурсы, а то как расчет освещения - будет жрать ресурсы, если без зпрядки на ноуте сидишь - слеиает заряд моментально, так как CPU на 100% крутится.

Я сделал кастом инспектор, который составляет соответсвие локали с объектами с тегом multilang. Он загоняет их в json. Текст выглядит как %marker - по нему выбирается из json пака слов, а спрайт/текстура как %tex_marker, он уже выбирается из префабов (лучше из ресов наверное ) с именем marker.

На объектах где языкозависимый ресурс - скрипт, где он подписан на обновление контроллера, через который происходиь изменение ланга. Т.е меняешь индекс в контроллере - он рассылает эвент о смене языка, после которого объект запрашивает у него текст/картинку на которкэую сменить по %marker , и если он есть - возвращает новый. Так, если частичный перевод нет проблем с отсутсвием текста вообще, если в лангпаке его нет -стоит прошлый, в котором есть ресурс.

Жека 01.02.2016 14:44

Ответ: Вопросы от новичка
 
RegIon, я примерно так же делать буду.

Вопрос по файлу .gitignore.
Я надавно прочитал, что в папке Library хранится важная инфа, meta-данные о связях объектов.
Пришлось включить эту папку в гит (кроме кэша шейдеров), до этого была выключена, т.к. я использовал "рекомендуемый" .gitignore, взятый на стэковерфлоу.

Но в папке Library столько шлака, файлы то создаются, то удаляются.
Кто шарит, подскажите - что делать с этой папкой.

Taugeshtu 01.02.2016 17:06

Ответ: Вопросы от новичка
 
Library в репозитории быть не должна по идее. Единственный "минус" от её отсутствия в репе - при клонировании репы в новое место юнити придётся переимпортировать ассеты в свои кэши. Один раз. Мета-данные лежат в файлах .meta.

Наш .gitignore:
PHP код:

[Ll]ibrary/
[
Tt]emp/
[
Oo]bj/
[
Bb]uild/
[
Bb]uild_*/
.
vscode/

[
Tt]emp.meta

# Autogenerated VS/MD solution and project files
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj

# Unity3D generated meta files
*.pidb.meta 

Юнити имеет следующую страницу мануала, где в числе прочего упоминается:
Цитата:

8. Optional: Set up an ignore filter for the unversioned Library directory: svn propedit svn:ignore MyUnityProject/ Subversion will open a text editor. Add the Library directory.

Жека 01.02.2016 19:32

Ответ: Вопросы от новичка
 
Спасибо. Щас снова читал про эту папку и увидел

《As a user, you should never have to alter the Library folder manually and attempting to do so may affect the functioning of the project in the Unity editor. However, it is always safe to delete the Library folder (while the project is not open in Unity) as all its data is generated from what is stored in the Assets and ProjectSettings folders.》

Значит, моя ошибка была в том, что я закачал из репы файлы в момент, когда редактор был открыт.
В итоге похерились некоторые назначенные паблик переменные.
И как раз я наткнулся на инфу что library полезна.
Вот и добавил её. Но там реально шлак с точки зрения пригодности для репозитория.

Теперь ясно стало.

RegIon 12.02.2016 21:46

Ответ: Вопросы от новичка
 
Как *епть* в Unity получить угол по оси X в диапазоне 0 - 360 ???

Я устал и не могу это понять... эти углы эйлера зло. Тем более в юнити. ТО у нее угол дофига, то ограничен 180 градусов.

Нужно узнать какая цифра барабана игрового автомата выпала. автомат 6*ти значный, на 3 барабана.

pax 13.02.2016 19:57

Ответ: Вопросы от новичка
 
Обычно ты можешь просто запомнить угол и его менять в отдельной флоат переменной, а потом применять вращение к барабану (transfrom.eulerAngles = new Vector3(angle, 0,0) или transform.rotation = Quaternion.Euler(angle, 0,0)). Это самый простой и верный способ.

Ну а в целом я бы на твоем месте считал бы угол между осью, перпендикулярной к оси барабана (Например Vector3.up, если ось барабана это Vector3.right) и такой же осью на самом барабане (например transform.up) с помощью Vector3.Angle. Это будет угол 0..180. Знак угла можно определить через векторное произведение up векторов. Далее можно так же получить угол между векторами Vector3.right и полученным с помощью векторного произведения вектором, если угол < 90 градусов (вектора смотрят примерно в одну сторону), то это один знак, если больше, то другой (вектора смотрят в разные стороны). Потом с полученным знаком угол будет -180..180 и его можешь использовать. Так можно решить задачу при произвольной ориентации барабана, если знать направления осей.

UPD: Описал чуть более понятно. И к сведению - Unity не работает с углами Эйлера, вращение в Unity хранится в кватернионе и по требованию (transform.eulerAngles) кватернион преобразуется в углы Эйлера. Поэтому они часто не имеют значения 180-360 и т.д а имеют значения в диапазоне -90..90 и подобные, но в целом могут быть разные, т.к. конвертация кватерниона в углы Эйлера не может дать гарантии преобразования в угол например 720 (два оборота).

Владимир 25.02.2016 13:54

Ответ: Вопросы от новичка
 
Доброго времени суток.
Собственно вот и я пришел на ваш форум поскольку начал осваивать Unity. За тупые вопросы сильно не пинайте, поскольку изучаю Unity всего месяц, притом месяц же изучаю и C#(более того не программер, в молодости учил только C++ и то дальше простеньких программ не пошло), поэтому вопросы могут быть весьма тупыми. И то и другое изучаю на боевую, т.е. пишу простенькую игрушку.
Итак собственно вводные:
Есть объект игрока, есть объект врага и есть объект растения. Урон наноситься игроком врагу или растению и врагом всем остальным Урон наноситься непосредственным контактом. Если рассматривать коллизию 1:1 то проблем написать такой код у меня нет, есть проблема с написанием кода 1:многим. Моя цель выбрать из всех объектов с которыми я столкнулся один, с минимальным значением одной из переменных экземпляра объекта, а для этого мне нужно получить количество объектов с которым столкнулся мой игрок.
Вот кусок кода:

Код:

void OnCollisionEnter2D(Collision2D coll)
    {
        // Получаем количество коллизий.
        int count = coll.contacts.Length;
        //Объявляем переменную объекта.
        GameObject ob;
        //Объявляем переменную объекта с минимальным hp.
        GameObject minHpOb;
        Debug.Log("Количество коллизий : " + coll);

        //Задаем цикл  в котором перебираем всех противников
        for (int i = 0; i < coll; i++)
        {

            //выбираем только объекты с тегами Plant, Player, Enemy
            if (coll.contacts[i].collider.gameObject.tag == "Plant" || coll.contacts[i].collider.gameObject.tag == "Player" || coll.contacts[i].collider.gameObject.tag == "Enemy")
            {
                //Получаем GameObject и присваиваем переменной.
                ob = coll.contacts[i].collider.gameObject;
                Debug.Log("Имя объекта с которым столкнулись : " + ob);
           
                //первое присваивание minHpOb объекту ob.
                if (minHpOb = null)
                {
                    minHpOb = ob;
                }

Тут то и возникла главная моя проблема. Как я понимаю функции OnCollisionEnter2D и OnCollisionStay2D обрабатываются для каждой коллизии отдельно. Т.е. по факту переменная count = coll.contacts.Length; будет всегда равна 1(хотя вроде как до 5 версии все работало правильно и выдавалось именно общее количество коллизий). Собственно из этого и вытекают мои вопросы.
1. Мне собственно нужно получить количество объектов с которыми столкнулся объект игрока. Что почитать? Офф. справку читал, но если честно мало, что понял в данном конкретном вопросе.
2.OnCollisionExit2D срабатывает при любом выходе из коллизии даже в случае множественных коллизий(т.е. если из нескольких действующих коллизий одна прервалась)?
Готовых решений не ищу, скорей нужен совет, что почитать или как лучше реализовать в плане логики алгоритм получения количества коллизий, если выбранный мной простой путь не работает или в корне не верен.
Заранее спасибо!

Nex 25.02.2016 14:36

Ответ: Вопросы от новичка
 
1. Можно создать список для проверяемых объектов. При событии OnCollisionEnter2D добавлять в этот список объект с которым столкнулись. При событии OnCollisionExit2D удалять объект с которым было столкновение из списка. И где нибудь в Update обрабатывать этот список с объектами.
Но тут возможно может получится так, что объект может записаться в список столкновений и тут же удалится, а функция обработки запустится после всего этого. Но можно вызывать функцию обработки прям из события OnCollisionEnter2D.
Код:

    void OnCollisionEnter2D(GameObject obj) {
        collidersList.Add(obj);
        UpdateCollidersList();
    }

    void OnCollisionExit2D(GameObject obj) {
        if (collidersList.Contains(obj)) {
            collidersList.Remove(obj);
        }
    }

    void UpdateCollidersList() {
        // обработка списка столкновений и тд.
    }
}

2. Можно использовать Physics2D.OverlapPointAll для получения массива рядом находящихся объектов.

Жека 29.02.2016 06:27

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

Сообщение от RegIon (Сообщение 304037)
Как *епть* в Unity получить угол по оси X в диапазоне 0 - 360 ???

Вот это
PHP код:

Vector3 euler transform.localRotation.eulerAngles

возвращает углы в 0..360.
Пробовал такое?

Жека 29.02.2016 06:38

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

Сообщение от Владимир (Сообщение 304273)
Как я понимаю функции OnCollisionEnter2D и OnCollisionStay2D обрабатываются для каждой коллизии отдельно.

1. Полагаю, что при нескольких столкновениях ты получишь несколько вызовов этих функций, в каждой из которых информация об одном объекте столкновения.
2. Collision2D.contacts - это точки столкновения, т.е. части одного объекта, с которым столкнулись.

Цитата:

Сообщение от Владимир (Сообщение 304273)
1. Мне собственно нужно получить количество объектов с которыми столкнулся объект игрока.

Зачем тебе количество? Спрашиваю потому, что возможно это и не требуется, и можно сделать иначе.

Цитата:

Сообщение от Владимир (Сообщение 304273)
2. OnCollisionExit2D срабатывает при любом выходе из коллизии даже в случае множественных коллизий(т.е. если из нескольких действующих коллизий одна прервалась)?

Срабатывает для каждого объекта, который ранее был в состоянии коллизии.

Владимир 29.02.2016 07:54

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

Сообщение от Nex (Сообщение 304274)
1. Можно создать список для проверяемых объектов. При событии OnCollisionEnter2D добавлять в этот список объект с которым столкнулись. При событии OnCollisionExit2D удалять объект с которым было столкновение из списка. И где нибудь в Update обрабатывать этот список с объектами.
Но тут возможно может получится так, что объект может записаться в список столкновений и тут же удалится, а функция обработки запустится после всего этого. Но можно вызывать функцию обработки прям из события OnCollisionEnter2D.

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

Цитата:

Сообщение от Nex (Сообщение 304274)
2. Можно использовать Physics2D.OverlapPointAll для получения массива рядом находящихся объектов.

Спасибо за совет, мануал почитал, но не совсем понял как она работает, чуть позже ее попробую, чтобы разобраться с ее работой.

Цитата:

Сообщение от Жека (Сообщение 304326)
1. Полагаю, что при нескольких столкновениях ты получишь несколько вызовов этих функций, в каждой из которых информация об одном объекте столкновения.
2. Collision2D.contacts - это точки столкновения, т.е. части одного объекта, с которым столкнулись.

Собственно это и пронаблюдал.

Цитата:

Сообщение от Жека (Сообщение 304326)
Зачем тебе количество? Спрашиваю потому, что возможно это и не требуется, и можно сделать иначе.

Моя цель выбрать из всех объектов с которыми я столкнулся один, с минимальным значением одной из переменных экземпляра объекта, например с минимальным значением переменной hp и его уже атаковать. Если есть идеи как сделать это не через массив буду рад выслушать :)

Жека 29.02.2016 11:09

Ответ: Вопросы от новичка
 
Можно сделать функцию RefineTargetObject(GameObject obj), которая будет определять очередную цель по каким-то параметрам.
Вызываешь эту функцию в методе OnCollisionEnter2D() и передаёшь туда объект столкновения.
Можно завести переменные под те параметры, по которым ты проверяешь, например minHp.
В функции RefineTargetObject делаешь сравнение
PHP код:

if (obj.hp minHp) {
  
minHp obj.hp;
  
target obj// наша новая цель


Таким образом, при каждой коллизии мы имеем возможность переключаться на другую цель, если у неё hp меньше. В функции атаки используем эту переменную target - кого атаковать.
Начальное значение для minHp можно сделать int.MaxValue.
obj.hp - это упрощённо, на самом деле hp ты получишь из своего obj.GetComponet<...>

Владимир 29.02.2016 12:06

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

Сообщение от Жека (Сообщение 304332)
Можно сделать функцию RefineTargetObject(GameObject obj), которая будет определять очередную цель по каким-то параметрам.
Вызываешь эту функцию в методе OnCollisionEnter2D() и передаёшь туда объект столкновения.

Тоже хороший вариант и действительно простой, спасибо! Но так же придется делать проверку на наличие коллизии при обработке этой коллизии. В общем буду думать и пробовать :)

Жека 29.02.2016 14:38

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

Сообщение от Владимир (Сообщение 304338)
Но так же придется делать проверку на наличие коллизии при обработке этой коллизии.

О чём это ты?

Владимир 29.02.2016 17:06

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

Сообщение от Жека (Сообщение 304348)
О чём это ты?

О том, что урон я планирую наносить раз в секунду, за это время между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен. Вообще еще подумаю над реализацией переопределения target в случае если предыдущий target вышел из коллизии. Может все таки будет проще это сделать с массивом, поскольку в нем будут все коллизии и ими будет можно свободно оперировать.

Nex 01.03.2016 05:46

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

Сообщение от Владимир (Сообщение 304350)
О том, что урон я планирую наносить раз в секунду, за это время между объектами может появиться расстояние и коллизия как таковая пропадет между ними, а target у нас уже определен.

Используй список List<>. При коллизии добавляешь в список объект, а потом уже можно как угодно обрабатывать, удалять и тд.


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

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