【问题标题】:Change a variable's accessibility during runtime在运行时更改变量的可访问性
【发布时间】:2016-09-18 16:09:43
【问题描述】:

我想知道在 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 += 
    }
}

}

【问题讨论】:

  • 你的问题很模糊,没有例子,所以我真的是在黑暗中刺,但是你看过SerializeField属性吗?
  • 我做了,但它没有解决我的问题,我可能用错了方法。我用一些代码更新了我的问题。
  • 您的意思是,如果它们当前与脚本无关,您想将它们隐藏在编辑器(检查器)中,以免不必要地更改它们?
  • 没错。如果不需要,隐藏。
  • 看看自定义编辑器来做这样的事情。这是一个实际上应该与您想要做的非常相似的示例:answers.unity3d.com/questions/417837/…

标签: c# unity3d


【解决方案1】:

检查器的操作是通过自定义编辑器脚本完成的。在那里你可以显示东西,例如根据条件。

这是一个与请求非常相似的示例(根据枚举字段显示不同的内容): http://answers.unity3d.com/questions/417837/change-inspector-variables-depending-on-enum.html

【讨论】:

    【解决方案2】:

    实现您想要实现的目标的更简单方法是创建一个抽象陷阱类,然后对不同类型的陷阱进行子类化。

    抽象陷阱类处理冲突,然后调用抽象方法Trigger。

    public abstract class Trap : MonoBehaviour {
    
        void OnTriggerEnter2D(Collider2D other)
        {
            if (other.gameObject.CompareTag("Player"))
                Trigger(other.transform);
        } 
    
        protected abstract void Trigger (Transform victim);
    }
    

    然后可以通过扩展 Trap 并覆盖 Trigger 方法轻松创建弹簧陷阱。

    public class SpringTrap : Trap {
    
        public float SpringDistance;
    
        protected override void Trigger (Transform victim) {
            victim.position += Vector3.up * SpringDistance;
        }
    }
    

    现在您不必担心根据陷阱类型隐藏不相关的属性,因为检查器中显示的唯一属性是您添加到该陷阱变体中的属性。

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多