Почему цвет дверей всегда красный, даже если двери не заперты? - PullRequest
0 голосов
/ 11 марта 2019

Этот скрипт и второй оба прикреплены к одному и тому же пустому GameObject:

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

public class DoorsLockManager : MonoBehaviour
{
    public bool lockDoors = false;
    public DoorsManager doorsmanager;

    private Renderer rend;
    private Shader unlitcolor;
    private List<GameObject> DoorShieldFXLocked = new List<GameObject>();

    private void Start()
    {
        for (int i = 0; i < doorsmanager._doors.Count; i++)
        {
            if (lockDoors == true)
            {
                doorsmanager.LockDoor(i);
                ChangeColors(Color.red, Color.green, true);
            }
            else
            {
                doorsmanager.UnlockDoor(i);
                ChangeColors(Color.red, Color.green, false);
            }
        }

        DoorShieldFXLocked = GameObject.FindGameObjectsWithTag("DoorShield").ToList();
    }

    private void Update()
    {

    }

    private void ChangeMaterialSettings()
    {
        unlitcolor = Shader.Find("Unlit/ShieldFX");
        rend.material.shader = unlitcolor;
        //rend.material.SetFloat("_Metallic", 1);
    }

    private void ChangeColors(Color32 lockedColor, Color32 unlockedColor,bool lockState)
    {
        for (int i = 0; i < DoorShieldFXLocked.Count; i++)
        {
            rend = DoorShieldFXLocked[i].GetComponent<Renderer>();
            ChangeMaterialSettings();
            if (lockState == true)
            {
                rend.material.color = lockedColor;
            }
            else
            {
                rend.material.color = unlockedColor;
            }
        }
    }
}

Изменяет состояние блокировки разблокировки / блокировки дверей в соответствии с состоянием переменной lockDoors в меню «Пуск». Но это никогда не меняет цвета дверей.

Когда он разблокирован, он должен быть зеленым и заблокирован красным. Но он все время красный.

Это пример скриншота одной из дверей:

enter image description here

Вместо того, чтобы распространяться по сценариям, я переместил оба главных сценария в один:

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

public class DoorsLockManager : MonoBehaviour
{
    public bool lockDoors = false;

    private Renderer rend;
    private Shader unlitcolor;
    private List<GameObject> DoorShieldFXLocked = new List<GameObject>();
    private List<HoriDoorManager> _doors = new List<HoriDoorManager>();

    private void Start()
    {
        DoorShieldFXLocked = GameObject.FindGameObjectsWithTag("DoorShield").ToList();

        var doors = GameObject.FindGameObjectsWithTag("Door");
        foreach (var door in doors)
        {
            _doors.Add(door.GetComponent<HoriDoorManager>());
        }

        for (int i = 0; i < _doors.Count; i++)
        {
            if (lockDoors == true)
            {
                LockDoor(i);
                ChangeColors(Color.red, Color.green);
            }
            else
            {
                UnlockDoor(i);
                ChangeColors(Color.red, Color.green);
            }
        }
    }

    private void Update()
    {

    }

    private void ChangeMaterialSettings()
    {
        unlitcolor = Shader.Find("Unlit/ShieldFX");
        rend.material.shader = unlitcolor;
        //rend.material.SetFloat("_Metallic", 1);
    }

    private void ChangeColors(Color32 lockedColor, Color32 unlockedColor)
    {
        for (int i = 0; i < DoorShieldFXLocked.Count; i++)
        {
            rend = DoorShieldFXLocked[i].GetComponent<Renderer>();
            ChangeMaterialSettings();
            if (lockDoors == true)
            {
                rend.material.color = lockedColor;
            }
            else
            {
                rend.material.color = unlockedColor;
            }
        }
    }

    public void LockDoor(int doorIndex)
    {
        _doors[doorIndex].ChangeLockState(true);
    }
    public void UnlockDoor(int doorIndex)
    {
        _doors[doorIndex].ChangeLockState(false);
    }
}

И скрипт, который прикреплен к каждой двери, не изменился:

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

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

    private void Start()
    {
        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>());
                }
            }
        }
    }

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

    public void ChangeLockState(bool lockState)
    {
        doorLockState = lockState;
    }
}

Но это все еще не меняет цвета дверей.

1 Ответ

0 голосов
/ 11 марта 2019

Этот код работает:

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

public class DoorsLockManager : MonoBehaviour
{
    public bool lockDoors = false;

    private Renderer rend;
    private Shader unlitcolor;
    private List<GameObject> DoorShieldFXLocked = new List<GameObject>();
    private List<HoriDoorManager> _doors = new List<HoriDoorManager>();

    private void Start()
    {
        DoorShieldFXLocked = GameObject.FindGameObjectsWithTag("DoorShield").ToList();
        unlitcolor = Shader.Find("Unlit/ShieldFX");

        var doors = GameObject.FindGameObjectsWithTag("Door");
        foreach (var door in doors)
        {
            _doors.Add(door.GetComponent<HoriDoorManager>());
        }

        ChangeDoorsLockStates();
    }

    private void Update()
    {
        ChangeDoorsLockStates();
    }

    private void ChangeDoorsLockStates()
    {
        for (int i = 0; i < DoorShieldFXLocked.Count; i++)
        {
            if (lockDoors == true)
            {
                ChangeColors(Color.red, Color.green, i);
            }
            else
            {
                ChangeColors(Color.red, Color.green, i);
            }
        }

        for (int x = 0; x < _doors.Count; x++)
        {
            if (lockDoors == true)
            {
                LockDoor(x);
            }
            else
            {
                UnlockDoor(x);
            }
        }
    }

    private void ChangeColors(Color32 lockedColor, Color32 unlockedColor, int index)
    {
        var renderer = DoorShieldFXLocked[index].GetComponent<Renderer>();
        renderer.material.shader = Shader.Find("Unlit/ShieldFX");

        if (lockDoors == true)
        {
            renderer.material.SetColor("_MainColor", lockedColor);
        }
        else
        {
            renderer.material.SetColor("_MainColor", unlockedColor);
        }
    }

    public void LockDoor(int doorIndex)
    {
        _doors[doorIndex].ChangeLockState(true);
    }
    public void UnlockDoor(int doorIndex)
    {
        _doors[doorIndex].ChangeLockState(false);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...