Самый очевидный способ сделать это — использовать префабы и слои или теги. Вы можете добавить тег к своему префабу (скажем, «Выбираемый») или переместить префаб на какой-нибудь «Выбираемый» слой, а затем написать свой код вокруг этого, зная, что все выбираемые элементы находятся на этом слое/имеют этот тег.
Другой способ сделать это (и, на мой взгляд, также лучший способ) - реализовать ваш собственный компонент «Выбираемый». Вы будете искать этот компонент в выбранном элементе, а затем выполнять выбор, если вы нашли этот компонент. Этот способ лучше, потому что вы можете добавить дополнительную логику выбора в этот компонент, который в противном случае находился бы в вашем основном сценарии выбора (изобразите размер вашего сценария после того, как вы добавили пару выбираемых).
Вы можете сделать это, реализовав скрипт 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() в эти Selectables:
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