在Unity检查器的界面上显示变量herited

时间:2015-08-02 19:44:42

标签: c# unity3d interface

我想在Unity中创建一些游戏,我开始创建一个类层次结构,以便能够使用多态。所以我用方法和变量创建了一些接口。

正如the button_labels set of WP_Customize_Media_Control()中所述,我已经使用像这样的变量创建了我的界面

$output = exec("C:\Python27\python.exe example.py \"$var1\"");

现在,我正在课堂上实现我的界面:

from gi.repository import Gst
import time
import os

os.environ["GST_DEBUG"] = "3"
Gst.init()
pipeline = Gst.Pipeline.new()

def gen_cb(a, b, *c):
    print "gen_cb", a, b, c
    return Gst.PadProbeReturn.OK

# creating elements
vs = Gst.ElementFactory.make('videotestsrc')
vs.set_property('pattern', 18)
vs.set_property('is-live', 1)
pipeline.add(vs)

vc = Gst.ElementFactory.make('videoconvert')
pipeline.add(vc)

av = Gst.ElementFactory.make('autovideosink')
pipeline.add(av)

quark = Gst.ElementFactory.make('quarktv')
pipeline.add(quark)

radioactv = Gst.ElementFactory.make('radioactv')

q1 = Gst.ElementFactory.make('queue')
pipeline.add(q1)

# linking
vs.link(q1)
q1.link(quark)
quark.link(vc)
vc.link(av)

# starting
pipeline.set_state(Gst.State.PLAYING)

# sleep some time
time.sleep(2)

# modify
probe_id = q1.pads[1].add_probe(Gst.PadProbeType.BLOCK_DOWNSTREAM, gen_cb)
quark.unlink(q1)
pipeline.remove(quark)
quark.set_state(Gst.State.NULL)
pipeline.add(radioactv)
q1.link(radioactv)
radioactv.link(vc)
radioactv.set_state(Gst.State.PLAYING)
q1.pads[1].remove_probe(probe_id)

# wait until end
time.sleep(4)

我的问题是,尽管是公共变量,但我的变量public interface IUnit : ISelectable { int healthPoint { get; set; } bool isIndestructible { get; set; } /******************************/ void takeDamage(int dmg); void die(); } [System.Serializable] public class BasicUnit : MonoBehaviour, IUnit { private int _healthPoint; public int HealthPoint { get { return (_healthPoint); } set { _healthPoint = value; } } private bool _isIndestructible; public bool isIndestructible { get { return (_isIndestructible); } set { _isIndestructible = value; } } public void takeDamage (int dmg) { if (this.isIndestructible == false) { this.HealthPoint -= dmg; if (this.HealthPoint <= 0) { die(); } } } public void die() { Destroy(gameObject); } } 并未在Unity的检查器中显示。我尝试使用healthPoint,但它不起作用。

我的问题很简单,我该如何在Unity的检查器中显示我继承的变量?

注意:我正在尝试使用漂亮且可读的代码,所以如果可能的话,我希望将IUnit类作为接口和IUnit中的变量保留。

3 个答案:

答案 0 :(得分:2)

隐藏的不是你继承的代码。继承对字段的显示没有任何影响 相反,真正发生的是你有两个可序列化的字段,但标记为私有(_healthPoint&amp; _isIndestructible),
和两个公共属性。不幸的是,Unity无法开箱即用地处理和显示属性。

幸运的是,这是一个简单的解决方案。我在Unity Wiki上发现了这个,并将其保存为以下情况:)

Expose Proerties in Inspector from Unity Wiki

工作原理
基本上,您想要公开的属性的任何Monobehavior应该继承自 ExposableMonoBehaviour 以及 1.私有字段(如您的_healthPoint)应具有[SerializeField,HideInInspector]属性 2.公共属性(如HealthPoint)应具有[ExposeProperty]属性

部分示例

public class BasicUnit : ExposableMonoBehaviour, IUnit {

    [SerializeField, HideInInspector]
    private int _healthPoint;
    [ExposeProperty]
    public int HealthPoint { 
        get { return (_healthPoint); } 
        set { _healthPoint = value; } 
    }


}

答案 1 :(得分:0)

我找到了,您可以在要在检查器中显示的任何字段上使用[SerializeField]。但是,它必须用于要序列化的私有变量,而不是公共变量。

public class BasicUnit : MonoBehaviour, IUnit {

  [SerializeField]
  private int       _healthPoint;
  public int        HealthPoint         { get { return (_healthPoint); } set { _healthPoint = value; } }
  [SerializeField]
  private bool  _isIndestructible;
  public bool       isIndestructible    { get { return (_isIndestructible); } set { _isIndestructible = value; } }
}

答案 2 :(得分:0)

如果仍然有人在设置从检查器中的接口继承的变量值时遇到问题,感谢 Jetbrains Rider,我找到了解决方案。只需在子脚本中引入变量之前使用 [field: SerializeField]。

示例:

public interface IAlive
{
    float HealthPoint { get; set;}
}
public class Cat : MonoBehaviour , IAlive
{
    [field: SerializeField] float HealthPoint { get; set;}
}