Я пытаюсь просто переключиться на другую камеру в течение 3 секунд, когда E нажимает, когда сосредоточен на моей двери. Пожалуйста, помощь. < /P>
код: < /p>
using System.Collections;
using UnityEngine;
public class DoorHandler1 : UnlockedDoor
{
[SerializeField] GameObject player;
[SerializeField] GameObject doorCam;
public override void OpenDoor()
{
StartCoroutine(openingDoor());
}
public override void CloseDoor()
{
//
}
private IEnumerator openingDoor()
{
player.SetActive(false);
doorCam.SetActive(true);
yield return new WaitForSeconds(3f);
player.SetActive(true);
doorCam.SetActive(false);
}
}
Функция opendoor () вызывается из другого скрипта Doorhandlerbase
DoorHandlerBase.cs:
using UnityEngine;
public class DoorHandlerBase : MonoBehaviour, DetectionHandler, DoorHandler
{
[SerializeField] bool canOpen;
[SerializeField] bool canClose;
[SerializeField] bool isOpen;
[SerializeField] KeyCode openKey = KeyCode.E;
private DoorHandler[] doorHandlers;
private bool operationInProgress = false;
void Start()
{
doorHandlers = gameObject.GetComponents();
if (doorHandlers.Length == 0)
{
Debug.LogError("DoorHandler component not found on " + name);
Debug.LogWarning("EmptyDoorHandler Added by Default.");
doorHandlers = new DoorHandler[] { new EmptyDoorHandler() };
}
}
public void DetectionStart()
{
if (!isOpen)
{
canOpen = true;
canClose = true;
}
else
{
canOpen = false;
canClose = false;
}
}
public void DetectionEnd()
{
canOpen = false;
canClose = false;
}
void Update()
{
if (!operationInProgress && Input.GetKeyDown(openKey)) {
if ((!isOpen && canOpen)||(isOpen && canClose))
{
operationInProgress = true; // Set operation in progress
if (canOpen) OpenDoor();
else if (canClose) CloseDoor();
operationInProgress = false; // Reset operation in progress after opening
}
}
}
public void OpenDoor()
{
if (canOpen)
{
isOpen = true;
foreach (DoorHandler dh in doorHandlers) dh.OpenDoor();
// Additional logic for opening the door, e.g., animations, sound effects
Debug.Log("Door opened. : " + name);
}
}
public void CloseDoor()
{
if (canClose)
{
isOpen = false;
foreach (DoorHandler dh in doorHandlers) dh.CloseDoor();
// Additional logic for closing the door, e.g., animations, sound effects
Debug.Log("Door closed. : " + name);
}
}
}
class EmptyDoorHandler : DoorHandler
{
public void OpenDoor() { }
public void CloseDoor() { }
}
< /code>
Ошибка: < /p>
StackOverflowException: The requested operation caused a stack overflow.
DoorHandler1+d__5.MoveNext () (at Assets/Scripts/Objects/Doors/Handlers/DoorHandler1.cs:24)
UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at :0)
UnityEngine.MonoBehaviour.StartCoroutineManaged2 (System.Collections.IEnumerator enumerator) (at :0)
UnityEngine.MonoBehaviour.StartCoroutine (System.Collections.IEnumerator routine) (at :0)
DoorHandler1.OpenDoor () (at Assets/Scripts/Objects/Doors/Handlers/DoorHandler1.cs:12)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
DoorHandlerBase.OpenDoor () (at Assets/Scripts/Objects/Doors/DoorHandlerBase.cs:62)
...
Подробнее здесь: https://stackoverflow.com/questions/796 ... rflowerror
Unity WaitForseconds, бросающие StackOverFlowerRor ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение