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 如何检测物体是不是发生碰撞?的主要内容,如果未能解决你的问题,请参考以下文章