c# - 为什么即使门没锁,门的颜色总是红色?
问题描述
此脚本和第二个脚本都附加到同一个空 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;
}
}
}
}
它确实根据 Start 中的 lockDoors 变量状态更改门解锁/锁定的锁定状态。但它永远不会改变门的颜色。
当它解锁时,它应该是绿色并锁定为红色。但是一直都是红色的。
这是其中一扇门的屏幕截图示例:
相反,我将两个顶级脚本都移到了一个脚本中:
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;
}
}
但它仍然没有改变门的颜色。
解决方案
此代码有效:
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);
}
}
推荐阅读
- api - 从下拉选择中获取完整信息(Flutter / Dart)
- c++ - Qt Visual Studio 2015 插件编译问题
- numpy - 多特征 CNN 分类模型的 Keras 输入形状不匹配错误
- barcode - 条码的准确性
- r - 如何将 3 个子向量直接融合为 1 个
- python - 在迭代列表时执行操作
- html - 如果类型是文本,则带有 enterkeyhint 的 HTML 移动 Web 输入不关注下一个输入
- python - 如何根据python中的某些条件对负值应用日志
- r - 用协变量计算不同样本量组之间的平均差
- python - 过滤 Django 中的多对多字段未按预期工作