#c# #unity3d
#c# #unity-игровой движок
Вопрос:
Первый скрипт и второй оба прикреплены к дверям. В этом случае у меня 12 дверей. Независимо от того, какая первая дверь из 12, игрок-контролер или NPC войдут в дверь, она откроется, но останется открытой. Следующая дверь, в которую войдет игрок-контролер или NPC, откроется, а затем также будет закрыта, а затем все двери.
Но каждый раз первая дверь никогда не закрывается. При каждом запуске игры она работает только со второй двери.
В этом скрипте HoriDoorManager я использую общедоступный статический флаг exitedDoor и устанавливаю для него значение true внутри OnTriggerExit:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class HoriDoorManager : MonoBehaviour
{
public static bool exitedDoor = false;
private bool doorLockState;
private List<DoorHori> doors = new List<DoorHori>();
private void Start()
{
if (transform.parent != null)
{
Transform parent = transform.parent;
var children = parent.GetComponentsInChildren<Transform>();
if(children != null)
{
foreach (Transform door in children)
{
if (door.name == "Door_Left" || door.name == "Door_Right")
doors.Add(door.GetComponent<DoorHori>());
}
}
}
}
void OnTriggerEnter()
{
if (doorLockState == false)
{
if (doors != null)
{
for(int i =0; i < doors.Count; i )
{
doors[i].OpenDoor();
}
}
}
}
private void OnTriggerExit(Collider collide)
{
if (doorLockState == false)
{
exitedDoor = true;
}
}
public void ChangeLockState(bool lockState)
{
doorLockState = lockState;
}
}
Во втором скрипте я проверяю, имеет ли значение true флаг exitedDoor, а затем начинаю закрывать дверь: внутри метода WaitToClose:
using UnityEngine;
using System.Collections;
public class DoorHori : MonoBehaviour
{
public float translateValue;
public float easeTime;
public OTween.EaseType ease;
public float waitTime;
private Vector3 StartlocalPos;
private Vector3 endlocalPos;
private void Start()
{
StartlocalPos = transform.localPosition;
gameObject.isStatic = false;
}
public void OpenDoor()
{
OTween.ValueTo(gameObject, ease, 0.0f, -translateValue, easeTime, 0.0f, "StartOpen", "UpdateOpenDoor", "EndOpen");
GetComponent<AudioSource>().Play();
}
private void UpdateOpenDoor(float f)
{
Vector3 pos = transform.TransformDirection(new Vector3(1, 0, 0));
transform.localPosition = StartlocalPos pos * f;
}
private void UpdateCloseDoor(float f)
{
Vector3 pos = transform.TransformDirection(new Vector3(-f, 0, 0));
transform.localPosition = endlocalPos - pos;
}
private void EndOpen()
{
endlocalPos = transform.localPosition;
StartCoroutine(WaitToClose());
}
private IEnumerator WaitToClose()
{
if (HoriDoorManager.exitedDoor == true)
{
yield return new WaitForSeconds(waitTime);
OTween.ValueTo(gameObject, ease, 0.0f, translateValue, easeTime, 0.0f, "StartClose", "UpdateCloseDoor", "EndClose");
GetComponent<AudioSource>().Play();
}
}
}
Ответ №1:
Попробуйте изменить OnTriggerEnter на это в вашем первом скрипте.
private void OnTriggerEnter(Collider collide){
if (doorLockState == false)
{
if (doors != null)
{
for(int i =0; i < doors.Count; i )
{
doors[i].OpenDoor();
}
}
}
}
Вы не используете определенный unity метод при удалении параметров метода, поэтому он больше не ссылается на тот же OnTriggerEnter.
Затем это также можно использовать для проверки того, что запускает флаг on enter, потому что я предполагаю, что вы не хотите, чтобы какие-либо коллизии запускали эту логику.