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>();
}
}