我正在创建一个无尽的跑步游戏,其基本思想是避免出现尖峰并收集宝石-非常基本。我遇到的问题是,每当玩家与宝石发生碰撞时,即使它破坏了宝石,播放了集合动画并在得分计数器上加了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);
}
}
我还认为值得一提的是,玩家还附带了一个“尖峰型碰撞”脚本,即使宝石被破坏,玩家也将做出与击中尖峰时完全相同的反应。似乎认为这枚宝石的类型与秒杀类型相同,但我不确定。
问题更新:
这是真正的问题-当玩家与任何东西发生碰撞时,Unity认为他正在与一切发生碰撞,例如OnTriggerEnter2D方法,而不是使用我提供的Collider2D参数,它只是忽略了信息并思考了每次撞机都会触发玩家。有人知道解决该问题的方法吗?
答案 0 :(得分:1)
根据您发布的代码,我只是猜测您在播放器峰值碰撞脚本中犯了与以下相同的错误:
您无需检查碰撞是否确实发生在正确的对象类型上,因此两个脚本都将对任何对撞机触发器做出反应。
您应该Tag适当地放置您的对象,例如“ 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;
// ...
}