2015-02-13 7 views
1

У меня проблема с моей 2D-игрой в единстве (стиль покемона), я использую transform.position для перемещения игровых объектов.Избегайте перетаскивания между жестким корпусом

У меня есть игрок и враги, которые следуют за ним, все в порядке. Но когда враги совершают столкновение, они начинают толкать друг друга

Мне нужно, чтобы никто не толкнул, когда враги и игрок столкнулись с столкновением.

  • Я попытался использовать кинематику у врагов, но игрок может их протолкнуть.
  • Я попытался добавить большое количество массы игроку, но он может подтолкнуть врагов.
  • Я попытался обнаружить столкновение в коде с OnCollision, но когда я отменяю движение врага, они не возвращаются, чтобы двигаться.

---- UPDATE ----

мне нужно столкновение, но не выдвигая между ними, вот видео, чтобы проиллюстрировать эту проблему https://www.youtube.com/watch?v=VkgnV1NOxlw

Просто для записи, я» m, используя скрипт A * pathfinding (http://arongranberg.com/astar/), здесь мои враги перемещают скрипт.

void FixedUpdate() { 
    if(path == null) 
     return; 

    if(currentWayPoint >= path.vectorPath.Count) 
     return; 

    Vector3 wayPoint = path.vectorPath [currentWayPoint]; 
    wayPoint.z = transform.position.z; 

    transform.position = Vector3.MoveTowards (transform.position, wayPoint, Time.deltaTime * speed); 

    float distance = Vector3.Distance (transform.position, wayPoint); 

    if(distance == 0){ 
     currentWayPoint++; 
    } 

} 

---- UPDATE ----

Наконец я получить ожидаемый результат, изменение rigidbody2D.isKinematic свойство верно, когда цель была близка, и остановить его

Здесь это видео https://www.youtube.com/watch?v=0Zm0idUU75s

И код движения противника

void FixedUpdate() { 

    if(path == null) 
     return; 

    if(currentWayPoint >= path.vectorPath.Count) 
     return; 

    float distanceTarget = Vector3.Distance (transform.position, target.position); 

    if (distanceTarget <= 1.5f) { 
     rigidbody2D.isKinematic = true; 
     return; 
    }else{ 
     rigidbody2D.isKinematic = false; 
    } 

    Vector3 wayPoint = path.vectorPath [currentWayPoint]; 
    wayPoint.z = transform.position.z; 

    transform.position = Vector3.MoveTowards (transform.position, wayPoint, Time.deltaTime * speed); 

    float distance = Vector3.Distance (transform.position, wayPoint); 

    if(distance == 0){ 
     currentWayPoint++; 
    } 

} 
+1

Не могли бы вы показать нам, что вы сделали? Пожалуйста, покажите нам код и изображение сцены, если это возможно. –

+0

@Bobthezealot похоже, что он ищет способ избежать столкновения. – Dinal24

ответ

3

Вы можете сделать это несколькими способами,

Вы можете использовать Physics2D.IgnoreCollision

Physics2D.IgnoreCollision(someGameObject.collider2D, collider2D); 
  • Убедитесь, что вы делаете IgnoreCollision вызов до возникновения столкновений, может быть, когда объекты экземпляра.

или в качестве альтернативы вы можете использовать, Layer Collision Matrix

enter image description here

  • Unity Manual предоставляет информацию об использовании этого. Это просто предотвращает столкновение, назначая разные GameObjects различным слоям. Попробуйте: Edit->Project Settings->Physics

Или, если вы хотите, чтобы просто остановить перемещение, Вы можете легко сделать это нравится,

bool isCollided = false; 

// when when OnCollisionEnter() is called stop moving. 
//maybe write your move script like 

void Move() { 
    if(!isCollided) { 
     // move logic 
    } 
} 
+0

Спасибо за ваш ответ, но я не пытаюсь избежать столкновений, мне нужно столкновение, но без нажатия между объектами (посмотрите вопрос на вопрос) –

+0

@ LuisCruz Не нажатие означает, что вы хотите, чтобы оба объекта остановились? или что? – Dinal24

+0

Да, я хочу, чтобы оба объекта остановились, когда они получили столкновение –