使用字符串 Unity 从游戏对象获取脚本

     2023-02-23     75

关键词:

【中文标题】使用字符串 Unity 从游戏对象获取脚本【英文标题】:Getting a script from a gameobject using a string Unity 【发布时间】:2021-12-10 10:40:17 【问题描述】:

我正在为我的 FPS 游戏开发一个简单的武器控制器,但在尝试使其动态化时遇到了问题。当玩家拿起武器时,我希望将武器统计和效果设置为默认值。为此,每个武器都有一个脚本

weapon.name + "Stats"

但我在引用所述脚本时遇到问题。现在,这就是我的代码的样子:

string weaponScriptName = weapon.name + "Stats";
weapon.GetComponent<weaponScriptName>().UseWeapon();

其中weapon 代表当前装备武​​器的gameobject。显然,这不起作用,我在 Unity 帮助页面上找到的各种实现只会导致更多错误。我该怎么做才能解决这个问题?

谢谢。

【问题讨论】:

尽可能不要使用字符串...使用例如用于决定预定义类型的枚举开关.. 字符串总是容易出错且速度慢! @derHugo 抱歉,我对 Unity 很陌生。我将如何实现它? 【参考方案1】:

GetComponent 有多个重载。

有你指的generic版本——最常用的一个

T GetComponent<T>()

只能与编译时常量类型参数一起使用,例如

var renderer = GetComponent<Renderer>();

有一个使用动态Type

 Component GetComponent (Type type)

喜欢

 // Just an example, there are many ways of getting a type
 var type = typeof(Renderer);
 var renderer = (Renderer) GetComponent(type);

最后还有一个string

Component GetComponent (string typeName);

喜欢

// Again just an example, there are many ways of getting type names
// Especially when dealing with multiple assemblies you might even have to use the AssemblyQualifiedName
var renderer = (Renderer) GetComponent("Renderer");

请注意,对于任何动态版本,您要么必须键入 cast,要么如果仅具有通用 Component 引用就足够了,您当然可以使用它。


但是,如果可能的话,根本不要使用string 版本!

它总是很慢而且容易出错。而是使用例如一些常见的基类或interface,或使用枚举或Dictionary 来决定为哪个状态做什么。

所以我宁愿有例如

public interface IWeapon

    void UseWeapon();

然后你的每一个不同的武器都可以实现这个接口

public class WeaponA : MonoBehaviour, IWeapon

    public void UseWeapon ()
    
        Debug.Log("Used Weapon A");
    


public class WeaponB : MonoBehaviour, IWeapon

    public void UseWeapon ()
    
        Debug.Log("Used Weapon B");
    

你的代码就是

var weapon = someObject.GetComponent<IWeapon>(). UseWeapon();

或者如果你的武器都共享一些共同的实现,例如拾取等,而不是有一个共同的基类

public abstract class BaseWeapon : MonoBehaviour

    // Everything that all weapons share as behavior and properties

    // every subclass HAS TO implement and override this method
    public abstract void UseWeapon ();

    // Alternatively if there even is some common behavior
    // subclasses CAN but don't have to override this
    //public virtual void UseWeapon ()
    //
    //    // Implementation that is the default behavior
    //

然后

public class WeaponA : BaseWeapon

    public override void UseWeapon ()
    
        Debug.Log("Used Weapon A");

        // If using virtual before then this class IGNORES and fully overwrites the default implementation
    


public class WeaponB : BaseWeapon

    public override void UseWeapon ()
    
        // If using virtual and you WANT the default behavior then add
        //base.UseWeapon();

        Debug.Log("Used Weapon B");       
    

你的代码就是

var weapon = someObject.GetComponent<BaseWeapon>(). UseWeapon();

【讨论】:

【参考方案2】:

如果我猜对了,你想做类似GetComponent&lt;"Transform"&gt;() 的事情吗? 如果是这样,你应该改用GetComponent("Transform");

【讨论】:

不,我不是要获取转换组件,而是要从游戏对象“武器”获取脚本组件 我在举一个例子。确保您可以将字符串 "Transform" 更改为您拥有的任何其他组件名称!

unity小技巧-自动获取所有子节点,再也不用通过脚本手动链接每个transform了(代码片段)

有时,游戏场景会使用许多相同类型的游戏对象,例如敌人、路标和障碍物。这些游戏对象可能需要由监督或响应它们的特定脚本来跟踪(例如,寻路脚本可能需要使用所有路标)。可以使用变量来链接这些... 查看详情

如何在脚本中仅使用游戏对象启用 Unity C# 中的部件/组件

】如何在脚本中仅使用游戏对象启用UnityC#中的部件/组件【英文标题】:HowdoIenableParts/ComponentsinUnityC#withonlyagameobjectinthescript【发布时间】:2015-11-0617:14:24【问题描述】:我正在使用Photon在我的游戏中制作多人游戏,以确保一个玩... 查看详情

unityc#

gameObject//获取当前脚本挂载到的游戏对象在Unity中就算使用了C#进行编写脚本,要输出时不能使用Console类,应当使用print();或者Debug.log();transform表示该脚本挂载的游戏对象身上的transform组件Transform.position//获取transform身上的各种属... 查看详情

unity3d中给gameobject绑定脚本的代码

...“GameObject”);我觉得如果游戏对象没再最上层,那么最好使用路径的方法,因为有可能你的游戏对象会有重名的情况,路径用“/”符号隔开即可。&nb 查看详情

在 Unity 中,如何将值从一个脚本传递到另一个脚本?

...对象都可以访问的下降速度变量。由于各种原因,我无法使用内置的重力来做我想做的事情。如何重复访问一个对象中的变量,以便在它更新时从另一个对象获取更新后的变量?【问题讨论】: 查看详情

unity脚本调用其他gameobject游戏对象(代码片段)

...写的够不够清晰,意思就是,有个脚本,需要使用同一个Scene下的其他游戏对象。该怎么做呢?1.脚本定义一个变量这个变量,不需要像java那样,需要自己去new,而是回到Unity软件中,去绑定一个对... 查看详情

unity获取游戏对象详解

...是去保存Transform,因为Transform下的方法要比GameObject多,使用频率也要高很多。privateTransformroot;其实我心里一直有个疑问,为什么unity不把GameObject和Transform合并成一个对象。1.GameObject.Find()通过场景里面的名子或者一个路径直接获... 查看详情

unity脚本生命周期与执行顺序(代码片段)

...序自定义执行顺序 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码。必须绑定在游戏对象上才能开始它的生命周期。游戏对象可以理解为能容纳各种组件的容器,游戏对象的所有组件一起决... 查看详情

unity中两脚本间怎么传值呢?

js向js传值,c#向c#,js向c#传值。这些都怎么做到呢?求大神解答参考技术A无论是JS还是C#都是用GameObject.find()方法来获取游戏对象然后在游戏对象上调用GetComponent<T>()泛型方法来获取脚本本回答被提问者和网友采纳 查看详情

unity3d项目-01-开始游戏主界面(代码片段)

...》//为按钮添加触发事件(参数是函数名字,不是字符串!ÿ 查看详情

如何通过脚本在 Unity 中重新定位和调整游戏对象的大小?

】如何通过脚本在Unity中重新定位和调整游戏对象的大小?【英文标题】:HowdoIrepositionandresizegameObjectsinUnityviascripting?【发布时间】:2021-09-2710:36:38【问题描述】:所以我试图在Unity中构建一个类似于SnakesandLadders游戏的游戏,但... 查看详情

我不能将脚本分配给 UNITY 中的按钮?

...2019-05-1104:22:56【问题描述】:我刚开始探索Unity,我正在使用UNITY2D制作游戏。我决定从一个简单的菜单屏幕开始习惯UNITY。我制作了菜单并继续对按钮进行编程。但是,当我将脚本(或持有脚本的游戏对象)拖入单击部分的按钮... 查看详情

如何从预制件中获取场景中游戏对象的引用(代码片段)

...从列表中将游戏对象实例化到场景中,在此之前,我没有使用实例化系统,只是让游戏对象始终处于活动状态。现在实例化游戏对象(Prefab)我遇到了在实例化它时忽略引用的错误,我在此之前已经查看过各种其他文章,例如此... 查看详情

unity获取游戏物体

今天试着总结一下获取游戏物体的方法,但是使用transform.find时报错说没有实例对象NullReferenceException:ObjectreferencenotsettoaninstanceofanobjectNewBehaviourScript.Start()(atAssets/prefabs/NewBehaviourScript.cs:14)脚本如下:GameObjecta=GameObject.Find("my&quo... 查看详情

Unity C# - 单击按钮将游戏对象传递给另一个 C# 脚本 [关闭]

】UnityC#-单击按钮将游戏对象传递给另一个C#脚本[关闭]【英文标题】:UnityC#-OnbuttonclickpassgameobjecttoanotherC#script[closed]【发布时间】:2021-02-0318:38:12【问题描述】:我有多个按钮,它们附加了不同的游戏对象。单击按钮时,我想将... 查看详情

unity查找物体对象

unity中查找游戏物体是很寻常的操作,有较多的方法,如下:unity中提供了获取对象的方法: 通过对象名称(Find方法)GameObject.Find通过标签获取单个游戏对象(FindWithTag方法)通过标签获取多个游戏对象(FindGameObjectsWithTags方... 查看详情

获取其他玩家实例化的游戏对象 Unity Photon

...,但它们都具有相同的名称,因此无法正常工作。我不想使用地形生成器,但是当每个玩家生成地形时,它们都会相互混淆。所以我想也许只有第 查看详情

unity3d游戏开发初探

...戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePrimitive()  以上一篇的博文中的“指哪打哪”例子为基础,在AddForce脚本写入以下代码: ViewCode  其中在CreateCube方法中,使用GameObject.... 查看详情