Как организовать применение скрипта на объект в триггере? Unity
Есть несколько однотипных объектов "Дверь". На каждом триггер, который отслеживает "зону действия" закрепленного скрипта. Скрип однообразен, но весит на всех объектах. Собственная реализация, в силу незнания, ужасно топорная... На кнопке взаимодействия 6 скриптов, проверяет триггер каждой двери на сцене. Естественно, что присуща ненужная нагрузка. Цель - реализовать подобную систему: игрок попадает на триггер, и после нажатия кнопки "Взаимодействие" - скрип применяется к объекту, в триггер которого попал игрок.
Скрипт открывания двери:
using UnityEngine;
using System.Collections;
public class OpenDoor : MonoBehaviour {
public float smooth = 2.0f;
public float DoorOpenAngle = 90.0f;
public AudioClip OpenAudio;
public AudioClip CloseAudio;
private bool AudioS;
private Vector3 defaultRot;
private Vector3 openRot;
public static bool open;
public static bool enter;
// Use this for initialization
void Start () {
defaultRot = transform.eulerAngles;
openRot = new Vector3 (defaultRot.x, defaultRot.y + DoorOpenAngle, defaultRot.z);
}
// Update is called once per frame
public void playerUse()
{
if (enter)
{
open = !open;
}
}
void Update () {
if (open) {
if (AudioS == false)
{
gameObject.GetComponent<AudioSource>().PlayOneShot(OpenAudio);
AudioS = true;
}
transform.eulerAngles = Vector3.Slerp (transform.eulerAngles, openRot, Time.deltaTime * smooth);
} else {
if (AudioS == true)
{
gameObject.GetComponent<AudioSource>().PlayOneShot(CloseAudio);
AudioS = false;
}
transform.eulerAngles = Vector3.Slerp (transform.eulerAngles, defaultRot, Time.deltaTime * smooth);
}
}
void OnTriggerEnter(Collider col)
{
if (col.tag == "Player") {
enter = true;
}
}
void OnTriggerExit(Collider col)
{
if (col.tag == "Player")
{
enter = false;
}
}
}
Ответы (1 шт):
Вам просто нужен единий интерфейс для взаимодействия с чем угодно.
public interface IInteractable {
void Action ();
}
Дверь как один из объектов взаимодействия просто его реализует. Она знать не должна, что существует какой-то там Player.
public class Door : MonoBehaviour, IInteractable {
public bool IsOpened { get; private set; }
public void Action () { // метод интерфейса взаимодействия
if (IsOpened)
Close();
else
Open();
}
public void Open () {
IsOpened = true;
}
public void Close () {
IsOpened = false;
}
}
А игрок сталкиваясь с коллайдерами таких объектов реагирует на них одинаково и совершенно не важно дверь это или тумбочка, они там сами разберутся.
public class Player : MonoBehaviour {
public IInteractable CurrentInteractionObject {
get { return _currentInteractionObject; }
private set { // изменение состояния указывает кнопке появиться и пропасть
_currentInteractionObject = value;
if (_currentInteractionObject != null)
ShowInteractionButton();
else
HideInteractionButton();
}
}
private IInteractable _currentInteractionObject;
private GameObject _interactionGameObject;
private void ShowInteractionButton () {
}
private void HideInteractionButton () {
}
private void InteractionButtonClick () {
if (CurrentInteractionObject != null) { // взаимодействие
CurrentInteractionObject.Action();
CurrentInteractionObject = null;
}
}
private void OnTriggerEnter (Collider col) {
// Вход в коллайдер интерактивного объекта
IInteractable Interaction = col.gameObject.GetComponent<IInteractable>();
if (Interaction != null) {
_interactionGameObject = col.gameObject;
CurrentInteractionObject = Interaction;
}
}
private void OnTriggerExit (Collider col) {
// Выход из коллайдер текущего интерактивного объекта
if (col.gameObject == _interactionGameObject)
CurrentInteractionObject = null;
}
}


