【问题标题】:How to switch sprites when a collision occurs?发生碰撞时如何切换精灵?
【发布时间】:2019-04-06 04:52:31
【问题描述】:

首先:我对编程完全陌生,这一定是一项简单的任务,所以我希望你能帮助我解决这个问题,同时我从你的近似中学习,这样也许我可以在我的初学者项目中解决未来的问题。

所以我试图让一个游戏对象在与另一个游戏对象发生碰撞时改变它的精灵。在代码中,您可以看到我使用公共属性制作了 CandleLit 和 CandleUnlit,因此我将相应的精灵拖到 Unity 的 Inspector 中各自的插槽中......这个想法是,当 CandleUnlit 对撞机用标签接触我的对象的对撞机时“Smallfire”它将 CandleUnlit 的精灵切换到 CandleLit 的精灵...我在控制台中没有错误,但发生碰撞时什么都没有发生,所以我知道这一定是一个非常愚蠢的问题,就我理解脚本的方式而言流...所以我希望有人可以帮助我找到我所缺少的或我做错了什么。在此先感谢我会在等待某人帮助的同时检查我的教程,因为我自己几个小时后无法弄清楚:(

public class CandleSpriteSwitch : MonoBehaviour
{
    public Sprite CandleLit;
    public Sprite CandleUnlit;

    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "SmallFire")
        {
            gameObject.GetComponent<SpriteRenderer>().sprite = CandleLit;
        }
        else
        {
            gameObject.GetComponent<SpriteRenderer>().sprite = CandleUnlit;
        }
    }
}

【问题讨论】:

  • 您是否尝试在OnCollisionEnter 中设置断点以查看是否输入过?您使用的是 2D 对撞机吗?如果是这样,请尝试改用OnCollisionEnter2D
  • 感谢您的回复。是的,我正在使用 2D 对撞机,但是当我添加 2D 时,整个“OnCollisionEnter2D”会改变颜色,所以我认为这不会按预期工作......所以告诉我 Alex 在这种情况下颜色的改变并不重要?或者我错过了一些让程序按预期解释该部分的东西?
  • 感谢您的宝贵时间,我真的很感激 :) 顺便说一下,我不明白您对断点部分的意思 :( 抱歉
  • 您还必须将Collision 参数转换为Collision2D。方法签名不同。
  • 添加一些断点,让我们知道代码是否曾经进入 OnCollisionEnter2D 内的 if/else 流。

标签: c# unity3d sprite


【解决方案1】:

正如@Zohaib Zaidi 在碰撞中提到的那样,必须至少有 1 个刚体才能正常工作。如果您有刚体并且 2 个碰撞器的大小已正确调整并且未设置为“is Trigger”。那么唯一的原因可能是在Layer Collision Matrix中,如果没问题,那么它没有理由不工作!

public class CandleSpriteSwitch : MonoBehaviour
{
    public Sprite candleLit;
    public Sprite candleUnlit;
    public SpriteRenderer render;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.transform.CompareTag("SmallFire"))
        {
            render.sprite = candleLit;
        }
        else
        {
            render.sprite = candleUnlit;
        }
    }
}

顺便说一句.. 声明名称变量时,始终使用小写字母作为第一个单词。一般来说,这不应该是一个问题,但它肯定会在以后造成困难。另外,您实际上可以在开始时而不是在发生碰撞时声明 Sprite Renderer。

【讨论】:

  • 谢谢尼古拉!!!从现在开始,我将使用小写字母作为第一个单词……我是程序员界的新手,我非常感谢这些提示。是的,你完全正确,问题是检查了“触发”...但是我这样做是希望记录一个对撞机在另一个对撞机上方而不会真正崩溃,因为我的角色拿着蜡烛所以蜡烛卡住了在我的角色通过时的对撞机中。我发现现在情况并非如此,但有没有办法让它成为可能,或者我必须找到另一个解决方案?
  • 当然感谢您的宝贵时间和帮助,我对学习非常感兴趣,但我想自学比我想象的要难得多。非常感谢您的帮助!!!
  • @RobAcuña 为此,您可以使用不同的图层并在图层碰撞矩阵中调整它们的检测。阅读有关 Layers herehere 的有关 Layer Collision Matrix 的信息。
  • 我不敢相信我错过了第二个链接中的信息......我猜它有很多信息可以快速消化。非常非常感谢您的帮助!!!
【解决方案2】:

你的一个游戏对象需要有一个 BoxCollider2D 和一个 Rigidbody2D。除非存在刚体 2d,否则不会发生碰撞。因此,在您的情况下,只需确保发生碰撞的 2 个游戏对象具有 Rigidbody2D 和 Collider2D

【讨论】:

  • 是的,两者都有 2Dcolliders 和 2Drigidbody,问题是“是触发器”被选中但我有这样的方式希望注册一个对撞机在另一个没有实际崩溃的情况下,因为我的角色拿着蜡烛所以当我的角色通过时,蜡烛卡在了对撞机中。我发现现在情况并非如此,但是有没有办法使它成为可能,或者我必须找到另一种解决方案?感谢您抽出宝贵时间提供帮助,我真的很感激!!!
猜你喜欢
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多