我想知道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 +=
}
}
}
答案 0 :(得分:1)
使用自定义编辑器脚本完成检查器的操作。在那里你可以显示东西,例如根据条件。
这是一个与请求非常相似的示例(根据枚举字段显示不同的内容): http://answers.unity3d.com/questions/417837/change-inspector-variables-depending-on-enum.html
答案 1 :(得分: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);
}
然后可以通过扩展陷阱和覆盖Trigger方法轻松创建弹簧陷阱。
public class SpringTrap : Trap {
public float SpringDistance;
protected override void Trigger (Transform victim) {
victim.position += Vector3.up * SpringDistance;
}
}
现在您不必担心根据陷阱类型隐藏不相关的属性,因为检查器中显示的唯一属性是您添加到陷阱变体中的属性。