Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能让门在唤醒的同时也在编辑器脚本中?_C#_Unity3d - Fatal编程技术网

C# 我怎样才能让门在唤醒的同时也在编辑器脚本中?

C# 我怎样才能让门在唤醒的同时也在编辑器脚本中?,c#,unity3d,C#,Unity3d,单声道脚本: using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; [ExecuteInEditMode] public class DoorsLockManager : MonoBehaviour { [HideInInspector] public List<HoriDoorManager> Doors = new Lis

单声道脚本:

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

[ExecuteInEditMode]
public class DoorsLockManager : MonoBehaviour
{
    [HideInInspector]
    public List<HoriDoorManager> Doors = new List<HoriDoorManager>();

    // The global state
    [SerializeField] private bool _globalLockState;

    // During runtime use a property instead
    public bool GlobalLockState
    {
        get { return _globalLockState; }
        set
        {
            _globalLockState = value;

            // apply it to all doors
            foreach (var door in Doors)
            {
                // now you would need it public again
                // or use the public property you had there
                door.doorLockState = _globalLockState;
            }
        }
    }

    public void GetDoors()
    {
        var doors = GameObject.FindGameObjectsWithTag("Door");
        Doors = new HoriDoorManager[doors.Length].ToList();

        for (int i = 0; i < doors.Length; i++)
        {
            Doors[i] = doors[i].GetComponent<HoriDoorManager>();
        }
    }

    private void Awake()
    {
        GetDoors();
    }
}
就像这样:

public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        serializedObject.Update();

        shouldOverwrite = false;

        DoorsLockManager dlm = (DoorsLockManager)target;
        dlm.GetDoors();

问题是,在OnInspectorGUI中一直调用GetDoors是否好?

重复这样做不是一个好主意,因为它非常昂贵

此外,将直接访问混合到编辑器脚本中也是不好的。这会导致标记脏和处理撤消/重做的各种问题。在Unity中关闭并重新打开项目后,此更改可能会丢失

如果您想在编辑器脚本中使用它,您应该始终通过


实际上,您不需要任何编辑器脚本

简单地使用例如

[ContextMenu(nameof(GetDoors))]
公共门
{
var doors=GameObject.FindGameObjectsWithTag(“门”);
Doors=新HORIDORMANAGER[Doors.Length].ToList();
对于(int i=0;i

现在,您只需转到组件的检查器,打开上下文菜单并点击
GetDoors

找到如何操作。但问题是,它在OnInspectorGUI中一直调用GetDoors是否好?用我所做的编辑了我的问题,效果很好,但不确定在OnInspectorGUI中调用GetDoors是否正确。
DoorsLockManager dlm = (DoorsLockManager)target;
dlm.GetDoors();
public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();

        serializedObject.Update();

        shouldOverwrite = false;

        DoorsLockManager dlm = (DoorsLockManager)target;
        dlm.GetDoors();
[ContextMenu(nameof(GetDoors))]
public void GetDoors()
{
    var doors = GameObject.FindGameObjectsWithTag("Door");
    Doors = new HoriDoorManager[doors.Length].ToList();

    for (int i = 0; i < doors.Length; i++)
    {
        Doors[i] = doors[i].GetComponent<HoriDoorManager>();
    }
}