此脚本附加到一个空的游戏对象上,并控制场景中的所有门:
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个门解锁。
在运行游戏之前控制特定门的最佳方法是什么?
以后的主要目标是制作游戏门或什至我所有空间站的可视化地图,并能够通过地图控制物体。
动态地图。
答案 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
拉到经理类,以避免每次都查找它。