A GIF, который показывает столкновение несоответствия: http://imgur.com/QB4XOv0.gifне OnTriggerEnter2D называется последовательно
В моей игре Unity2D У меня есть рогатка (игрок) огневые мраморы вверх по стене (думает Puzzle Bobble типа головоломки шутер игра). Каждый из мраморов является клоном из сборных и каждого из сборных имеют Rigidbody с IsKinematic проверяются вместе с CircleCollider с OnTrigger проверяемого.
Когда мрамор сталкивается с двумя боковыми стенками, я использую OnTriggerEnter2D() и поворачиваем угол так, чтобы он отскакивал от стен под углом. Когда мрамор сталкивается с верхней стенкой, он в основном замерзает, и в этот момент я удаляю компонент rigidbody и устанавливаю «topObjects».
Несоответствия возникают, когда мрамор сталкивается с другим мрамором. Иногда вызывается функция триггера, иногда это не так. Триггеры кажутся случайными и непредсказуемыми.
Вот мой C# код для обнаружения столкновений и поведения, которые идут вместе с ним (прилагается к мрамору):
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class RockMove : MonoBehaviour
{
public float speed = 0.5f;
private Vector2 direction = new Vector2(0, 1);
// current angle
private float currentAngleZ;
// indendiary angle
private float angleB;
// rotation speed
private float rot;
// curving speed
private float rotMod;
// stops marble when collides with wall
private bool IsMoving = true;
void Start() {
}
void Update()
{
if (IsMoving) {
rot = RockSpawn.rot;
currentAngleZ = transform.eulerAngles.z;
rotMod = transform.position.x * -0.5f;
// moves it forward + adds speed
transform.Translate(direction * Time.deltaTime * speed, Space.Self);
// curving
transform.Rotate (0, 0, rotMod, Space.Self);
if (transform.position.x >= 0) {
// faster speed when near walls "gravity/magnetism"
speed += transform.position.x * 8 * Time.deltaTime;
}
if (transform.position.x < 0) {
// faster speed when near walls "gravity/magnetism"
speed += transform.position.x * -8 * Time.deltaTime;
}
}
else {
// when object is stationary
speed = 0;
}
}
void OnTriggerEnter2D(Collider2D collider){
// if collides with another marble
if (collider.gameObject.tag == "topObjects") {
// get rid of rigidbody
// can't have 2 rigidbodies when 2 objects collide
Destroy(rigidbody2D);
// freeze movement
IsMoving = false;
Debug.Log ("you collided with a marble");
// freeze rotation
this.transform.Rotate (0, 0, 0, Space.Self);
// assign the new tag
this.tag = "topObjects";
}
else if(collider.name == "TopWall")
{
Destroy(rigidbody2D);
IsMoving = false;
Debug.Log ("you broke the fourth wall!");
transform.Rotate (0, 0, 0);
this.tag = "topObjects";
}
else {
// bounce off walls
currentAngleZ = transform.eulerAngles.z;
angleB = 360 - (2 * currentAngleZ);
transform.Rotate (0, 0, angleB);
}
}
}
Update: Простое изменение функции Update() для FixedUpdate() похоже, делает триггер более последовательным, однако все еще существуют несоответствия в том, как они обнаружены.
Я тестировал rigidbody2d.velocity, transform.position и различные другие функции преобразования, но Transform.Translate дал наилучшие результаты, отскакивая от стен, хотя он просто теоретически просто телепортирует объект в новое место.
Снижение скорости также не влияет на консистенцию вообще и не меняет размер коллайдеров круга.
В моем опыте события столкновения и триггера более согласованы при использовании движения на основе физики, например, 'rigidbody.velocity'. – SirBraneDamuj
Я думаю, что проблема связана с вашими стенами. Ваш gif показывает только несогласованность столкновений, когда пузырь отскакивает от стены. Ваши стены настроены как триггеры или они просто обычные коллайдеры? – SirBraneDamuj
Стены устанавливаются как триггеры (полигонный коллайдер с проверкой IsTrigger) – BankBits