【问题标题】:Add a tag to multiple items dynamically unity为多个项目动态统一添加标签
【发布时间】:2016-03-20 16:17:11
【问题描述】:

我在动态添加 taggameObejcts 时遇到问题,当我使用 Instantiateenemy 添加敌人标签时:

GameObject temp = (GameObject)Instantiate(enemy, spwanPosition, spwanRotation);
temp.gameObject.tag = "Enemy";

我从Is it possible create a tag programmatically读到这个

但是当我尝试用特定的explosion 销毁这个对象时,没有带有Enemy 标签的对象:

void OnTriggerEnter(Collider other)
{
    if (other.tag == "Boundary")
    {
        return;
    }
    if (other.tag == "Enemy")
    {
        Debug.Log("enemy");   # Never printed in console
        Instantiate(enemyExplosion, other.transform.position, other.transform.rotation);
    }
    Instantiate(explosion, this.transform.position, this.transform.rotation);
    Destroy(other.gameObject);
    Destroy(this.gameObject);

如何将标签动态添加到gameObjectInstantiate 多次?

编辑

这是暂停游戏中的实例化敌人对象的图片,它是如此连线,它有Enemy tag,但是为什么这不起作用?

问题是在运行时将Enemy 标记分配给对象,但是当我检查if(other.tag == "Enemy") 时,这不起作用!

【问题讨论】:

  • 我很困惑。你说 Instantiated 对象没有标签,但你说它确实有标签...?
  • 标签说敌人。名字说敌人(克隆)。层说默认。根据您的预期,哪个是错误的?
  • @fafase,我Instantiate很多,都是他自己克隆的,我不知道是什么层
  • @Arman,改变你的问题不是是件好事。问题是关于重命名标签,我提供了如何正确更改的解决方案。你说它不起作用,但你继续用我的代码替换了原始代码。我让您上传的图片证明标签已更改现在已更改为敌人。当您的原始问题得到回答时,您接受它,然后如果您遇到不同的问题,请提出新问题。看起来您现在遇到了碰撞问题。不要改变你的问题!问问别人。如果你想展示你的新代码,
  • 您将新代码放入 EDIT 但不要替换原来的代码。

标签: c# unity3d tags


【解决方案1】:

您发布的链接是关于动态创建标签的,您不需要这个,我不明白为什么有人需要这样做。

我想你在标签管理器中有一个名为 Enemy 的标签?

你正在实例化一个敌人预制件,这意味着你不需要enemy.tag = "Enemy"。只需在检查器中将敌人预制标签设置为 Enemy。

这将使用与预制相同的值实例化新敌人。

至于触发器不起作用,我不确定,请确保您已满足调用 OnTriggerEnter() 的敌人的所有规范。

取自http://answers.unity3d.com/questions/753481/ontriggerenter-not-working-tried-everything-c.html

OnTriggerEnter,其中至少一个必须检查 Is Trigger 属性,并且其中至少一个必须具有刚体。如果您的两个对象都不是触发器,则可以改用 OnCollisionEnter。

设置完成后,您应该检查对象上的图层(而不是标签)。要编辑哪些图层相互碰撞,您可以查看编辑 -> 项目设置 -> 物理。

【讨论】:

    【解决方案2】:

    我从以下内容中读到:是否可以通过编程方式创建标签

    不能在运行时创建标签。您可以将游戏对象的标签更改现有的标签,但您不能创建一个新的标签。 p>

    所以分配一个名为EnemyBoundary的标签之前,确保你已经在编辑器中创建了这样的标签> 首先。它也区分大小写

    当我向 gameObejcts 添加动态标签时遇到问题 实例化一个敌人我使用这个添加敌人标签:

    Instantiate(enemy, spwanPosition, spwanRotation);
    enemy.tag = "Enemy";
    

    如何将标签动态添加到实例化的游戏对象 多次?

    错了。您现在正在做的是更改 original GameObject NOT 实例化GameObject 的标签。要更改 Instantiated GameObject 的标签存储 Instantiated 的引用GameObject,然后修改 标签。下面的代码就是你要找的。​​p>

    GameObject tempGOB= (GameObject)Instantiate(enemy, spwanPosition, spwanRotation);
    tempGOB.tag = "Enemy"; //Change the tag of the Instantiated GameObject instead of the enemy(original object)
    

    【讨论】:

    • 它应该可以工作。实例化一个游戏对象,在场景中选择游戏对象,然后发布屏幕截图。
    • 图片加了,好奇怪!
    • 从您上传的图片来看,它有效。它将标签更改为“敌人”。仔细看它说标签的地方,它成功地将标签设置为敌人。这不是你想做的吗?
    【解决方案3】:

    我怀疑你的问题不是标签,而是碰撞。你的敌人有对撞机吗?简单的碰撞测试是否成功?

    编辑(忘记这个):

    实际上你的问题可能是你不应该使用other.tag,而应该使用other.gameObject.tag

    【讨论】:

    • 我原以为other.tagother.gameObject.tag 相同。游戏对象只有一个标签,没有碰撞器。
    • 是的,我看了一下,还是一样的。
    • Other.gameObject.tag 也没有用!敌人有一个Collison Mesh
    • @Arman 您是否在检查器中将您的网格对撞机标记为IsConvexIsTrigger?网格碰撞器仅在标记为凸面时才检测碰撞。
    • 是的,我做到了,它的 istrigger 和 isconvex
    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2023-03-10
    • 2021-02-17
    • 1970-01-01
    • 2012-09-20
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多