【问题标题】:Using polymorphism or Interfaces in C# unity在 C# 统一中使用多态性或接口
【发布时间】:2020-11-01 15:36:26
【问题描述】:

在我的Unity C#游戏中,我有两个类,一个是PlayerHealth,另一个是EnemyHealth,它们具有相同的功能,但这两个字段是倒置的currentHapinessPowercurrentSadnesPower。 不知道该用多态原理还是继承还是接口。

这些是类:

public class PlayerHealth : MonoBehaviour
{
    #region Public Instances
    public GameObject Player;
    public GameObject Pl_DeathParticle;

    public TextMeshProUGUI NumOfHappyPower;
    public TextMeshProUGUI NumOfSadPower;
    #endregion

    #region HapAndSad System Variables
    public int playerHappinessPower;
    [HideInInspector] public int currentHappinessPower; <--
    [HideInInspector] public int currentSadnesPower;    <--These two
    #endregion

    #region HapAndSad States
    private bool isSad = false;
    #endregion

    void Start()
    {
        currentHappinessPower = playerHappinessPower; // in the enemy class is currentSadnessPower
        NumOfSadPower.enabled = false; // here in the enemy class is true
    }

    void Update()
    {
        HapAndSadPowerSystem();
        StartCoroutine(CheckThePlayerSadState());
    }

    void HapAndSadPowerSystem()
    {
        if (currentHappinessPower > 0) //enemy class: currentSadnessPower
        {
            NumOfHappyPower.text = currentHappinessPower.ToString(); //also here is changed
        }

        else if (currentHappinessPower == 0) // here also is currentSadnessPower
        {
            NumOfHappyPower.enabled = false;
            NumOfSadPower.enabled = true;

        }

        else if (currentHappinessPower < 0 && currentSadnesPower == 0) //and here
        {
            isSad = true;  // enemy class is false                                                                  
            currentSadnesPower = currentHappinessPower * -1; //Make the rest of the soubstraction positive / also here its inverted
            NumOfHappyPower.enabled = false; //true in the enemy class
            NumOfSadPower.enabled = true; // false
            NumOfSadPower.text = currentSadnesPower.ToString();
        }

        else if (currentSadnesPower > 0)
        {
            NumOfSadPower.text = currentSadnesPower.ToString();
        }
    }

    IEnumerator CheckThePlayerSadState()
    {
        if (isSad == true) //here is false
        {
            yield return new WaitForSeconds(2f);
            GameObject PlayerDeath_particle_prefab = Instantiate(Pl_DeathParticle, Player.transform.position, Quaternion.identity);

            Destroy(PlayerDeath_particle_prefab.gameObject, 1f);
            Destroy(Player.gameObject);
        }
    }
}

这里是敌人类:

public class EnemyHealth : MonoBehaviour

    #region Public Instances
    public GameObject Enemy;
    public GameObject En_DeathParticle;

    public TextMeshProUGUI NumOfHappyPower;
    public TextMeshProUGUI NumOfSadPower;
    #endregion

    #region HapAndSad System Variables
    public int enemySadnesPower;
    [HideInInspector] public int currentHappinessPower;
    [HideInInspector] public int currentSadnesPower;
    #endregion

    #region HapAndSad States
    private bool isSad = true;
    #endregion

    void Start()
    {
        currentSadnesPower = enemySadnesPower;
        NumOfHappyPower.enabled = false;
    }

    void Update()
    {
        HapAndSadPowerSystem();
        StartCoroutine(CheckThePlayerSadState());
    }

    void HapAndSadPowerSystem()
    {
        if (currentSadnesPower > 0)
        {
            NumOfSadPower.text = currentSadnesPower.ToString();
        }

        else if (currentSadnesPower == 0)
        {
            NumOfHappyPower.enabled = true;
            NumOfSadPower.enabled = false;

        }

        else if (currentSadnesPower < 0 && currentHappinessPower == 0)
        {
            isSad = false;
            currentHappinessPower = currentSadnesPower * -1;
            NumOfHappyPower.enabled = true;
            NumOfSadPower.enabled = false;
            NumOfHappyPower.text = currentHappinessPower.ToString();
        }

        else if (currentHappinessPower > 0)
        {
            NumOfHappyPower.text = currentHappinessPower.ToString();
        }
    }

    IEnumerator CheckThePlayerSadState()
    {
        if (isSad == false)
        {
            yield return new WaitForSeconds(2f);
            GameObject PlayerDeath_particle_prefab = Instantiate(En_DeathParticle, Enemy.transform.position, Quaternion.identity);

            Destroy(PlayerDeath_particle_prefab.gameObject, 1f);
            Destroy(Enemy.gameObject);
        }
    }
}

【问题讨论】:

  • 接口是less performant,而不是使用抽象实现/多态。提供的链接仅涉及一些的原因。有时会使用接口,有时也会使用继承,但请记住它们的处理方式不同。

标签: c# unity3d interface polymorphism


【解决方案1】:

这些脚本几乎相同。我会使用与玩家和敌人相同的脚本。并添加一个布尔值来区分玩家和敌人。

编辑: 如果你想拼命使用继承或多态,我建议你创建一个实体类,并让 Player 和 Enemy 派生自它。

【讨论】:

  • 是的,但是我应该使用继承还是多态,您如何解释。
  • 继承和多态是描述不同事物协同工作的术语。这不是一个或另一个,它是一个和另一个。从基础获取数据和动作的继承,实现特定子动作的多态性。
  • 恕我直言,对环境中的所有人物对象一视同仁。你想在某个时候扩展到多人游戏吗?但也许可以将它们添加到“团队”或“部队”中,以区分敌友。玩家不需要是一个特定的类,而是一个指向你正在控制的“人”的静态指针。
猜你喜欢
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2010-10-26
  • 2021-12-31
相关资源
最近更新 更多