Не работает функция OnTriggerEnter2D и задержка в Unity2d

Всем привет. Я тут решил сделать 2d игру в Unity, но у меня проблема. Суть игры заключается в том, что нужно управлять персонажем и собирать монеты, которые должны появлятся в рандомных местах каждые две секунды, и должны пропадать когда персонаж прикоснулся к ним. Но проблема в том, что при прикосновении персонажа к монете событие OnTriggerEnter2D не срабатывает, а также не работает функция задержки "Thread.Sleep();". Когда я добавляю её в код и запускаю игру, Unity зависает, и не откликается никакие нажатия. Как устранить эти две проблемы с OnTriggerEnter2D и Thread.Sleep();

Код этого всего находится ниже:

GameController.cs(в котором находится код спавна монет каждые две секунды):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
using System.Threading.Tasks;

public class GameController : MonoBehaviour
{
    public GameObject coin;
    public static GameObject inst_obj;


    private void SpawnCoin()
    {
        int randY = Random.Range(5, -6);
        int randX = Random.Range(-3, 3);
        Vector3 spawnPosition = new Vector3(randX, randY);
        Quaternion spawnRotation = Quaternion.identity;
        inst_obj = Instantiate(coin, spawnPosition, spawnRotation) as GameObject;

    }
    private void FixedUpdate()
    {
        Thread.Sleep(2000);
        SpawnCoin();
    }
}

А вот скрипт Player.cs (в котором находится тот самый OnTriggerEnter2D):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Threading;
using System;
using System.Threading.Tasks;

public class Player : MonoBehaviour
{
    
    public FixedJoystick joystick;
    public float velocity = 1.0f;
    public float velocityRightLeft = 1.0f;
    private int coins1 = 0;
   
    //GameController gameController = new GameController();
    // Start is called before the first frame update
    void Start()
    {
         
    }

    // Update is called once per frame
    void FixedUpdate()
    {      
            gameObject.GetComponent<Rigidbody2D>().transform.position += new Vector3(joystick.Direction.x * velocityRightLeft * Time.fixedDeltaTime, joystick.Direction.y * velocity * Time.fixedDeltaTime, 0);
        
    }
    private  void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag.Equals("Coin"))
        {
            Destroy(GameController.inst_obj);
        }
    }



}

Ответы (1 шт):

Автор решения: Super3283u

Как минимум - во-первых, вы используете Thread.Sleep в Update... Он каждый кадр будет морозить приложение на 2 секунды. Во-вторых, Thread.Sleep вообще в Unity использовать не надо. Прочитайте про корутины.

https://docs.unity3d.com/Manual/Coroutines.html

https://forum.unity.com/threads/can-i-use-thread-sleep-milliseconds-instead-of-a-coroutine-to-pause-a-script.971031/

Или, если нужно совсем просто, пример из ссылки выше...

float timer = 0f;
 
void FixedUpdate () {
  timer += Time.deltaTime;
  if( timer > someAmount ) {
    // do something
  }
}
→ Ссылка