Най-очевидният начин да направите това е да използвате готови конструкции и слоеве или тагове. Можете да добавите етикет към вашата сглобяема конструкция (да речем „Избираем“) или да преместите сглобяемата конструкция в някакъв „Избираем“ слой и след това да напишете кода си около това, като знаете, че всички избираеми елементи са на този слой/имат този етикет.
Друг начин да направите това (и според мен е и по-добър начин) е внедряването на вашия персонализиран компонент „Избираем“. Бихте потърсили този компонент върху щракнат елемент и след това извършите избора, ако сте намерили този компонент. Този начин е по-добър, защото можете да добавите някаква допълнителна логика за избор в този компонент, която иначе би се намирала във вашия главен скрипт за избор (изображение на размера на вашия скрипт, след като сте добавили няколко избираеми).
Можете да го направите, като внедрите скрипт SelectableItem (името е произволно) и няколко негови производни:
public class SelectableItem : MonoBehavior {
public virtual void OnSelected() {
renderer.material.color = red;
}
}
public class SpecificSelectable : SelectableItem {
public override void OnSelected() {
//You can do whatever you want in here
renderer.material.color = green;
}
}
//Adding new selectables is easy and doesn't require adding more code to your master script.
public class AnotherSpecificSelectable : SelectableItem {
public override void OnSelected() {
renderer.material.color = yellow;
}
}
И във вашия главен скрипт:
// Somewhere in your master selection script
// These values are arbitrary and this whole mask thing is optional, but would improve your performance when you click around a lot.
var selectablesLayer = 8;
var selectablesMask = 1 << selectablesLayer;
//Use layers and layer masks to only raycast agains selectable objects.
//And avoid unnecessary GetComponent() calls.
if (Physics.Raycast(ray, out hit, 1000.0f, selectablesMask))
{
var selectable = hit.collider.gameObject.GetComponent<SelectableItem>();
if (selectable) {
// This one would turn item red or green or yellow depending on which type of SelectableItem this is (which is controlled by which component this GameObject has)
// This is called polymorphic dispatch and is one of the reasons we love Object Oriented design so much.
selectable.OnSelected();
}
}
Така че кажете, че имате няколко различни избираеми и искате те да правят различни неща при избора. Това е начинът, по който бихте направили това. Някои от вашите избираеми ще имат един от компонентите за избор, а други ще имат друг. Логиката, която извършва селекцията, се намира в главния скрипт, докато действията, които трябва да бъдат извършени, са в онези специфични скриптове, които са прикачени към обекти на играта.
Можете да отидете по-далеч и да добавите действие OnUnselect() в тези избираеми:
public class SelectableItem : MonoBehaviour {
public virtual void OnSelected() {
renderer.material.color = red;
}
public virtual void OnUnselected() {
renderer.material.color = white;
}
}
и след това дори направете нещо подобно:
//In your master script:
private SelectableItem currentSelection;
var selectable = hit.collider.gameObject.GetComponent<SelectableItem>();
if (selectable) {
if (currentSelection) currentSelection.OnUnselected();
selectable.OnSelected();
CurrentSelection = selectable;
}
И току-що добавихме логика за деселекция.
ОТКАЗ ОТ ОТГОВОРНОСТ: Това са само куп откъси. Ако просто ги копирате и поставите, те вероятно няма да работят веднага.
person
MarengoHue
schedule
08.02.2016