使用GetComponent使用字符串获取脚本

时间:2014-08-18 10:29:14

标签: c# unity3d gameobject

使用以下代码,我可以从“SMG”获取脚本并将其应用于weaponObject:

weaponObject = GameObject.FindGameObjectWithTag(SMG).GetComponent<SMGScript>();

是否有可能采取类似以下的措施?若然,怎么做?

string variable = "SMG";

weaponObject = GameObject.FindGameObjectWithTag(variable).GetComponent<variable>();

我希望有一些脚本可以应用于依赖于变量的weaponObject。

3 个答案:

答案 0 :(得分:4)

因为我看到武器的名称与脚本不同,所以你需要2个变量。

string variable = "SMG";
string scriptName = "SMGScript";
GameObject.FindGameObjectWithTag(variable).GetComponent(scriptName);

效率不高。


解决方案

你想要做的是拥有一个父类,你的所有武器都会继承它。

public interface Weapon
{
}

然后你就像这个例子一样创造你所有的武器:

public class M4 : MonoBehaviour, Weapon
{
}

public class MP5: MonoBehaviour, Weapon
{
}

当你想要获取脚本组件时,你可以简单地使用它:

string tag = "Weapon";

Weapon w = GameObject.FindGameObjectWithTag(tag).GetComponent(typeof(Weapon)) as Weapon;

答案 1 :(得分:1)

是的,可以在GetComponent上使用变量,如下所示:

weaponObject = GameObject.FindGameObjectWithTag(variable).GetComponent(variable);

即使由于性能原因而不建议使用,如here所述。

然而,我不确定如何定义此weaponObject,因为您从GetComponent获得的脚本可能会有所不同,您的变量类型必须与您获得的脚本相同。

我的建议是将所有武器放入脚本并给它一个类型变量(例如:类型1是机枪,类型2是手枪等)来代表每个武器。这样你就可以得到上面的脚本,通过访问类型找出你得到的武器类型:

int weaponType = weaponObject.type;

答案 2 :(得分:-2)

您的问题是具体询问如何在没有泛型的情况下使用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对象),那么几乎总有更好的方法来获取参考。

例如,如果这是一个拾取,您可以使用碰撞/触发器信息来获取正确的GameObject。

或者,如果这是一个只有一个实例的对象,但是您想在运行时定义该实例,请使用Singleton模式。