2015-11-11 1 views
1

Я пытаюсь получить персонаж игрока в двумерном прокрутке, чтобы игнорировать столкновения с конкретными объектами в массиве, когда он выполняет тире. Но моя первая попытка не работает. Нет ошибок, это просто не работает. Персонаж все еще сталкивается с конкретными объектами, пока он лишается.Я правильно использую GetComponents и IgnoreCollision?

private Collider2D col; 
public Collider2D[] dashMasks; 

void Awake() 
{ 
    col = GetComponent<BoxCollider2D>(); 
    dashMasks = GetComponents<Collider2D>(); 
} 

void Update() 
{ 
    if(dashing) 
    { 
     foreach(Collider2D mask in dashMasks) 
     { 
      Physics2D.IgnoreCollision(col, mask); 
     } 
    } 
} 

ли я сделать GetComponenets вызов неправильно или же я делаю IgnoreCollision неправильно, или, может быть, оба?

+0

Где находится 'dashing' и что происходит в' Update() ', когда это правда? Кажется, что все коллайдеры находятся в одном и том же gameObject. – user3071284

+0

Dashing является частью контроллера плеера, доступ к которому осуществляется из другого сценария. Я оставил эту полную функцию ради краткости. Когда тире верно, это означает, что игрок находится в лихорадочном состоянии, и все это работает. Первоначально у меня был игрок, игнорирующий столкновение, в то время как лихой просто отключив его коллайдер в то время как лихой, но это может привести к тому, что игрок упадет со сцены, поэтому мне нужно установить, чтобы он игнорировал столкновения только с определенными объектами, – user3776884

+0

OK. Вызывается ли 'Physics2D.IgnoreCollision'? Добавьте 'Physics2D.GetIgnoreCollision()' под этим вызовом и распечатайте его. – user3071284

ответ

-1

Я думаю, вы уже установили в редакторе dashMasks.
Итак, вы не должны снова устанавливать dashMasks в этот скрипт.

private Collider2D col; 
public Collider2D[] dashMasks; 

void Awake() 
{ 
    col = GetComponent<BoxCollider2D>(); 
    //dashMasks = GetComponents<Collider2D>(); // delete it. 
} 

void Update() 
{ 
    if(dashing) 
    { 
     foreach(Collider2D mask in dashMasks) 
     { 
      Physics2D.IgnoreCollision(col, mask); 
     } 
    } 

}

+0

Это ничего не меняет. Правильные коллайдеры обнаруживаются в инспекторе, когда я назначаю игровые объекты массиву – user3776884

+0

. Я опубликовал другой ответ. Вы можете проверить это. –

0

OK. Я проверил вашу ситуацию, и теперь она работает. Версия Unity 5.1.2f Personal. Screenshot of the editor. Cube has 'PlayerController', Rigidbody2D, and BoxCollider2D.

Вот код. Если вы нажмете пробел, вы можете передать блок спрайт. Если не нажать, конечно, вы не сможете пройти.

public class PlayerController : MonoBehaviour { 

float speed = 5; 
bool dashing = false; 
BoxCollider2D coll; 
BoxCollider2D blockColl; 

void Awake() { 
    coll = this.transform.GetComponent<BoxCollider2D>(); 
    blockColl = GameObject.Find ("Block").GetComponent<BoxCollider2D>(); 
} 

void Update() 
{ 
    dashing = Input.GetKey (KeyCode.Space); 
    Physics2D.IgnoreCollision (coll, blockColl, dashing); 
} 

void FixedUpdate() 
{ 
    float dirX = Input.GetAxis ("Horizontal"); 
    float dirY = Input.GetAxis ("Vertical"); 

    Vector3 movement = new Vector2 (dirX, dirY); 

    GetComponent<Rigidbody2D>().velocity = movement * speed; 
} 
} 
Смежные вопросы