2014-09-08 6 views
1

Итак, моя цель - обнаружить, когда pacman ест гранулу, однако метод OnCollisionEnter2D никогда не вызывается. Я новичок в Unity, поэтому извините, если это простое исправление. Единственный «улов» в том, что все динамически генерируется, поэтому это может быть причиной проблемы.OnCollisionEnter2D никогда не назывался

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 (...) не вызывается?

+0

Возможно, этот ответ? http://stackoverflow.com/a/20567948/359157 – TyCobb

+0

Не похоже, извините. – Colton

+0

Удалил мой ответ, потому что преждевременно ответил. Позвольте мне спросить вас об этом: имеет ли ваш объект pacman жесткий компонент? – SirBraneDamuj

ответ

1

Для столкновений требуются коллайдеры или жесткие тела для обоих объектов, участвующих в столкновении.

К вашим гранулам можно добавить класс BoxCollider2D, CircleCollider2D или PolygonCollider2D. Для пеллет вам, вероятно, понадобится CircleCollider2D.

Например, попробуйте добавить этот код на свой цикл:

go.AddComponent<CircleCollider2D >(); 
+0

Да, я продолжал пробовать это, но Collider2D не было хорошо, тогда я понял, что говорит ошибка. Хитрость заключалась в использовании BoxCollider2D (или любого другого варианта, который может понадобиться). Collider2D бросил ошибки. – Colton

 Смежные вопросы

  • Нет связанных вопросов^_^