CollisionOnEnter 如何检测物体是不是发生碰撞?

Posted

技术标签:

【中文标题】CollisionOnEnter 如何检测物体是不是发生碰撞?【英文标题】:CollisionOnEnter how to detect if an object is colliding?CollisionOnEnter 如何检测物体是否发生碰撞? 【发布时间】:2019-12-13 23:45:38 【问题描述】:

我对 C# 和 Unity 还很陌生,我尝试制作一个 Angry Birds 克隆,但我遇到了这个问题。

当小鸟飞行并撞击物体时,我想改变游戏物体(在我的例子中是木版)的质量,它应该从 Mass: 1 变为 Mass: 0.2 here is a screenshot of the scene 我创建了两个方法,它以一种奇怪的方式工作,但是每次我开始游戏时,质量都不是 1,而是 0.2。只有当小鸟撞到木版上时才会改变。

这是我的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Wall : MonoBehaviour

private float wallMass;
private bool isHit;
private Rigidbody2D rb;

void Start()

    rb = gameObject.GetComponent<Rigidbody2D>();
    wallMass = 1.0f;
    isHit = false;


void Update()

    CollisionOn(isHit);


private void CollisionOn(bool isTrue)

    rb.GetComponent<Rigidbody2D>().mass = wallMass;
    if (isTrue)
    
        DecreaseMass();
    


void DecreaseMass()

    rb.GetComponent<Rigidbody2D>().mass = 0.2f;

【问题讨论】:

通常在进行碰撞时,您必须在每个更新/游戏滴答声中检查每个对象与其他对象。当然,Unity 可能会自动从您那里获取此信息,而是为您提供对象上的 Event 或 Pollable 属性,以检查谁与谁发生了冲突。 “但每次我开始游戏时,质量不会变为 1,而是变为 0.2。”你能改写吗?我真的不确定你想在这里说什么。另外,您在哪里将isHit 设置为 true? CollisionOn 中的参数不应命名为 isTrue,因为我猜它也可能是假的。 如果发生碰撞,您不需要检查每一帧。 Unity 提供了在发生碰撞时触发的事件。检查this 你肯定只使用“OnCollisionEnter”和“OnCollisionExit”吗? 【参考方案1】:

在附在盒子上的 MonoBehaviour 上使用这 2 个事件。

发生碰撞时调用

void OnCollisionEnter2D(Collision2D col)

   GetComponent<Rigidbody2D>().mass = wallMass;

碰撞结束时也一样。

void OnCollisionExit2D(Collision2D other)

    GetComponent<Rigidbody2D>().mass = 0.2f;

【讨论】:

以上是关于CollisionOnEnter 如何检测物体是不是发生碰撞?的主要内容,如果未能解决你的问题,请参考以下文章

检测视频中是不是存在摄像机运动以及手术视频中的移动物体

新人求助,unity如何判断一个物体是不是在移动

如何检测物体边框 opencv

unity3d中如何检测车轮是不是接触地面?

放弃机器学习,Python 如何进行物体检测?

opencv 如何检测特定形状的物体