Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.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,此脚本附加到门: 即使在编辑器中将变量doorLockState设置为true enabled true,并且门应为红色,使用断点将门设置为绿色ColorDoors内的状态变量在红色和绿色之间变化不停止状态为true之后为false,但在编辑器中始终被检查为true: using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq; using System; [E

此脚本附加到门:

即使在编辑器中将变量doorLockState设置为true enabled true,并且门应为红色,使用断点将门设置为绿色ColorDoors内的状态变量在红色和绿色之间变化不停止状态为true之后为false,但在编辑器中始终被检查为true:

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

[ExecuteAlways]
public class HoriDoorManager : MonoBehaviour
{
    public List<DoorHori> doors = new List<DoorHori>();
    public bool doorLockState;

    private void Awake()
    {
        if (transform.parent != null)
        {
            Transform parent = transform.parent;
            var children = parent.GetComponentsInChildren<Transform>();

            if (children != null)
            {
                foreach (Transform door in children)
                {
                    if (door.name == "Door_Left" || door.name == "Door_Right")
                        doors.Add(door.GetComponent<DoorHori>());
                }
            }
            ColorDoors(Color.red, Color.green, doorLockState);
        }
    }

    void OnTriggerEnter()
    {
        if (doorLockState == false)
        {
            if (doors != null)
            {
                for (int i = 0; i < doors.Count; i++)
                {
                    doors[i].OpenDoor();
                }
            }
        }
    }

    private void Update()
    {
        ColorDoors(Color.red, Color.green, doorLockState);
    }

    private void ColorDoors(Color red, Color green, bool state)
    {
        List<Transform> children = new List<Transform>();

        for (int i = 0; i < doors.Count; i++)
        {
            foreach (Transform child in doors[i].GetComponentsInChildren<Transform>())
            {
                if (child == doors[i].transform)
                    continue;

                var renderer = child.GetComponent<Renderer>();
                renderer.sharedMaterial.shader = Shader.Find("Unlit/ShieldFX");

                if (state == true)
                {
                    renderer.sharedMaterial.SetColor("_MainColor", red);
                    LockState(true);
                }
                else
                {
                    renderer.sharedMaterial.SetColor("_MainColor", green);
                    LockState(false);
                }
            }
        }
    }

    public bool GetLockState
    {
        get { return doorLockState; }
        set { doorLockState = value; }
    }

    private void LockState(bool state)
    {
        var collider = gameObject.GetComponent<BoxCollider>();

        if (state == false)
        {
            collider.size = new Vector3(2.3f, 2.736307f, 2.5f);
            collider.center = new Vector3(0, 1.378154f, 0);
            collider.transform.localPosition = new Vector3(-1.57f, 0, -2.98f);
            collider.isTrigger = true;
        }
        else
        {
            collider.size = new Vector3(2.3f, 2.736307f, 3);
            collider.center = new Vector3(0, 1.378154f, 0);
            collider.transform.localPosition = new Vector3(-1.57f, 0, -2.98f);
            collider.isTrigger = false;
        }
    }
}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
使用System.Linq;
使用制度;
[执行方式]
公共类horidoormanger:单行为
{
公共列表门=新列表();
公共场所门锁状态;
私人空间
{
如果(transform.parent!=null)
{
Transform parent=Transform.parent;
var children=parent.GetComponentsInChildren();
如果(子项!=null)
{
foreach(儿童中的转换门)
{
如果(door.name==“door_Left”| | door.name==“door_Right”)
添加(door.GetComponent());
}
}
彩色门(颜色.红色,颜色.绿色,门锁状态);
}
}
void ontriggenter()
{
如果(doorLockState==false)
{
如果(门!=null)
{
对于(int i=0;i
层次结构中的门构造函数和检查器中的脚本的屏幕截图:

对象水平门套件标记设置为“门”

这是编辑器脚本,应该让我控制门,但这里也有一个问题,因为在编辑器中它没有列出所有的门:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(DoorsLockManager))]
public class DoorsLockManagerEditor : Editor
{
    private SerializedProperty _doors;
    private SerializedProperty _globalLockState;

    private bool shouldOverwrite;

    private void OnEnable()
    {
        _doors = serializedObject.FindProperty("Doors");
        _globalLockState = serializedObject.FindProperty("_globalLockState");
    }

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

        serializedObject.Update();

        shouldOverwrite = false;

        // Begin a change check here
        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(_globalLockState);
        if (EditorGUI.EndChangeCheck())
        {
            // overwrite only once if changed
            shouldOverwrite = true;
        }

        for (int i = 0; i < _doors.arraySize; i++)
        {
            var door = _doors.GetArrayElementAtIndex(i);

            // if door == null the script itself has an error since it can't even find the SerializedProperty
            if (door == null)
            {
                EditorGUILayout.HelpBox("There was an error in the editor script!\nPlease check the log", MessageType.Error);
                Debug.LogError("Couldn't get door property", target);
                return;
            }

            if (door.objectReferenceValue == null) continue;

            var serializedDoor = new SerializedObject(door.objectReferenceValue);

            var lockState = serializedDoor.FindProperty("doorLockState");

            serializedDoor.Update();

            if (lockState == null)
            {
                EditorGUILayout.HelpBox("There was an error in the editor script!\nPlease check the log", MessageType.Error);
                Debug.LogError("Couldn't get lockState property", target);
                return;
            }

            // HERE OVERWRITE
            if (shouldOverwrite)
            {
                lockState.boolValue = _globalLockState.boolValue;
            }
            else
            {
                EditorGUILayout.PropertyField(lockState, new GUIContent("Door " + i + " Lockstate"));
            }

            serializedDoor.ApplyModifiedProperties();
        }

        serializedObject.ApplyModifiedProperties();
    }
}
使用UnityEditor;
使用UnityEngine;
[CustomEditor(typeof(DoorsLockManager))]
公共类DoorsLockManagerEditor:编辑器
{
私有财产门;
私有财产(globalLockState);;
私有布尔应该覆盖;
私有void OnEnable()
{
_doors=serializedObject.FindProperty(“doors”);
_globalLockState=serializedObject.FindProperty(“_globalLockState”);
}
公共覆盖无效OnInspectorGUI()
{
base.OnInspectorGUI();
serializedObject.Update();
shouldOverwrite=false;
//在这里开始兑换支票
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(_globalLockState);
if(EditorGUI.EndChangeCheck())
{
//如果更改,则仅覆盖一次
shouldOverwrite=true;
}
对于(int i=0;i<\u doors.arraySize;i++)
{
var door=\u doors.GetArrayElementIndex(i);
//如果door==null,脚本本身就有一个错误,因为它甚至找不到SerializedProperty
如果(门==null)
{
EditorGUILayout.HelpBox(“编辑器脚本中有错误!\n请检查日志”,MessageType.error);
LogError(“无法获取门属性”,目标);
返回;
}
如果(door.objectReferenceValue==null)继续;
var serializedDoor=新SerializedObject(door.objectReferenceValue);
var lockState=serializedDoor.FindProperty(“doorLockState”);
序列化ddoor.Update();
if(lockState==null)
{
EditorGUILayout.HelpBox(“编辑器脚本中有错误!\n请检查日志”,MessageType.error);
LogError(“无法获取lockState属性”,目标);
返回;
}
//这里覆盖
如果(应该覆盖)
{
lockState.boolValue=_globalLockState.boolValue;
}
其他的
{
EditorGUILayout.PropertyField(lockState,新GUIContent(“门”+i+“锁状态”));
}
serializedDoor.ApplyModifiedProperties();
}
serializedObject.ApplyModifiedProperties();
}
}
编辑器脚本检查器的屏幕截图:

using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; 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; } } } private void Awake() { 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()
{
    UpdateDoors();
}

public void UpdateDoors()
{
    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>();
    }
}
if (GUILayout.Button("Update Door List"))
{
    ((DoorsLockManager)target).UpdateDoors();
}
public bool GetLockState
{
    get { return doorLockState; }
    set
    {
        doorLockState = value;
        ColorDoors(Color.red, Color.green, doorLockState);
    }
}
    if (GUILayout.Button("Update Door Colors"))
    {
        ((DoorsLockManager)target).UpdateColors();
    }