我将如何允许我在运行时使用 OnCollisionEnter2D 更改对象的标签

Posted

技术标签:

【中文标题】我将如何允许我在运行时使用 OnCollisionEnter2D 更改对象的标签【英文标题】:how would i go about allowing me to change the tag of an object on runtime with 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"; 当你尝试改变游戏对象的标签而不是直接在碰撞中做时,它仍然不起作用? 【参考方案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>

【讨论】:

以上是关于我将如何允许我在运行时使用 OnCollisionEnter2D 更改对象的标签的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Datagrip 中的两个不同数据源之间运行查询?

如何允许具有强参数的数组

unity3d研究1-物理碰撞OnCollision和非物理碰撞OnTrigge的区别

查看代码以防止允许的内存限制问题

如何允许案例运行N次

为啥这个程序不允许我在需要时输入信息? [复制]