Добавьте логическое значение, чтобы отслеживать, установлен ли выбор или нет, который начинается false
и возвращается к false
всякий раз, когда выделенный объект не определен или уничтожен.
Делать любые связанные с подсветкой вещи (т. Е. Удалять или добавлять подсветки), только когда логическое значение равно false
:
public class Highlights : MonoBehaviour {
public Material highlightMaterial;
Material originalMaterial;
GameObject lastHighlightedObject;
bool highlightSet; // new
void Start() // new
{
highlightSet = false;
}
void HighlightObject(GameObject gameObject)
{
if (lastHighlightedObject != gameObject)
{
ClearHighlighted();
originalMaterial = gameObject.GetComponent<MeshRenderer>().sharedMaterial;
gameObject.GetComponent<MeshRenderer>().sharedMaterial = highlightMaterial;
lastHighlightedObject = gameObject;
}
}
void ClearHighlighted()
{
if (lastHighlightedObject != null)
{
lastHighlightedObject.GetComponent<MeshRenderer>().sharedMaterial = originalMaterial;
lastHighlightedObject = null;
}
}
// Navigates to highlight every object on camera.
void HighlightObjectInCenterOfCam()
{
float rayDistance = 1000.0f;
// The ray from the center of the viewport.
Ray ray = Camera.main.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0f));
RaycastHit rayHit;
// Check if we hit something.
if (Physics.Raycast(ray, out rayHit, rayDistance))
{
// Get the object that was hit.
GameObject hitObject = rayHit.collider.gameObject;
HighlightObject(hitObject);
} else
{
ClearHighlighted();
}
}
void Update()
{
// unset highlight if object is null (undefined or destroyed)
if (lastHighlightedObject == null)
{
highlightSet = false;
}
if (!highlightSet)
{
HighlightObjectInCenterOfCam();
}
}
public void SetHighlight()
{
// only set highlight if there is a highlighted object
if (lastHighlightedObject != null)
highlightSet = true;
}
public void UnsetHighlight() { highlightSet = false; }
public void SetHighlightToObject(GameObject to) {
if (to != null) {
HighlightObject(to);
highlightSet = true;
} else {
ClearHighlighted();
}
}
}
В приведенном выше коде вы вызываете SetHighlight
, когданеобходимо установить выделение, и UnsetHighlight
, когда оно не будет установлено.
Если вы хотите установить выделение для конкретного игрового объекта, вы можете вызвать SetHighlightToObject
со ссылкой на игровой объект, который вы хотитеустановлен. Вы можете получить это с помощью GameObject.Find("objectname");
, где "objectname"
- это что-то, хранящееся в базе данных, например.