Могу ли я прикрепить к моему врагу два коллайдера, которые делают разные вещи, и если да, то как?

65
7

Можно ли иметь два коллайдера для одного объекта?

Моя ситуация такова, что у меня есть CircleCollider2D который заставляет моего врага преследовать игрока, когда он входит. Это хорошо работает, но я также хочу иметь BoxCollider2D который будет переключать сцену на мою сцену под названием "BattleScene", когда игрок входит.

Я хочу, чтобы когда мой игрок входил в круговой коллайдер, мой враг будет следовать за ним, но когда игрок приблизится и войдет в коробочный коллайдер (оба прикреплены к врагу), он переключит сцены на сцену, называемую "BattleScene".
Еще одна альтернатива, о которой я подумал, - это коллизия с твердым телом, но я не знаю, как это реализовать.

Вот мой код

private bool checkContact;
private bool checkTrigger;
public float MoveSpeed;
public Transform target;
public Animator anim;
public Rigidbody2D myRigidBody;
BoxCollider2D boxCollider;
public string levelToLoad;
// Start is called before the first frame update
void Start()
{
target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();//getting the position of our player

anim = GetComponent<Animator>();
myRigidBody = GetComponent<Rigidbody2D>();
boxCollider = gameObject.GetComponent<BoxCollider2D>();
}

// Update is called once per frame
void Update()
{
if (checkTrigger == true)
{

transform.position = Vector2.MoveTowards(transform.position, target.position, MoveSpeed * Time.deltaTime); //move towrds from your position to the position of the player
if (myRigidBody.position.y < target.position.y && Mathf.Abs(target.position.y - myRigidBody.position.y) > Mathf.Abs(target.position.x - myRigidBody.position.x)) //if it is further away from target in x direction than y direction the animation for moving in y is loaded and vice versa
{
anim.SetFloat("MoveY", 1);
anim.SetFloat("MoveX", 0);
}
if (myRigidBody.position.y > target.position.y && Mathf.Abs(target.position.y - myRigidBody.position.y) > Mathf.Abs(target.position.x - myRigidBody.position.x))
{
anim.SetFloat("MoveY", -1);
anim.SetFloat("MoveX", 0);
}
if (myRigidBody.position.x > target.position.x && Mathf.Abs(target.position.y - myRigidBody.position.y) < Mathf.Abs(target.position.x - myRigidBody.position.x))
{
anim.SetFloat("MoveX", -1);
anim.SetFloat("MoveY", 0);
}
if (myRigidBody.position.x < target.position.x && Mathf.Abs(target.position.y -myRigidBody.position.y) < Mathf.Abs(target.position.x - myRigidBody.position.x))
{
anim.SetFloat("MoveX", 1);
anim.SetFloat("MoveY", 0);
}

anim.SetBool("checkTrigger", checkTrigger); //updating if in range

}

}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.name == "Player")
{
checkTrigger = true; //setting our check trigger = true so it will follow if in radius
anim.SetBool("checkTrigger", checkTrigger);
}

}

public void OnTriggerExit2D(Collider2D other)
{
if (other.gameObject.name == "Player")
{
checkTrigger = false; //setting our check trigger = false so it will not follow if not in radius
anim.SetBool("checkTrigger", checkTrigger);
}

РЕДАКТИРОВАТЬ: ЭТА ПРОБЛЕМА БЫЛА РЕШЕНА

спросил(а) 2021-01-19T16:20:00+03:00 9 месяцев, 1 неделя назад
1
Решение
91

Лучший способ справиться с этим - иметь пустой GameObject с другим коллайдером, при этом убедитесь, что оба GameObject имеют Rigidbody - дочерний элемент с пометкой IsKinematic. Зачем? Потому что это отделит дочерний GameObject от родительской структуры столкновений. Узнайте больше о составных коллайдерах.

У вас должно быть только несколько коллайдеров в одном GameObject, если они все являются частью одной и той же структуры коллизий. Если у них разные цели, используйте разные объекты GameObject с кинематическими ригиделами, каждый из которых выполняет свою задачу.

В вашем конкретном сценарии я бы использовал CircleCollider в самом враге и BoxCollider в дочернем GameObject с кинематическим ригидным телом. Этот дочерний GameObject может также содержать скрипт с единственной целью проверки игрока и загрузки BattleScene.

ответил(а) 2021-01-19T16:20:00+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема