2016-09-18 3 views
0

Я хочу знать, есть ли возможность изменить доступность переменной во время выполнения в Unity C#? Причина, по которой я хочу это, - скрыть ненужные общедоступные переменные, когда мой сценарий использует другое состояние. Я пробовал некоторые динамические переменные, но я получаю ошибки, которые невозможно найти. У меня есть springDistance, но я хочу использовать его только тогда, когда состояние trapType равно springOut. Некоторый код:Изменение доступности переменной во время выполнения

public class SpringTrap : MonoBehaviour 
{ 
private Transform objectToMove; 
// Use this for initialization 
public enum TypeOfTrap 
{ 
    springOut 
} 
[Tooltip("Set the type of trap here to use.")] 
public TypeOfTrap trapType = TypeOfTrap.springOut; 

public float springDistance; 

void Start() 
{ 
    objectToMove = transform.FindChild("ObjectsToAnimate"); 
} 
void OnTriggerEnter2D(Collider2D other) 
{ 
    if (other.gameObject.CompareTag("Player")) 
    { 
     //if the player has entered the danger zone 
     switch (trapType) 
     { 
      case TypeOfTrap.springOut: 

       break; 

     } 
    } 
} 
IEnumerator SpringOut(float springDistance) 
{ 
    float deltaDist = 0.0f; 
    while(deltaDist < springDistance) 
    { 
     objectToMove.position += 
    } 
} 

}

+2

Ваш вопрос довольно расплывчатый, без примера, поэтому я действительно делаю удар в темноте, но вы посмотрели на [SerializeField] (https://docs.unity3d.com/ScriptReference/SerializeField.html) атрибут? – TVOHM

+0

Я сделал, но это не решило мою проблему, я, возможно, использовал ее неправильно. Я обновляю свой вопрос с помощью некоторого кода. – agiro

+0

Вы хотите, чтобы вы спрятали их в редакторе (инспекторе), если они в настоящее время не актуальны для скрипта, чтобы они не менялись без необходимости? –

ответ

1

Манипуляция инспектора делается с настраиваемыми редактора сценариев. Там вы можете отображать вещи, например. основанный на условиях.

Вот пример, который делает очень похожую вещь на запрошенный (отображающих разные вещи, основанные на поле перечислений): http://answers.unity3d.com/questions/417837/change-inspector-variables-depending-on-enum.html

0

Простой способ сделать то, что вы пытаетесь достичь, это создать абстрактный ловушку, а затем подклассы различных типов ловушек.

Абстрактный класс ловушки обрабатывает столкновения, а затем вызывает абстрактный метод Trigger.

public abstract class Trap : MonoBehaviour { 

    void OnTriggerEnter2D(Collider2D other) 
    { 
     if (other.gameObject.CompareTag("Player")) 
      Trigger(other.transform); 
    } 

    protected abstract void Trigger (Transform victim); 
} 

Затем пружинная ловушка может быть легко создана путем расширения ловушки и переопределения метода триггера.

public class SpringTrap : Trap { 

    public float SpringDistance; 

    protected override void Trigger (Transform victim) { 
     victim.position += Vector3.up * SpringDistance; 
    } 
} 

Теперь вам не придется беспокоиться о скрытии нерелевантные свойства в зависимости от типа ловушки, потому что только те свойства, которые будут появляться в инспекторе те добавить к этому изменению ловушки.

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