【问题标题】:how would i go about allowing me to change the tag of an object on runtime with OnCollisionEnter2D我将如何允许我在运行时使用 OnCollisionEnter2D 更改对象的标签
【发布时间】:2021-12-01 10:09:44
【问题描述】:
private void OnCollisionEnter2D(Collision2D collision)
{
    while (onWeapon == false && collision.gameObject.tag == "Weapon")
    {
        onWeapon = true;
    } 
    
    
    
    if (onWeapon == true && Input.GetKey(KeyCode.E))
    {
        currentPos = gameObject.transform.position;
        collision.transform.position = currentPos;
        collision.transform.parent = player.transform;
        collision.tag = "WeaponHeld";
    }

    
}

我无法在运行时使用“OnEnterCollision2D”更改对象标签,但是当我使用“OnTriggerEnter2D”时,同一行工作正常

【问题讨论】:

  • 你在统一编辑器中定义了“WeaponHeld”标签吗?
  • 是的 WeaponHeld 已经是编辑器中的一个标签,这不是问题,collision.tag 本身中的“标签”
  • 哦我明白了,因为collision2d不继承自组件,所以你不能直接访问标签。但您可以访问转换。然后你可以像这样从变换中获取标签。 collision.transform.tag = "WeaponHeld";
  • 当你尝试改变游戏对象的标签而不是直接在碰撞中做时,它仍然不起作用?

标签: c# unity3d game-engine game-development


【解决方案1】:

首先,您的while 循环有什么用处?无论如何,只有一次迭代,所以就让它吧

if(!onWeapon && collision.gameObject.CompareTag("Weapon"))
{
    onWeapon = true;
}

那么Collision2D就是一个数据容器struct,里面有关于碰撞的具体数据,它本身没有标签。

你碰撞的gameObject

collision.gameObject.tag = "WeaponHeld";

或者因为你使用的是transform,你也可以使用那个

var otherTransform = collision.transform;
otherTransform.position = currentPos;
otherTransform.parent = player.transform;
otherTransform.tag = "WeaponHeld";

因为它也有属性tag 转发到相应的gameObject.tag


为什么它在 OnTriggerEnter2D 中有效?

因为作为参数,您不会获得Collision2D 结构,而是Collider2D 组件引用。

正如刚才提到的Transform,基类Component具有属性tag,它基本上只是转发给相应的gameObject.tag(参见source code)。 p>

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多