Част 5 — Взаимодействие с играч

Това е статия 5 в нашата серия от много части за разработване на персонализиран шейдър за Unity 3D. В тази статия ще добавим информация от играча към нашия JellyClickReceiver, така че потребителите да могат да взаимодействат директно с шейдъра от сцената.

Нека започнем да добавяме интерактивност към нашата сфера. Добавете следните редове в средата на вашата функция за актуализиране.

Вашата функция за актуализиране сега трябва да изглежда така.

Всичко, което този допълнителен код прави, е да нулира нашия controlTime на 0 всеки път, когато се щракне върху основния бутон на мишката, нулирайки анимацията на нашата вълна. Така че можем да се наслаждаваме на нашата малка вълнова анимация отново и отново и отново. Но мисля, че можем да се справим по-добре. Нека направим така, че нашата анимация да се нулира само ако щракнем върху сферата.

Първо изберете игровия обект за вашия модел, който съдържа нашите MeshRender и JellyClickReceiver, след което щракнете върху „Добавяне на компонент“. От изскачащото меню за добавяне на компонент намерете SphereCollider и го изберете.

Това трябва да добави сферичен колайдер, който доста точно пасва на нашия модел. (Ако приемем, че използвате примерния модел на сфера. Ако не, опитайте да поставите колайдера възможно най-близо до модела. Чувствайте се свободни да използвате колайдер, различен от сфера, ако би паснал по-добре на вашия модел.)

Сега трябва да добавим още код към JellyClickReceiver.cs. Първо дефинирайте още две частни променливи от типове RaycastHit и Ray.

Точно сега ние нулираме нашия controlTime на нула веднага след щракване на бутона на мишката. За тази следваща стъпка, когато се щракне върху бутона на мишката, лъч ще бъде хвърлен от мястото на щракване в нашата сцена и ако удари нещо, нулираме controlTime на нула. Нека започнем с дефинирането на този лъч. Добавете следния ред в блока „if“ в нашата функция за актуализиране.

clickRay = Camera.main.ScreenPointToRay(Input.mousePosition);

ScreenPointToRay е полезна функция, вградена в камерите на Unity, която заема позиция на екранното пространство и конструира световен космически лъч, който преминава от избраната камера през предоставената позиция на екрана.

Екранно пространство срещу световно пространство

Ако искате по-задълбочено обяснение на екранното пространство срещу световното пространство, има страхотен отговор на сайта на Unity Answers тук. тук

След това трябва да хвърлим този лъч. Добавете следните редове директно след нашето clickRay задание.

Physics.Raycast хвърля невидима частица по протежение на лъча, осигурен от clickRay и ако удари някой колайдер по пътя, тя връща true и предоставя информация за сблъсъка (като с какво се е сблъскала и къде) в променливата hit. По-късно ще използваме допълнителната информация, предоставена от hit, но засега, ако уцелим нещо, нулираме нашия шейдър.

Вашата функция за актуализиране трябва да изглежда така.

Това е всичко за тази статия. В следващата част от тази серия ще се потопим по-дълбоко в нашата ос на движение на синусоида.

Част 6 от тази поредица можете да намерите тук.

Първоначално публикувано в heliosinteractive.com на 28 февруари 2018 г.