@OnyxRafe

Почему не работает OnTriggerEnter2d?

Я решил добавить скрипт не на сами объекты, а на другой объект, который является родителем этих объектов, но OnTriggerOnter2D не работает, я даже указывал в условии: если соприкасаются объекты с тегами, то происходит то-то.
Но скрипт работает если я добавляю его на сами объекты дочерние.
OntriggerEnter2D не может работать с посторонними объектами, а только с теми, которые имеют скрипт с этим самым триггерenter'ом?
И еще, почему-то, если нацепить скрипт на дочерние объекты, то при взаимодействии с заданным коллайдером игра зависает намертво, но ведь бесконечных циклов у меня нет.

Если что, вот сам код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CathingItems : MonoBehaviour
{
    PlayerMove moving;
  //  public GameObject box;

    public Image hp1;
    public Image hp2;
    public Image hp3;

    public GameObject box1;
    public GameObject box2;
    public GameObject box3;
    public GameObject box4;

    public int score = 0;
    int nightcore = 0;
    public Text coinvalue;
    public int hp = 3;
    public Text hpp;
    void Start()
    {
        //hpp = GetComponent<Text>();
        moving = GameObject.Find("BoxColl").GetComponent<PlayerMove>();
        hp = 3;  
    }
    void getScore()
    {
        coinvalue.text = score.ToString();
       
    }

    void hpCheck()
    {
        if (hp == 0)
        {
            hp1.enabled=false;
            hp2.enabled = false;
            hp3.enabled = false;

        }
        if (hp == 1)
        {
            hp1.enabled = true;
            hp2.enabled = false;
            hp3.enabled = false;
        }
        if (hp == 2)
        {
            hp1.enabled = true;
            hp2.enabled = true;
            hp3.enabled = false;
        }
        if (hp == 3)
        {
            hp1.enabled = true;
            hp2.enabled = true;
            hp3.enabled = true;
        }
    }

    void Update()
    {
        if (hp == 0) Debug.Log("Dead");
        nightcore = score;
        
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        while (true)
        {
            if (collision.gameObject.tag == "shirt" && box1)
            {
                if (score < 0) score = 0;
                score += 1;
                getScore();
                Debug.Log("hi");
            }
            else
            {
                score -= 1;
                if (score < 0) score = 0;
                getScore();
            }
            if (collision.gameObject.tag == "sock" && box2)
            {
                if (score < 0) score = 0;
                score += 1;
                getScore();
            }
            else
            {
                score -= 1;
                if (score < 0) score = 0;
                getScore();
            }
            if (collision.gameObject.tag == "jeans" && box3)
            {
                if (score < 0) score = 0;
                score += 1;
                getScore();
            }
            else
            {
                score -= 1;
                if (score < 0) score = 0;

                getScore();
            }
            if (collision.gameObject.tag == "cap" && box4)
            {
                if (score < 0) score = 0;
                score += 1;

                getScore();
            }
            else
            {
                score -= 1;
                if (score < 0) score = 0;

                getScore();
            }
            if (collision.gameObject.tag == "hpAbi" && gameObject.tag=="boxlayer")
            {
                if (hp >= 3) hp = 3;
                hp++;
                hpCheck();
                hpp.text = hp.ToString();

            }

            if (collision.gameObject.tag == "hpD" && gameObject.tag == "boxlayer")
            {
                if (hp <= 0) hp = 0;
                hp--;
                hpCheck();
                hpp.text = hp.ToString();
            }
           
            if (collision.gameObject.tag == "speedAbi" && gameObject.tag == "boxlayer")
            {
                moving.speed++;
                Debug.Log(moving.speed);
            }
           
            if (collision.gameObject.tag == "speedD" && gameObject.tag == "boxlayer")
            {
                moving.speed--;
                Debug.Log(moving.speed);
            }
            
        }
    }
}
  • Вопрос задан
  • 289 просмотров
Решения вопроса 2
DanceM
@DanceM Куратор тега Unity
Кто хочет -ищет способ, кто не хочет -ищет причину
while (true) <<< бесконечный цикл, без выхода. Это ваше зависание. Не знаю, зачем Вы так сделали.
Ответ написан
@OblivionGM
OnTriggerEnter2D (так же, как и 3D) проверяет касания лишь того объекта, на котором висит скрипт, в котором он реализован. Если объект, на котором висит скрипт, имеет "детей" - на них не распространяется проверка касаний к триггерам. А зависает намертво потому, что как уже выше отписали, у тебя бесконечный цикл идёт, и советую почитать материалы о цикле while, когда его стоит использовать и как он работает
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы