Почему только со второй двери дверь закрывается?Первый остался открытым - PullRequest
0 голосов
/ 09 марта 2019

Первый скрипт и второй оба прикреплены к дверям. В этом случае у меня 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;
    }
}

Во втором скрипте я проверяю, установлен ли флаг exitedDoor на true, а затем начинаю закрывать дверь: внутри метода 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 Ответ

1 голос
/ 09 марта 2019

Попробуйте изменить OnTriggerEnter на это в вашем первом скрипте.

private void OnTriggerEnter(Collider collide){
    if (doorLockState == false)
    {
        if (doors != null)
        {
           for(int i =0; i < doors.Count; i++)
            {
                doors[i].OpenDoor();
            }
        }
    }
}

При удалении параметров метода вы не используете метод, заданный единицей, поэтому он больше не ссылается на тот же OnTriggerEnter.

Затем его также можно использовать для проверки того, что вызывает флаг ввода, поскольку я предполагаю, что вы не хотите, чтобы какие-либо коллизии вызывали эту логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...