【问题标题】:Variable not being set in class using inheritance未使用继承在类中设置变量
【发布时间】:2021-10-02 14:52:50
【问题描述】:

编辑:原来这就是我获得 ProjectileWeapon 组件的方式。我得到的是非实例化预制件上的那个,而不是武器游戏对象上的那个。我对其进行了更改,以便代码首先实例化游戏对象(或者如果我们已经选择它,则获取现有的),然后从中获取组件。所以其余的代码工作正常。现在我可以继续改进它了!

我对下面名为 ProjectileWeapon 的类有疑问。它基于一个名为 Weapon 的抽象类,该类继承 MonoBehaviour。

Weapon 有两个抽象函数,称为 BeginCycle 和 EndCycle,它们在 ProjectileWeapon 类中实现。这些函数设置了一个名为“触发”的变量。

问题是,尽管函数被正确调用,但似乎从未设置过“触发”。我知道函数被调用是因为我可以在控制台中看到打印。

另外,当我在更新函数中使用该变量时,它不会做任何事情,因为变量永远不会改变。

OnGUI 函数正在工作并在屏幕上显示文本,但是“触发”变量从未更新。

我是否误解了如何使用继承?

这个类在武器预制件上,然后在游戏中的装备功能中实例化

public class ProjectileWeapon : Weapon
{

    private bool firing;
    private float firingTimer;

    void Start()
    {
        print("ProjectileWeapon start");
    }
    void OnGUI()
    {
        GUI.Label(new Rect(0,100,100,100), "ProjectileWeapon firing: " + firing);
    }

    void Update()
    {
        // this function is called but "firing" is not updated
    }

    public override void BeginCycle()
    {
        print("projectile begin cycle");
        firing = true;
    }

    public override void EndCycle()
    {
        print("projectile end cycle");
        firing = false;
    }
}

这是基类:

public abstract class Weapon : MonoBehaviour
{
    public abstract void BeginCycle();
    public abstract void EndCycle();
}

编辑:这是调用上述代码的代码 该组件被添加到玩家游戏对象中

public class WeaponHandler : MonoBehaviour
{
    public bool FireInput { get; set; } // set to true when user holds the mouse button down, and false when let go

    public Weapon WeaponBehaviour; // this is the script that does the weapon functionalility. Any subclass of Weapon can be put here e.g. ProjectileWeapon, MeleeWeapon

    private bool isFiring = false;

    void OnGUI()
    {
        GUI.Label(new Rect(0,0,100,100), "fire input:" + FireInput + ", isFiring:" + isFiring);
    }

    void Update()
    {
        // fire weapon
        if (WeaponBehaviour && FireInput && !isFiring)
        {
            ActivateWeapon();
        } 
        else if (!FireInput && isFiring)
        {
            DeActivateWeapon();
        }
    }

    private void ActivateWeapon()
    {
        print("activate weapon");
        isFiring = true;
        WeaponBehaviour.BeginCycle();
    }

    private void DeActivateWeapon()
    {
        print("deactivate weapon");
        isFiring = false;
        WeaponBehaviour.EndCycle();
    }
}
 

【问题讨论】:

  • 调用这些函数时的代码是什么样的?
  • 作为提示:删除OnGUI 而是简单地使您的字段在 Inspector 中序列化,例如 [SerializeField] private bool firing; -> 仍然是私有的,但现在您可以直接在 Inspector 中查看值,而无需在任何地方记录或显示它;)或者,您始终可以将检查器设置为Debug 模式,这也使私有非序列化字段感到高兴
  • @TEEBQNE 我已经添加了调用它的代码。希望这是有道理的。我做了更多的测试,当我单击鼠标时,我可以确认“触发”变量已设置(为真),然后在我放手时再次设置(为假)。然而,使用该变量的更新函数仍将其显示为错误!这太奇怪了……
  • @derHugo 我已经做到了。即使我知道变量正在改变,我也没有看到它改变!这太奇怪了。这就像我正在访问相同变量的不同副本......

标签: c# unity3d


【解决方案1】:

根据您提供的代码,可能存在三种情况:

  1. 你没有调用函数。但是,如果调用了打印函数,那么您必须调用它们。

  2. 您正在调用这两个函数,这会将变量设置为 true,然后设置为 false。

  3. 您正在使用同名的局部变量覆盖该变量。如果出现这种情况,Visual Studio 会发出警告。

如果不知道应该在哪里调用变量,就很难判断。如果你上传剩下的代码,我相信答案会很清楚。

【讨论】:

  • 我已经编辑了原始帖子。我希望这会带来一些清晰。 ProjectileWeapon 类位于游戏对象预制件上,该预制件在代码的不同部分被实例化。我想知道它被实例化的事实是否会导致我不理解的事情?我三次检查了调用 Begin 和 End 函数时“触发”变量是否正确更改,但是同一类中的 Update 或 OnGui 函数似乎看不到它。就像我正在访问同一个变量的不同副本
【解决方案2】:

原来这就是我获得 ProjectileWeapon 组件的方式。我得到的是非实例化预制件上的那个,而不是武器游戏对象上的那个。我对其进行了更改,以便代码首先实例化游戏对象(或者如果我们已经选择它,则获取现有的),然后从中获取组件。所以其余的代码工作正常。现在我可以继续改进它了!

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 2019-12-15
    • 2013-04-10
    • 1970-01-01
    • 2023-02-09
    • 2015-12-09
    • 1970-01-01
    • 2020-10-18
    • 2013-04-19
    相关资源
    最近更新 更多