【问题标题】:How to programmatically assign two different classes to one variable?如何以编程方式将两个不同的类分配给一个变量?
【发布时间】:2023-03-08 00:04:01
【问题描述】:

我正在 Unity 中创建一个游戏,我有 2 个类,我想根据布尔值为该变量分配 2 个不同的类,以便以后按我的意愿使用该类,这是我到目前为止的代码给出我在寻找什么的想法,甚至有可能完成吗?谢谢

public GeneticController geneticController;
public GeneticDriver geneticDriver;

public Object Genetic;

void Start() {
    if (RaceSelect.SelectedRace == 2) {
        Genetic = geneticDriver;
    } else {
        Genetic = geneticController;
    }

}

void FixedUpdate() {
    float steer = (float)(Genetic.Steering);
    Steering(steer);     

}


目前它只是说,Object 没有名为“Steering”的变量。遗传应该是什么类型?

【问题讨论】:

  • 您有 99.99999% 的机会不想直接使用 Object 类型。

标签: c# oop unity3d


【解决方案1】:

我在这里做了一些假设,GeneticControllerGeneticDriver 都实现了 Steering 属性?如果是这样,特别是如果它们有其他共同的属性和方法,实现这一点的正确方法是重构类,以便它们共享一个公共接口。

public interface ISteering
{
    float Steering {get; set;}
}
public class GeneticController : ISteering
{
    public float Steering{ get; set; }
}
public class GeneticDriver: ISteering
{
    public float Steering{ get; set; }
}

在那里,您可以将变量 Genetic 设为 ISteering 的类型。

public ISteering Genetic;

但是,如果转向是他们唯一的共同点,我建议您重新审视一下您的整体设计。如果这两个类不共享或共享很少的通用函数,则它们可能不需要共享变量。

【讨论】:

  • 我试过这样做,但由于某种原因,getter 返回 0,即使 setter 返回正确的值
  • @zarrexx 听起来这可能是一个不同的问题。我建议开始一个新帖子,确保包含您的新代码。顺便说一句,如果它正确回答了您的问题,请不要忘记接受答案!
  • @avarient 作为新成员,很遗憾,它不会让我发布另一个问题。
  • 我很高兴它可以正常工作,但是它应该可以工作而不必是静态的。如果您确实获得了足够的声誉来发布另一个问题,我鼓励您跟进。无论如何,祝你发展顺利!
  • 因为它的 Unity 我已经有一个名为 monobehaivour 的基类,因此我无法创建另一个基类 ISteering,这就是我必须使用静态的原因,(我认为)
【解决方案2】:

您是否尝试过使用派生到您的 2 个子类的基类?

类似的东西:

public class BaseClass
{
  public float Steering {get;set;}
}

public class GeneticController : BaseClass
{
}

public class GeneticDriver : BaseClass
{
}

然后您执行以下操作(并且您不需要演员表):

BaseClass Genetic

void Start()
{
  if (RaceSelect.SelectedRace == 2)
  {
    Genetic = geneticDriver;
  } else
  {
    Genetic = geneticController;
  }
}

void FixedUpdate()
{
  float steer = Genetic.Steering;
  Steering(steer);     
}

您也可以将 BaseClass 设置为接口。这取决于两个派生类之间是否有共同的功能。

【讨论】:

  • 我试过这样做,但由于某种原因,getter 返回 0,即使 setter 返回正确的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多