【问题标题】:Using GetComponent<>() with a variable?将 GetComponent<>() 与变量一起使用?
【发布时间】:2014-09-05 02:11:19
【问题描述】:

我正在尝试创建定位系统。

当我点击一个骷髅敌人时,我希望能够从骷髅脚本中获取生命值和伤害,同样,当我点击另一个敌人时,我希望获得他们的特定生命值和损坏。

我能想到的唯一方法是使用GetComponent 方法,但是有没有一种方法可以使用通用的GetComponent,它根据我所针对的敌人使用一个变量,这样我就可以获得根据该变量选定的敌人?

【问题讨论】:

  • 你试过EnemyScript enemyScript = gameObject.GetComponent&lt;EnemyScript&gt;();吗?
  • 我做过这样的事情:opponent.GetComponent&lt;Skeleton&gt;().getHit(damage);这是我在&lt;ScriptName&gt; 中硬编码的地方,但我是说,我怎样才能将&lt;ScriptName&gt; 设置为等于@987654327 @的脚本?
  • 我认为你做不到。我的建议是让所有敌人都有相同的脚本,所以你不需要更改 。相反,在敌人脚本中,您需要有一个变量type,例如标记那个敌人是什么(例如,type = 1 用于机器人,type = 2 用于外星人等)。这样你也可以从GetComponent&lt;ScriptName&gt;获取type,并为每种类型的敌人设置条件。
  • GetComponent 方法是否具有接受 System.Type 对象的覆盖?

标签: c# unity3d gameobject


【解决方案1】:

您没有显示任何示例代码,因此很难看出您有什么没有解决,但这是解决问题的一种方法。

//Pseudocode 
GameObject enemy = GetEnemy(); //This could be a raycast, collision or some other method.
Health enemyHealth = enemy.GetComponent<Health>();

这真的很简单。另一种方法可能是发送消息,并在适当的时候让敌人处理它。 From the docs:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void ApplyDamage(float damage) {
        print(damage);
    }
    void Example() {
        gameObject.SendMessage("ApplyDamage", 5.0F);
    }
}

听上去,您遇到的问题是没有获取其他组件,而是您将一堆不相关的功能混合在一起。敌人gameobject 通常应该* 与主玩家具有相同的health component。健康码不应出现在 EnemyPlayerDestructible Box 组件中,否则您不仅要多次编写相同的代码,而且很难与同一事物的不同实现进行交互。

* 在高级情况下,可能需要多个运行状况脚本的实现而不是单个巨大的类。在这些情况下,某种抽象是有用的——例如接口、继承或消息传递。

【讨论】:

  • 好答案,基于组件的架构让这类事情变得非常容易。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2021-09-28
  • 2014-07-18
  • 2021-01-08
  • 2013-06-09
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多