У меня есть сценарий WallCreator для размещения стен в Unity, а другой - WallCreatorSwitcher, чтобы включить/выключить WallCreator, проверив переключатель. Я также хотел изменить слой wallPrefab там, используя GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("LayerName");
, поэтому, когда переключатель включен (WallCreator ON), слой «Ignore Raycast» - и он работает, и если переключатель отключен (слой WallCreator OFF) - «По умолчанию» - но проблема в том, что в этом случае он не меняет слой.Как изменить слой объекта во время выполнения в Unity?
public class WallCreatorSwitcher : MonoBehaviour {
public Toggle toggle;
public Text text;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
if (toggle.isOn)
{
GetComponent<WallCreator>().enabled = true;
Debug.Log("Wall Creator is ON");
text.enabled = true;
GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("Ignore Raycast");
}
else
{
GetComponent<WallCreator>().enabled = false;
Debug.Log("Wall Creator is OFF");
text.enabled = false;
GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("Default");
}
}
}
Предположительно, проблема, с которой вы сталкиваетесь, заключается в том, что 'GetComponent() .enabled = false;' перестает взаимодействовать с компонентом вообще, в результате вам может потребоваться включить его, изменить слой и затем выключить его, вместо этого сделать переключатель уровня перед его переключением off –
Даже когда я удалил это 'GetComponent() .enabled = false;' (так что я могу разместить стены, даже если переключатель отключен), слой меняется только для новых объектов. Я имею в виду, например, я помещаю wall1 с включенным ON - это слой «Ignore Raycast», затем я переключаю переключатель в положение «OFF», «place wall2» - это слой «По умолчанию», но слой wall1 не изменяется –
artur47wien
Я didn «Я понимаю, что вы имели в виду стены, расположенные раньше, это совсем другая проблема. Более новые стены находятся в слое по умолчанию после его изменения - и это связано с тем, что изменение предваряния изменяет то, что размещается при создании стены, а не то, что уже есть. Чтобы изменить слой всех стен, вы можете сделать что-то подобное (при условии, что стены имеют метку 'wall'):' GameObject [] wall = GameObject.FindGameObjectsWithTag ("wall"); 'тогда вы можете манипулировать ими через foreach loop –