使用以下代码,我可以从“SMG”获取脚本并将其应用于weaponObject:
weaponObject = GameObject.FindGameObjectWithTag(SMG).GetComponent<SMGScript>();
是否有可能采取类似以下的措施?若然,怎么做?
string variable = "SMG";
weaponObject = GameObject.FindGameObjectWithTag(variable).GetComponent<variable>();
我希望有一些脚本可以应用于依赖于变量的weaponObject。
答案 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模式。