【问题标题】:OnCollisionEnter2D never calledOnCollisionEnter2D 从未调用过
【发布时间】:2014-09-08 22:40:18
【问题描述】:

所以我的目标是检测 pacman 何时吃掉一个颗粒,但是 OnCollisionEnter2D 方法永远不会被调用。我是 Unity 的新手,如果这是一个简单的修复,我很抱歉。唯一的“问题”是所有内容都是动态生成的,因此这可能是问题的原因。

public class World : MonoBehavior
{

    GameObject pacman;
    List<GameObject> pellets;

    // Use this for initialization
    void Start()
    {
         pellets = new List<GameObject>();
         pacman = new GameObject();
         pacman.AddComponent("PacmanController");
         pacman.AddComponent<SpriteRenderer>();
         pacman.GetComponent<PacmanController>().Setup(eastSprite, new Vector3((y - width / 2)*scale.x, -(x - height / 2) * scale.y, 0), new Vector3(2, 2, 0));
         pacman.AddComponent<Rigidbody2D>();
         pacman.GetComponent<Rigidbody2D>().gravityScale = 0;

         for(...)
         {
             GameObject go = new GameObject();
             go.transform.position = new Vector3((y - width / 2) * scale.x, -(x - height / 2) * scale.y, 0);
             go.AddComponent<SpriteRenderer>();                 
             go.GetComponent<SpriteRenderer>().sprite = pelletSprite;
             go.transform.localScale = new Vector3(2, 2, 0);
             go.name = "pellet";// +y + "," + x;

             pellets.Add(go);
         }
    }
}

pacman 类:

using UnityEngine;
using System.Collections;

public class PacmanController : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    bool aDown;
    bool wDown;
    bool dDown;
    bool sDown;
    void Update () {

        Vector3 scale = new Vector3(.4f, .4f, 0);
        if (Input.GetKeyDown(KeyCode.A)) aDown = true;
        else if (Input.GetKeyUp(KeyCode.A)) aDown = false;

        if (Input.GetKeyDown(KeyCode.W)) wDown = true;
        else if (Input.GetKeyUp(KeyCode.W)) wDown = false;

        if (Input.GetKeyDown(KeyCode.S)) sDown = true;
        else if (Input.GetKeyUp(KeyCode.S)) sDown = false;

        if (Input.GetKeyDown(KeyCode.D)) dDown = true;
        else if (Input.GetKeyUp(KeyCode.D)) dDown = false;

        Vector3 vel = new Vector3();

        if (dDown) vel = new Vector3(1, 0, 0);
        else if (aDown) vel = new Vector3(-1, 0, 0);
        else if (wDown) vel = new Vector3(0, 1, 0);
        else if (sDown) vel = new Vector3(0, -1, 0);

    this.transform.position += vel * Time.deltaTime;
}

public void Setup(Sprite sprite, Vector3 position, Vector3 scale)
{
    this.GetComponent<SpriteRenderer>().sprite = sprite;
    this.transform.position = position;
    this.transform.localScale = scale;
}

void OnCollisionEnter2D(Collision2D coll)
{
    Debug.Log("Collision Detected!");
    if (coll.gameObject.name == "pellet")
    {
        coll.gameObject.SetActive(false);
    }
}

}

知道为什么永远不会调用 OnCollisionEnter2D(...) 吗?

【问题讨论】:

  • 也许这个答案? stackoverflow.com/a/20567948/359157
  • 看起来不像,抱歉。
  • 删除了我的答案,因为我过早地回答了。请允许我问你这个问题:你的 pacman 对象有刚体组件吗?
  • 是的,您可以在代码的第一部分看到它添加到名为 pacman 的 GameObject 中。这足够了吗? pacman.AddComponent&lt;Rigidbody2D&gt;();
  • 哦,我想我现在明白了。你的弹丸也有对撞机吗?碰撞器只能与其他碰撞器发生碰撞。

标签: c# unity3d unity3d-2dtools


【解决方案1】:

碰撞需要碰撞体或刚体用于碰撞中涉及的两个对象。

您可以将 BoxCollider2D、CircleCollider2D 类或 PolygonCollider2D 组件添加到您的颗粒。对于颗粒,您可能需要 CircleCollider2D。

例如,尝试将此代码添加到您的 for 循环中:

go.AddComponent<CircleCollider2D >();

【讨论】:

  • 是的,我一直在尝试,但 Collider2D 不好,然后我意识到错误在说什么。诀窍是使用 BoxCollider2D(或任何可能需要的变体)。 Collider2D 抛出错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2017-08-27
相关资源
最近更新 更多