unity3d - 如何防止 GameObject 检测到未引用的碰撞
问题描述
我正在创建一个无尽的跑步游戏,其基本理念是避免尖峰并收集宝石——非常基本。我遇到的问题是,每当玩家与宝石发生碰撞时,即使它破坏了宝石,播放收集动画并将计分器加 1,它也会像尖刺一样摧毁玩家。为什么会发生这种情况,我该如何解决?这是我的“GemTypeCollision.cs”代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GemTypeCollision : MonoBehaviour
{
public GameObject gem;
public Collider2D gemCollider;
public float numberOfGems;
public Animator gemAnimator;
private void OnTriggerEnter2D(Collider2D gemCollider)
{
numberOfGems += 1;
gemAnimator.SetBool("gemCollected", true);
Destroy(gem, 0.5f);
}
}
我还认为值得注意的是,玩家还附加了一个“尖刺型碰撞”脚本,玩家的反应与击中尖刺时完全一样,即使在宝石被摧毁时也是如此。似乎认为 gem 既是尖峰类型又是 gem 类型,但我不完全确定。
问题更新:
这是真正的问题——当玩家与任何东西发生碰撞时,Unity 认为他正在与任何东西发生碰撞,例如 OnTriggerEnter2D 方法,而不是采用我给它的 Collider2D 参数,它只是忽略信息并认为玩家被触发一次通过每个对撞机。有人知道解决这个问题的方法吗?
解决方案
从您发布的代码中,我只是猜测您在玩家尖峰碰撞脚本中犯了与此处相同的错误:
您不检查碰撞是否真的发生在正确的对象类型上,因此两个脚本都会对任何碰撞器触发器做出反应。
您应该适当地标记您的对象,例如“Spike”和“Gem”,而不是这样做
private void OnTriggerEnter2D(Collider2D gemCollider)
{
// You should always check e.g. via a tag
// if it's not a Gem -> do nothing
if(gemCollider.tag != "Gem") return;
// or alternatively if there is a certain component on the collision object you might also do
if(!gemCollider.GetComponent<GemComponent>()) return;
// ...
}
现在在您的尖峰碰撞中也是如此,您应该添加一个检查,例如
private void OnTriggerEnter2D(Collider2D other)
{
// if it's not a spike do nothing
if(other.tag != "Spike") return;
// ...
}
推荐阅读
- c++ - 如何在 C++ 中检测用户输入?
- sql - 多对多关系的 SQL 连接
- javascript - 动画在预加载 CSS 和图像之前开始
- python - 在 sklearn 中使用 Leave-One-Out 交叉验证的 ROC 曲线
- docker - 如何在相同的heroku应用程序但不同的docker镜像中部署前端和后端
- c# - 我想将我的 Json 对象转换为自定义字符串以保存到数据库
- r - 将国家多边形添加到地图框
- python - 使用 kwargs(或 args)而不是简单的 dict 有什么好处?
- react-native - 如何在 redux 的动作上调用动作?
- c# - 将方法调用委托给另一个方法