Я хочу взаимодействовать с игровыми объектами в Unity.Этими объектами могут быть ключи, двери, сундуки, ...
Допустим, на столе есть ключ.Когда игрок подходит ближе, он должен быть выделен шейдером, и появляется текст «Поднять ключ».
Я создал интерфейс для интерактивных игровых объектов.
public interface IInteractable
{
string InteractabilityInfo { get; }
void ShowInteractability();
void Interact();
}
Делая это, я могудобавить компонент интерфейса в мой Key
скрипт
public class Key : MonoBehaviour, IInteractable
{
public string InteractabilityInfo { get { return "some text here"; } }
public void ShowInteractability()
{
// Outline Shader maybe?
}
public void Interact()
{
// Do something with the key
}
}
Когда дело доходит до скрипта, который проверяет, является ли что-то взаимодействующим, я создал скрипт, который создает raycast, который проверяет наличие интерактивности.(Я прикрепляю этот скрипт к моей камере FPS)
public class InteractabilityCheck : MonoBehaviour
{
private const int RANGE = 3;
private void Update()
{
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, RANGE))
{
IInteractable interactable = hit.collider.GetComponent<IInteractable>();
if (interactable != null)
{
interactable.ShowInteractability();
if (Input.GetKeyDown(KeyCode.E))
{
interactable.Interact();
}
}
}
}
}
Этот скрипт пытается получить компонент интерфейса и вызывает из него методы, если он не нулевой.
Этот код работает нормально, но чтоМне не нравится, что Raycast запускает по одному на кадр.Есть ли другой способ достижения интерактивности?