2016-11-29 2 views
1

У меня есть сценарий 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"); 

     } 

    }  

} 
+3

Предположительно, проблема, с которой вы сталкиваетесь, заключается в том, что 'GetComponent () .enabled = false;' перестает взаимодействовать с компонентом вообще, в результате вам может потребоваться включить его, изменить слой и затем выключить его, вместо этого сделать переключатель уровня перед его переключением off –

+0

Даже когда я удалил это 'GetComponent () .enabled = false;' (так что я могу разместить стены, даже если переключатель отключен), слой меняется только для новых объектов. Я имею в виду, например, я помещаю wall1 с включенным ON - это слой «Ignore Raycast», затем я переключаю переключатель в положение «OFF», «place wall2» - это слой «По умолчанию», но слой wall1 не изменяется – artur47wien

+2

Я didn «Я понимаю, что вы имели в виду стены, расположенные раньше, это совсем другая проблема. Более новые стены находятся в слое по умолчанию после его изменения - и это связано с тем, что изменение предваряния изменяет то, что размещается при создании стены, а не то, что уже есть. Чтобы изменить слой всех стен, вы можете сделать что-то подобное (при условии, что стены имеют метку 'wall'):' GameObject [] wall = GameObject.FindGameObjectsWithTag ("wall"); 'тогда вы можете манипулировать ими через foreach loop –

ответ

2

Более новые стены, если они размещены, находятся в слое Default после того, как он был изменен в сборном файле, - и это связано с тем, что изменение сборного материала изменяет то, что размещается при создании стены, а не то, что уже существует. Для того, чтобы изменить уровень всех стен, вы можете сделать что-то вроде этого (предполагая, что стены имеют тег стены)

GetComponent<WallCreator>().wallPrefab.gameObject.layer = LayerMask.NameToLayer("Default"); 
GameObject[] walls = GameObject.FindGameObjectsWithTag("wall"); 
foreach(GameObject wall in walls) 
{ 
    wall.layer = LayerMask.NameToLayer("Default"); 
} 

Это будет цикл через все стены в сцене и изменить свой слой, который вы хотите. Также важно, чтобы WallCreator по-прежнему изменил свое свойство, так что стены, расположенные после, это изменение останется на новом слое, а не на старом.

1

Это выглядит так, будто вы не ссылки на геймобжекты в wallPrefab, что может быть проблема. Изменение:

GetComponent<WallCreator>().wallPrefab.layer = LayerMask.NameToLayer("Ignore Raycast"); 

To:

GetComponent<WallCreator>().wallPrefab.gameObject.layer = LayerMask.NameToLayer("Ignore Raycast"); 

Не видя других сценариев, я не могу быть уверен, что это решит проблему, хотя.

+1

Прочтите эту часть своего комментария - «* Я помещаю wall1 с включенным ON - это слой «Игнорировать Raycast», затем переключить переключатель в положение «OFF», поместить wall2 - слой «Default», но слой wall1 не меняется *, слой ** IS ** меняется, но на самом деле они хотят, чтобы старые стены изменить слой –

+0

Gotcha, не видел этого. По-прежнему хорошей практикой является ссылка на gameObject. Я бы сказал, что ваш комментарий выше должен сделать это, найти все объекты и изменить их слой таким образом! – KenSchnetz

+1

Дополнительный бонус прохождения через них также заключается в том, что вы получаете «GameObject» из 'FindGameObjectsWithTag'! –

Смежные вопросы