C# 如何通过继承来接近实体类?
因此,我担心的是没有完全意识到这是否是解决我的情况的最佳方法 假设我得到了一个基类“实体”。假设目的是构造类层次结构系统C# 如何通过继承来接近实体类?,c#,inheritance,C#,Inheritance,因此,我担心的是没有完全意识到这是否是解决我的情况的最佳方法 假设我得到了一个基类“实体”。假设目的是构造类层次结构系统 public class Entity { public int _hp; private int _max_hp; public Entity(int hp) { _max_hp = hp; _hp = _max_hp; } } 我们还有其他派生类 public
public class Entity
{
public int _hp;
private int _max_hp;
public Entity(int hp)
{
_max_hp = hp;
_hp = _max_hp;
}
}
我们还有其他派生类
public class d_class1: Entity
{
public d_class1(int hp):
base(hp)
{
}
}
public class d_class1_Mono: MonoBehaviour
{
public d_class1 d1;
}
public class d_class2: Entity
{
public d_class2(int hp):
base(hp)
{
}
}
public class d_class2_Mono: MonoBehaviour
{
public d_class2 d2;
}
(请原谅错误的命名约定,这是故意的)
假设从Mono继承的脚本附加到场景中的不同对象。
我想在“点击”该装置时能够区分我当前拥有的“类别”
不管怎样,我都可以避免检查所有可能的课程
前
我觉得自己有时必须这样做才能获得hp,只是因为我需要某种方式访问组件。也许这不是最好的方法。目前,这一切都很简单,但每门课程都有各自不同的方式(即不同的能力等)
因此,希望有人能在我的理解中透露一些知识。您附加的游戏对象Monobhavior可以为该对象专门设置一个处理程序。例如,您可以在d_class1_Mono上实现“void OnUpdate()”,并为d_class2_Mono实现不同的更新函数 假设您不知道单击了哪个对象(因为这是通过其他类/函数路由的)- 你可以做:
obj.GetComponent()
及
obj.GetComponent()
无论哪一个返回非空引用,都会附加该脚本。希望这是有意义的。我可能会在
实体
类中定义一个虚拟
或抽象
方法,每个继承的类都将实现该方法。例如,如果您既有移动实体又有不移动实体,并且您有一个在实体中定义的无效移动位置(Position pos)
方法:
// Mobile entity
public class d_class1: Entity
{
// ...stuff...
public void MoveToPosition(Position pos)
{
TweenPosition(_currPosition, pos, movementSpeed);
}
}
// Immobile entity
public class d_class2: Entity
{
// ...stuff...
public void MoveToPosition(Position pos)
{
// Do nothing
}
}
然后在逻辑/更新循环中,您可以简单地告诉所有实体MoveToPosition(…)
,而那些不应该响应的实体将什么也不做
我发现,当我有一个通用的接口或一个带有通用“do something”方法的类,并让每个派生类以自己的方式处理该方法调用的“how”时,编码会更干净。这确实有意义,但个人感觉很笨拙。我曾想过这种方法,但我觉得它既懒惰又低效。GetComponent函数是判断特定脚本是否附加到任意游戏对象的唯一方法。编辑:你也可以创建一个附加到所有游戏对象上的脚本,用来识别游戏对象的“类型”。是的,我试图避免这种情况,但这似乎是一个足够简单的解决方案。没有必要如此努力地让某样东西感觉正确,因为它可以简单地通过这个来工作。谢谢你。
// Mobile entity
public class d_class1: Entity
{
// ...stuff...
public void MoveToPosition(Position pos)
{
TweenPosition(_currPosition, pos, movementSpeed);
}
}
// Immobile entity
public class d_class2: Entity
{
// ...stuff...
public void MoveToPosition(Position pos)
{
// Do nothing
}
}