Я использую Unity для создания 2D-игры сверху вниз. Пока все было замечательно, но я столкнулся с проблемой, которую не могу решить должным образом.
Я хочу реализовать «высокие травы», где часть персонажа будет закрыта.
Наглядный пример:
Я думал о том, чтобы сделать высокую траву по слоям, но это создаст МНОЖЕСТВО игровых объектов, и переход по мере продвижения персонажа не будет достаточно плавным.
Есть идеи о том, как я могу подойти к этому? Я подумал, что, возможно, используя шейдеры, я смог бы достичь чего-то подобного, но мои знания о шейдерах очень и очень ограничены, поэтому я даже не знаю, возможно ли такое.
Ответы:
Я согласен с @Christian (хотя я бы не назвал это хаком). Определите условие, когда объект должен выглядеть по-другому, а затем просто нарисуйте его по-другому. Каждая вещь в игре не должна быть «моделью» того, как она работает в «природе». Эту ошибку я совершал много раз, и поэтому она стала для меня чем-то вроде мантры. Спросите себя: что бы вы получили, если бы куст «окутывал» игрока «реалистично», а не просто рисовал его так, как он должен выглядеть? Я поставил это в кавычки, потому что, пытаясь представить, как это будет выглядеть, я думаю, что многослойный подход окклюзии может на самом деле выглядеть хуже.
Если вы обеспокоены подходом @ Christian к управлению «потенциально неограниченным» списком мелочей, которые вы должны проверять в каждом кадре, это еще одна ошибка, которую я совершал много раз. Я бы порекомендовал вам «просто пойти с этим» сейчас и периодически проверять, сколько времени на самом деле получил список - и действительно ли это стало проблемой . Произойдет одно из двух. Либо это не стало проблемой, в таком случае - почему вы пытаетесь ее решить? Или это так, и вам нужно разработать (минимальное) решение для его решения. Не пытайтесь решить это, моделируя это.
источник
Я наконец нашел удовлетворительное решение! @Thebluefish комментарий указал мне правильное направление с масками.
Идея состоит в том, чтобы использовать шейдер, который рисует персонажа в два прохода:
Это делается даже тогда, когда Chatacter не находится внутри кустов. Таким образом, мне не нужно обнаруживать столкновения с кустами, а также это делает переход внутри куста плавным в предельных случаях, таких как этот:
Половина персонажа, находящегося за пределами куста, отображается в первом проходе. Другая половина будет полностью закрыта кустом.
Во втором проходе замаскированный персонаж будет визуализирован снова. Часть за пределами куста останется прежней, но часть внутри куста будет отображаться сверху с маской на вершине куста, благодаря чему она будет выглядеть как внутри куста.
источник
Вы можете обнаружить, находится ли персонаж в траве. Затем нарисуйте только верхнюю половину персонажа.
источник