【问题标题】:Struggling with Get.Component and Destroy与 Get.Component 和 Destroy 斗争
【发布时间】:2020-03-28 16:31:34
【问题描述】:

大家好,所以我的程序是一个非常简单的程序,我要做的是必须通过按 H 表示英雄或按 E 表示敌人伤害来摧毁其中一个对象,但我让它非常接近所以他们很快就倒下了,但经过数小时的尝试和谷歌搜索,我似乎无法弄清楚,请帮忙,因为它仍然无法正常工作:( 所以第一个脚本被放置在两个对象中,我有一个名为 Hero 的立方体和一个名为 Hero 的标签,第二个对象是一个名为 Enemy 的球体,与标签的名称相同。

这是他们都拥有的脚本:

public class Character : MonoBehaviour
{
    public float HP = 100;
    public float minDmg = 23f;
    public float maxDmg = 25f;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
    public float DamageDealt()
    {
        float damage;
        damage = Random.Range(minDmg, maxDmg);
        return damage;
    }
}

第二个脚本放在相机上,我认为应该没问题吗?

public class FightControl : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        GameObject _hero = GameObject.Find("Hero");
        GameObject _villain = GameObject.Find("Enemy");

        //object se pravi da bi moglo da se preuzme var iz Character u obkejtu _hero
        Character chscript = _hero.GetComponent<Character>();
        //object se pravi da bi moglo da se utice na hp u objectu _villain
        Character chscripta = _villain.GetComponent<Character>();
        if (Input.GetKeyDown(KeyCode.H))
        {

            float dmg = chscript.DamageDealt();



            chscripta.HP = chscript.HP - dmg;
            if (chscripta.HP <= 0)
            {
               Destroy(_villain);
            }
        }


        if (Input.GetKeyDown(KeyCode.E))
        {
            Character chscript1 = _villain.GetComponent<Character>();
            float dmg1 = chscript1.DamageDealt();

            Character chscript1a = _hero.GetComponent<Character>();
            chscript1a.HP -= dmg1;
            if(chscript1a.HP <= 0)
            {
                Destroy(_villain);
            }


        }


    }

    // Update is called once per frame
    void Update()
    {

    }
}

【问题讨论】:

  • “不工作”是什么意思?代码是否无法编译?请描述这里发生的事情。
  • 可以编译,但没有结果。

标签: c# unity3d


【解决方案1】:

您的第二个脚本无法运行,因为您只运行一次所有内容。

Start() 方法只在游戏对象启用后运行一次。您在 start 方法期间读取输入,而不是在任何其他帧期间。

考虑将部分代码移至 Update() 方法,以便每帧都读取输入:

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.H))
        {
            float dmg = chscript.DamageDealt();
            chscripta.HP = chscript.HP - dmg;
            if (chscripta.HP <= 0)
            {
               Destroy(_villain);
            }
        }


        if (Input.GetKeyDown(KeyCode.E))
        {
            Character chscript1 = _villain.GetComponent<Character>();
            float dmg1 = chscript1.DamageDealt();
            Character chscript1a = _hero.GetComponent<Character>();
            chscript1a.HP -= dmg1;
            if(chscript1a.HP <= 0)
            {
                Destroy(_villain);
            }
        }
    }

与其在运行时查找游戏对象,不如考虑在对代码进行此更改后,通过将游戏对象拖到检查器来创建引用并配置英雄/反派引用。您可以对组件和游戏对象执行此操作,因此使用以下代码,您的检查器中应该有 4 个“插槽”:

public class FightControl : MonoBehaviour
{
    public GameObject _hero;
    public GameObject _villain;
    public Character chscript;
    public Character chscripta;
//... the rest of your code (the Update() method above)

【讨论】:

  • 我早上试试这个!
  • @StefanKefi 另外,这条线看起来不正确:chscripta.HP = chscript.HP - dmg; 你将反派的生命值设置为英雄的当前生命值减去英雄的伤害(chscript vs chscripta!使用智能变量名字!)。
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 2020-09-18
  • 2018-05-23
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多