Как определить, находятся ли в контакте 3 или более объектов одновременно (связаны четвертым объектом) [C# Unity] - PullRequest
0 голосов
/ 22 февраля 2020

Как я могу определить, находятся ли в контакте 3 или более объектов одновременно?

Вот что я пытаюсь сделать:

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

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

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

Это то, что я пробовал:

Использование OnTriggerEnter2D и серии запросов bool

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

Использование Linecast для добавления объектов в массив

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

Кроме того, не уверен, что наиболее эффективным способом добавления их в массив для проверки будет, или даже если это будет лучший способ проверки контакта.

Ниже приведены некоторые скриншоты того, что я пытаюсь сделать:

Объекты расположены отдельно:

Stones are not touching, no win state

Теперь Череп касается глаза и луны, условие победы выполнено:

win condition met as required stones are in contact

Если глаз и луна находятся дальше друг от друга, игрок может использовать огонь для расширения контакта:

Fire used to connect eye, skull and moon

Several fires used to connect eye, skull and moon

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 23 февраля 2020

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

Если это так, и ваша игра основана на сетке с целыми числами (целыми числами), этот подход, вероятно, поможет вы много в будущем; так как это очень просто, просто и очень дешево.

0 голосов
/ 23 февраля 2020

В каждой сцене мне нравится иметь объект «обработчик» со сценарием обработчика, который постоянно отслеживает важные объекты, которые имеют сценарий «объект», обычно в обработчике выполняется условие win ... в этом сценарии я бы постоянно проверять параметр 'activated' этих объектов, найденных в сцене, с помощью сценария 'object' ... Этот сценарий объекта внутри каждого объекта будет индивидуально контролировать их параметр 'activated'. Проверка в каждом столкновении, является ли сталкивающийся объект «активированным состоянием» или если это череп ... если это так ... Затем измените свою собственную переменную или тег на то, что отслеживает сценарий обработчика ... Когда все объекты в список находится в активированном состоянии, в котором вы выиграли ...

Handler.cs: игра запускается ... Ищет объекты, для которых есть сценарий "Object.cs", и сохраняет их в списке типов сценариев. В al oop обработчик проверяет переменную 'activated' из скрипта каждого объекта, сохраненного в списке найденных объектов .... Если они все активированы или имеют значение true ... Вы выиграли! И вам просто нужно перетащить prebafs, которые имеют скрипт Object.cs.

Object.cs:

Здесь проверяется наличие коллизий, когда вы сталкиваетесь с чем-то, проверяете, есть ли у чего-то сценарий «Object.cs», и проверяете их переменную «activated», если она активирована ... Можно изменить свою собственную переменную на «активирован» или «истина», или как угодно, чтобы проверить это в скрипте-обработчике ... В вашем примере все камни нуждаются в одном и том же условии, что объект, с которым они сталкиваются, находится в активированном состоянии и что череп - это первое, что находится в активированном состоянии, когда начинается игра ... Если мы хотим добавить много разных объектов с множеством разных действий ... Мы могли бы просто добавить инструкцию case, которая сравнивает каждое различие по отдельности, чтобы изменить их активированный параметр. Вот пример концепции:

public bool activated;
public string type:
//add extra variables

Start() {
//if my type is = 'skull' then change my activated state to 'truel'... else make it false
//make extra variables false hasFire etc
} 
OnTriggeEnter2D() {
Switch(type) {
case  "fire" :
//check if the thing we collided with has a object script and if the activated variable is true... Ifso then make own variable true and If the objwct touches thw skull everything works fine since thw skull variable has been set in the start method
break;
case  "totem" :
//Same as fire... It just needs to be next to something activated... fire or skull
break;
case  "skullOnlyTotem" :
//thia collision will check if the tag of the objevt we collided is the skull tag... If so the totem is activated, activated fire doesn't work with this tototem because we are not checking the activated parameter only for the skull tag
break;
case  "waterTotem" :
//here we can have a condition that needs only a colission with a object that has a water tag and nothing more 
break;
case "obsidianTotem" :
//here we can have a totem that needs fire and water to be activated since we need two conditions we will add to extra variables to the script, the hasFire bool and the hasWater bool. These will be set to false on start and here we will check their state... First if what we collided is in the activated state then we are next to a fire... if so.. Set hasfire =true then check if that thing we collided has tag =water... If so hasWater = true ; finally
Compare if two conditions are true if so... Set the activated variable to true
break;
case "aLotOfConditions" :
//for ten conditions you will need 10 new variables and set them all to false at start and in each collision check the tag belong to any of its clnditions if so turn variable true... At last check if all true if so... Activate... 
break;
} 
} 

Здесь мы можем значительно расширить функциональность, просто добавив больше в оператор case и изменив имена тегов ... Создание префабов с различным изображением и именем типа .. Затем просто поместите их в сцену .... Два сценария ...

Обработчик -> находит объекты и проверяет активированную переменную

Объект -> активировал переменную и проверяет коллизии с регистром для каждого типа, используя сочетание тегов и активированной переменной

0 голосов
/ 22 февраля 2020

Мне кажется, я решил, что изменил теги во время выполнения.

Таким образом, у огня теперь есть скрипт, который меняет свой собственный тег с огня на активированный огонь, если он касается черепа или другого активированного огня, то есть с помощью OnTriggerStay2D, а затем тотем проверяет, активирован ли огонь или череп касается этого.

Работает!

Кроме того, если ActivatedFire перестает касаться черепа, он снова становится огнем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...