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

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

Моя ситуация такова, что у меня есть 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);
    }

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

1 Ответ

0 голосов
/ 01 января 2019

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

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

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

...