如何控制特定的门并锁定/解锁门,而不是对所有门使用全局一个脚本?

时间:2019-02-19 15:49:34

标签: c# unity3d

此脚本附加到一个空的游戏对象上,并控制场景中的所有门:

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 :(得分:2)

我的方法是创建一个管理器类,该类缓存对所有门的引用,然后公开lock和unlock方法并处理调用底层门对象的方法。 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拉到经理类,以避免每次都查找它。