【问题标题】: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”吗?

标签: c# unity3d game-physics physics


【解决方案1】:

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

发生碰撞时调用

void OnCollisionEnter2D(Collision2D col)
{
   GetComponent<Rigidbody2D>().mass = wallMass;
}

碰撞结束时也一样。

void OnCollisionExit2D(Collision2D other)
{
    GetComponent<Rigidbody2D>().mass = 0.2f;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2013-06-23
    • 2010-12-29
    • 2015-02-10
    • 2010-11-19
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多