您的问题是专门询问如何在没有泛型的情况下使用 GetComponent 。在您的情况下,结果将是:
string variable = "SMG";
string scriptName = "SMGScript"
weaponObject = GameObject.FindGameObjectWithTag(variable).GetComponent(scriptName);
但一般来说,这种管理对象的方法是不可持续的。随着您的项目变得越来越大,按名称管理对象变得越来越不可行。
而且我个人强烈建议您不要使用 Enum 来表示您的武器,因为这种方法会遇到同样的问题,如果不是在更大的范围内。
听起来您想要做的是存储对 SMGScript 的引用。
最简单的方法是在脚本中创建一个字段,然后在编辑器中设置值。
如果问题是允许使用多种类型的武器,请使用继承之类的模式:
为你的武器定义一个基类:
WeaponScript : MonoBehaviour
{
public abstract void Fire();
}
然后让 SMGScript 扩展它:
class SMGScript : WeaponScript
然后创建一个公共字段来保存武器,以便您可以在编辑器中设置它:
public WeaponScript PlayerWeapon; //The editor will let you drop *any* weapon here.
发射武器:
PlayerWeapon.Fire(); //This will let any type of weapon you set in the editor fire
要取回任何武器(尽管您可能不需要这个,见下文):
targetGameObject.GetComponent<WeaponScript>();
如果您不知道要从编辑器中获得的对象(例如,您在游戏运行时制作 SMG 对象),几乎总有更好的方法来获取参考。
例如,如果这是一个拾取器,您可以使用碰撞/触发信息来获取正确的游戏对象。
或者,如果这是一个只有一个实例的对象,但您想在运行时定义该实例,请使用 Singleton 模式。