【发布时间】: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 我已经做到了。即使我知道变量正在改变,我也没有看到它改变!这太奇怪了。这就像我正在访问相同变量的不同副本......