Как я могу управлять определенной дверью / дверями и блокировать / разблокировать дверь / двери вместо общего сценария для всех дверей? - PullRequest
0 голосов
/ 19 февраля 2019

Этот скрипт прикреплен к пустому игровому объекту и контролирует все двери на сцене:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoorsLockManager : MonoBehaviour
{
    public bool locked;
    public bool lockStateRealTime = false;
    public Renderer rend;
    public HoriDoorManager doorManager;


    private Shader unlitcolor;
    private GameObject[] doorPlanes;

    private void Start()
    {
        doorPlanes = GameObject.FindGameObjectsWithTag("DoorPlane");
        ChangeColors(new Color32(255, 0, 0, 255), new Color32(0, 255, 0, 255));
    }

    private void ChangeMaterialSettings()
    {
        unlitcolor = Shader.Find("Unlit/Color");
        rend.material.shader = unlitcolor;
        rend.material.SetFloat("_Metallic", 1);
    }

    private void ChangeColors(Color32 lockedColor, Color32 unlockedColor)
    {
        for (int i = 0; i < doorPlanes.Length; i++)
        {
            rend = doorPlanes[i].GetComponent<Renderer>();
            ChangeMaterialSettings();
            if (locked)
            {
                doorManager.doorLockState = true;
                rend.material.color = lockedColor;
            }
            else
            {
                doorManager.doorLockState = false;
                rend.material.color = unlockedColor;
            }
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (lockStateRealTime)
        {
            ChangeColors(new Color32(255, 0, 0, 255), new Color32(0, 255, 0, 255));
            lockStateRealTime = false;
        }
    }
}

А это скрипт HoriDoorManager:

using UnityEngine;
using System.Collections;

public class HoriDoorManager : MonoBehaviour
{
    public DoorHori door1;
    public DoorHori door2;
    public bool doorLockState;

    void OnTriggerEnter()
    {

        if (doorLockState == false)
        {
            if (door1 != null)
            {
                door1.OpenDoor();
            }

            if (door2 != null)
            {
                door2.OpenDoor();
            }
        }
    }
}

Но теперь в моей игреМне нужно блокировать и разблокировать только определенные двери.Например, если у меня 20 дверей, при запуске игры нужно, чтобы 3 из них были разблокированы.

Каков наилучший способ управления определенными дверями перед запуском игры?

Основнаяцель позже состоит в том, чтобы сделать каким-то образом визуальную карту дверей или даже всей моей космической станции в игре и иметь возможность управлять объектами через карту.

Динамическая карта.

1 Ответ

0 голосов
/ 20 февраля 2019

Мой подход заключается в создании класса менеджера, который кэширует ссылку на все двери, а затем предоставляет методы блокировки и разблокировки и обрабатывает вызовы соответствующих объектов дверей.DoorLocksManagers следует переименовать в DoorLockManager, поскольку он обрабатывает только одну дверь (хотя я бы, вероятно, слил ее в HoriDoorManager).Примерно так:

class DoorsManager : MonoBehaviour
{
    private List<HoriDoorManager> _doors;

    private void Start()
    {
        // find all your doors and add them to the _doors collection
        // alternatively expose the collection to the UI and build it there
    }

    public void LockDoor(int doorIndex)
    {
        _doors[doorIndex].ChangeLockState(true);
    }
    public void UnlockDoor(int doorIndex)
    {
        _doors[doorIndex].ChangeLockState(false);
    }
}

Затем, прежде чем начать игру, просто вызовите LockDoor / UnlockDoor, в зависимости от ситуации, с индексом для каждой двери, на которую вы хотите повлиять.Вы могли бы рассмотреть определение их как LockDoor(params int[] indexes), а затем вы могли бы передать несколько индексов одновременно.То же самое будет верно во время игры.Вы, вероятно, также выставляете методы для итерации через кэшированные двери и получения их статуса и т. Д.

Я бы также потянул unlitcolor к классу менеджера, чтобы не искать его каждый раз.

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